Merge "Add BondInterfaceOvsOptions parameter to net-config-bond.yaml"
[apex-tripleo-heat-templates.git] / overcloud.yaml
index 8ff913e..476e82e 100644 (file)
@@ -13,7 +13,6 @@ parameters:
 
   # Common parameters (not specific to a role)
   AdminPassword:
-    default: unset
     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
     type: string
     hidden: true
@@ -22,12 +21,10 @@ parameters:
     description: The ceilometer backend type.
     type: string
   CeilometerMeteringSecret:
-    default: unset
     description: Secret shared by the ceilometer services.
     type: string
     hidden: true
   CeilometerPassword:
-    default: unset
     description: The password for the ceilometer service account.
     type: string
     hidden: true
@@ -68,13 +65,17 @@ parameters:
     description: Whether to enable or not the Rbd backend for Cinder
     type: boolean
   CloudName:
-    default: ''
+    default: overcloud
     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
     type: string
   ControlFixedIPs:
     default: []
     description: Should be used for arbitrary ips.
     type: json
+  CorosyncIPv6:
+    default: false
+    description: Enable IPv6 in Corosync
+    type: boolean
   Debug:
     default: ''
     description: Set to True to enable debugging on all services.
@@ -91,9 +92,15 @@ parameters:
     default: 'REBUILD_PRESERVE_EPHEMERAL'
     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
     type: string
+  InternalApiVirtualFixedIPs:
+    default: []
+    description: >
+        Control the IP allocation for the InternalApiVirtualInterface port. E.g.
+        [{'ip_address':'1.2.3.4'}]
+    type: json
   KeyName:
     default: default
-    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
+    description: Name of an existing Nova key pair to enable SSH access to the instances
     type: string
     constraints:
       - custom_constraint: nova.keypair
@@ -109,7 +116,7 @@ parameters:
       to create provider networks (and we use this for the default floating
       network) - if changing this either use different post-install network
       scripts or be sure to keep 'datacentre' as a mapping network name.
-    type: string
+    type: comma_delimited_list
     default: "datacentre:br-ex"
   NeutronControlPlaneID:
     default: 'ctlplane'
@@ -128,17 +135,16 @@ parameters:
         Enable/disable the L2 population feature in the Neutron agents.
     default: "False"
   NeutronFlatNetworks:
-    type: string
+    type: comma_delimited_list
     default: 'datacentre'
     description: >
       If set, flat networks to configure in neutron plugins. Defaults to
       'datacentre' to permit external network creation.
   NeutronNetworkType:
     default: 'vxlan'
-    description: The tenant network type for Neutron, either gre or vxlan.
-    type: string
+    description: The tenant network type for Neutron.
+    type: comma_delimited_list
   NeutronPassword:
-    default: unset
     description: The password for the neutron service account, used by neutron agents.
     type: string
     hidden: true
@@ -169,27 +175,34 @@ parameters:
     description: Whether to configure Neutron Distributed Virtual Routers
     type: string
   NeutronMetadataProxySharedSecret:
-    default: 'unset'
     description: Shared secret to prevent spoofing
     type: string
     hidden: true
+  NeutronTenantMtu:
+    description: >
+      The default MTU for tenant networks. For VXLAN/GRE tunneling, this should
+      be at least 50 bytes smaller than the MTU on the physical network. This
+      value will be used to set the MTU on the virtual Ethernet device.
+      This value will be used to construct the NeutronDnsmasqOptions, since that
+      will determine the MTU that is assigned to the VM host through DHCP.
+    default: "1400"
+    type: string
   NeutronTunnelTypes:
     default: 'vxlan'
     description: |
-        The tunnel types for the Neutron tenant network. To specify multiple
-        values, use a comma separated string, like so: 'gre,vxlan'
-    type: string
+        The tunnel types for the Neutron tenant network.
+    type: comma_delimited_list
   NeutronTunnelIdRanges:
     description: |
         Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
         of GRE tunnel IDs that are available for tenant network allocation
-    default: ["1:1000", ]
+    default: ["1:4094", ]
     type: comma_delimited_list
   NeutronVniRanges:
     description: |
         Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
         of VXLAN VNI IDs that are available for tenant network allocation
-    default: ["1:1000", ]
+    default: ["1:4094", ]
     type: comma_delimited_list
   NeutronCorePlugin:
     default: 'ml2'
@@ -198,7 +211,7 @@ parameters:
         from neutron.core_plugins namespace.
     type: string
   NeutronServicePlugins:
-    default: "router"
+    default: "router,qos"
     description: |
         Comma-separated list of service plugin entrypoints to be loaded from the
         neutron.service_plugins namespace.
@@ -211,9 +224,18 @@ parameters:
   NeutronMechanismDrivers:
     default: 'openvswitch'
     description: |
-        The mechanism drivers for the Neutron tenant network. To specify multiple
-        values, use a comma separated string, like so: 'openvswitch,l2_population'
-    type: string
+        The mechanism drivers for the Neutron tenant network.
+    type: comma_delimited_list
+  NeutronPluginExtensions:
+    default: "qos,port_security"
+    description: |
+        Comma-separated list of extensions enabled for the Neutron plugin.
+    type: comma_delimited_list
+  NeutronAgentExtensions:
+    default: "qos"
+    description: |
+        Comma-separated list of extensions enabled for the Neutron agents.
+    type: comma_delimited_list
   NeutronAllowL3AgentFailover:
     default: 'False'
     description: Allow automatic l3-agent failover
@@ -226,8 +248,11 @@ parameters:
     type: number
     default: 1
     description: The number of neutron dhcp agents to schedule per network
+  NovaIPv6:
+    default: false
+    description: Enable IPv6 features in Nova
+    type: boolean
   NovaPassword:
-    default: unset
     description: The password for the nova service account, used by nova-api.
     type: string
     hidden: true
@@ -239,6 +264,10 @@ parameters:
     default: false
     description: Should MongoDb journaling be disabled
     type: boolean
+  MongoDbIPv6:
+    default: false
+    description: Enable IPv6 if MongoDB VIP is IPv6
+    type: boolean
   PublicVirtualFixedIPs:
     default: []
     description: >
@@ -249,13 +278,11 @@ parameters:
     type: string
     default: unset
     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
-  # FIXME: 'guest' is provisioned in RabbitMQ by default, we should create a user if these are changed
   RabbitUserName:
     default: guest
     description: The username for RabbitMQ
     type: string
   RabbitPassword:
-    default: guest
     description: The password for RabbitMQ
     type: string
     hidden: true
@@ -274,15 +301,38 @@ parameters:
     default: 16384
     description: Configures RabbitMQ FD limit
     type: string
+  RabbitIPv6:
+    default: false
+    description: Enable IPv6 in RabbitMQ
+    type: boolean
+  RedisPassword:
+    description: The password for Redis
+    type: string
+    hidden: true
   SnmpdReadonlyUserName:
     default: ro_snmp_user
     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
     type: string
   SnmpdReadonlyUserPassword:
-    default: unset
     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
     type: string
     hidden: true
+  StorageVirtualFixedIPs:
+    default: []
+    description: >
+        Control the IP allocation for the StorageVirtualInterface port. E.g.
+        [{'ip_address':'1.2.3.4'}]
+    type: json
+  StorageMgmtVirtualFixedIPs:
+    default: []
+    description: >
+        Control the IP allocation for the StorageMgmgVirtualInterface port. E.g.
+        [{'ip_address':'1.2.3.4'}]
+    type: json
+  TimeZone:
+    default: 'UTC'
+    description: The timezone to be set on nodes.
+    type: string
   CloudDomain:
     default: 'localdomain'
     type: string
@@ -298,12 +348,11 @@ parameters:
 
   # Controller-specific params
   AdminToken:
-    default: unset
     description: The keystone auth secret.
     type: string
     hidden: true
   CinderLVMLoopDeviceSize:
-    default: 5000
+    default: 10280
     description: The size of the loopback file used by the cinder LVM driver.
     type: number
   CinderNfsMountOptions:
@@ -319,12 +368,11 @@ parameters:
       CinderEnableNfsBackend is true.
     type: comma_delimited_list
   CinderPassword:
-    default: unset
     description: The password for the cinder service account, used by cinder-api.
     type: string
     hidden: true
   CinderISCSIHelper:
-    default: tgtadm
+    default: lioadm
     description: The iSCSI helper to use with cinder.
     type: string
   ControllerCount:
@@ -340,11 +388,12 @@ parameters:
     type: json
   controllerImage:
     type: string
-    default: overcloud-control
+    default: overcloud-full
     constraints:
       - custom_constraint: glance.image
   OvercloudControlFlavor:
     description: Flavor for control nodes to request when deploying.
+    default: baremetal
     type: string
     constraints:
       - custom_constraint: nova.flavor
@@ -368,6 +417,10 @@ parameters:
     default: true
     description: Whether to enable Swift Storage on the Controller
     type: boolean
+  ControllerSchedulerHints:
+    type: json
+    description: Optional scheduler hints to pass to nova
+    default: {}
   ExtraConfig:
     default: {}
     description: |
@@ -416,7 +469,6 @@ parameters:
     type: string
     default: noop
   GlancePassword:
-    default: unset
     description: The password for the glance service account, used by the glance services.
     type: string
     hidden: true
@@ -428,14 +480,12 @@ parameters:
     constraints:
     - allowed_values: ['swift', 'file', 'rbd']
   HeatPassword:
-    default: unset
     description: The password for the Heat service account, used by the Heat services.
     type: string
     hidden: true
   HeatStackDomainAdminPassword:
-    description: Password for heat_domain_admin user.
+    description: Password for heat_stack_domain_admin user.
     type: string
-    default: ''
     hidden: true
   InstanceNameTemplate:
     default: 'instance-%08x'
@@ -493,8 +543,11 @@ parameters:
     type: number
     default: 4096
   NeutronDnsmasqOptions:
-    default: 'dhcp-option-force=26,1400'
-    description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
+    default: 'dhcp-option-force=26,%MTU%'
+    description: >
+      Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU
+      to be set to the value of NeutronTenantMtu, which should be set to account
+      for tunnel overhead.
     type: string
   NeutronPublicInterfaceDefaultRoute:
     default: ''
@@ -515,12 +568,10 @@ parameters:
         This should be int_public when a VLAN is being used.
     type: string
   SwiftHashSuffix:
-    default: unset
     description: A random string to be used as a salt when hashing to determine mappings in the ring.
     type: string
     hidden: true
   SwiftPassword:
-    default: unset
     description: The password for the swift service account, used by the swift proxy services.
     type: string
     hidden: true
@@ -540,6 +591,10 @@ parameters:
     type: number
     default: 3
     description: How many replicas to use in the swift rings.
+  SaharaPassword:
+    description: The password for the sahara service account.
+    type: string
+    hidden: true
 
 # Compute-specific params
   CeilometerComputeAgent:
@@ -563,7 +618,7 @@ parameters:
     description: What interface to add to the HypervisorNeutronPhysicalBridge.
     type: string
   NeutronNetworkVLANRanges:
-    default: 'datacentre'
+    default: 'datacentre:1:1000'
     description: >
       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
       Neutron documentation for permitted values. Defaults to permitting any
@@ -579,19 +634,23 @@ parameters:
       structure as ExtraConfig.
     type: json
   NovaComputeLibvirtType:
-    default: ''
+    default: kvm
     type: string
   NovaComputeLibvirtVifDriver:
     default: ''
     description: Libvirt VIF driver configuration for the network
     type: string
+  NovaComputeSchedulerHints:
+    type: json
+    description: Optional scheduler hints to pass to nova
+    default: {}
   NovaEnableRbdBackend:
     default: false
     description: Whether to enable or not the Rbd backend for Nova
     type: boolean
   NovaImage:
     type: string
-    default: overcloud-compute
+    default: overcloud-full
     constraints:
       - custom_constraint: glance.image
   NovaOVSBridge:
@@ -604,6 +663,7 @@ parameters:
     type: string
   OvercloudComputeFlavor:
     description: Use this flavor
+    default: baremetal
     type: string
     constraints:
       - custom_constraint: nova.flavor
@@ -625,6 +685,7 @@ parameters:
       NovaVncProxyNetwork: internal_api
       SwiftMgmtNetwork: storage_mgmt
       SwiftProxyNetwork: storage
+      SaharaApiNetwork: internal_api
       HorizonNetwork: internal_api
       MemcachedNetwork: internal_api
       RabbitMqNetwork: internal_api
@@ -646,10 +707,11 @@ parameters:
     type: number
     default: 0
   BlockStorageImage:
-    default: overcloud-cinder-volume
+    default: overcloud-full
     type: string
   OvercloudBlockStorageFlavor:
     description: Flavor for block storage nodes to request when deploying.
+    default: baremetal
     type: string
     constraints:
       - custom_constraint: nova.flavor
@@ -659,6 +721,11 @@ parameters:
       BlockStorage specific configuration to inject into the cluster. Same
       structure as ExtraConfig.
     type: json
+  BlockStorageSchedulerHints:
+    type: json
+    description: Optional scheduler hints to pass to nova
+    default: {}
+
 
 # Object storage specific parameters
   ObjectStorageCount:
@@ -666,11 +733,12 @@ parameters:
     default: 0
   OvercloudSwiftStorageFlavor:
     description: Flavor for Swift storage nodes to request when deploying.
+    default: baremetal
     type: string
     constraints:
       - custom_constraint: nova.flavor
   SwiftStorageImage:
-    default: overcloud-swift-storage
+    default: overcloud-full
     type: string
   ObjectStorageExtraConfig:
     default: {}
@@ -678,14 +746,17 @@ parameters:
       ObjectStorage specific configuration to inject into the cluster. Same
       structure as ExtraConfig.
     type: json
-
+  ObjectStorageSchedulerHints:
+    type: json
+    description: Optional scheduler hints to pass to nova
+    default: {}
 
 # Ceph storage specific parameters
   CephStorageCount:
     type: number
     default: 0
   CephStorageImage:
-    default: overcloud-ceph-storage
+    default: overcloud-full
     type: string
   OvercloudCephStorageFlavor:
     default: baremetal
@@ -699,6 +770,11 @@ parameters:
       CephStorage specific configuration to inject into the cluster. Same
       structure as ExtraConfig.
     type: json
+  CephStorageSchedulerHints:
+    type: json
+    description: Optional scheduler hints to pass to nova
+    default: {}
+
 
   # Hostname format for each role
   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
@@ -793,18 +869,18 @@ resources:
     type: OS::TripleO::EndpointMap
     properties:
       CloudName: {get_param: CloudName}
-      CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
-      CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
-      GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
-      GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
-      HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
-      KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
-      KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
-      MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
-      NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
-      NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
-      SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
-      PublicVirtualIP: {get_attr: [VipMap, net_ip_map, external]}
+      CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
+      CinderApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
+      GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
+      HeatApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
+      KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
+      KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
+      MysqlVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
+      NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
+      NovaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
+      SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
+      SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
+      PublicVirtualIP: {get_attr: [VipMap, net_ip_uri_map, external]}
 
   Controller:
     type: OS::Heat::ResourceGroup
@@ -828,10 +904,10 @@ resources:
           CinderEnableNfsBackend: {get_param: CinderEnableNfsBackend}
           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
-          CloudName: {get_param: CloudName}
           CloudDomain: {get_param: CloudDomain}
           ControlVirtualInterface: {get_param: ControlVirtualInterface}
           ControllerExtraConfig: {get_param: controllerExtraConfig}
+          CorosyncIPv6: {get_param: CorosyncIPv6}
           Debug: {get_param: Debug}
           EnableFencing: {get_param: EnableFencing}
           ManageFirewall: {get_param: ManageFirewall}
@@ -870,6 +946,7 @@ resources:
           NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
+          NeutronTenantMtu: {get_param: NeutronTenantMtu}
           NeutronExternalNetworkBridge: {get_param: NeutronExternalNetworkBridge}
           NeutronEnableIsolatedMetadata: {get_param: NeutronEnableIsolatedMetadata}
           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
@@ -879,7 +956,11 @@ resources:
           NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
           NeutronPassword: {get_param: NeutronPassword}
-          NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
+          NeutronDnsmasqOptions:
+            str_replace:
+              template: {get_param: NeutronDnsmasqOptions}
+              params:
+                '%MTU%': {get_param: NeutronTenantMtu}
           NeutronDVR: {get_param: NeutronDVR}
           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
           NeutronAgentMode: {get_param: NeutronAgentMode}
@@ -887,14 +968,18 @@ resources:
           NeutronServicePlugins: {get_param: NeutronServicePlugins}
           NeutronTypeDrivers: {get_param: NeutronTypeDrivers}
           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
+          NeutronPluginExtensions: {get_param: NeutronPluginExtensions}
+          NeutronAgentExtensions: {get_param: NeutronAgentExtensions}
           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
           NeutronL3HA: {get_param: NeutronL3HA}
           NeutronDhcpAgentsPerNetwork: {get_param: NeutronDhcpAgentsPerNetwork}
           NeutronNetworkType: {get_param: NeutronNetworkType}
           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
+          NovaIPv6: {get_param: NovaIPv6}
           NovaPassword: {get_param: NovaPassword}
           NtpServer: {get_param: NtpServer}
           MongoDbNoJournal: {get_param: MongoDbNoJournal}
+          MongoDbIPv6: {get_param: MongoDbIPv6}
           PcsdPassword: {get_resource: PcsdPassword}
           PublicVirtualInterface: {get_param: PublicVirtualInterface}
           RabbitPassword: {get_param: RabbitPassword}
@@ -903,15 +988,20 @@ resources:
           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
           RabbitClientPort: {get_param: RabbitClientPort}
           RabbitFDLimit: {get_param: RabbitFDLimit}
+          RabbitIPv6: {get_param: RabbitIPv6}
+          RedisPassword: {get_param: RedisPassword}
+          SaharaPassword: {get_param: SaharaPassword}
           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
+          RedisVirtualIPUri: {get_attr: [RedisVirtualIP, ip_address_uri]}
           SwiftHashSuffix: {get_param: SwiftHashSuffix}
           SwiftMountCheck: {get_param: SwiftMountCheck}
           SwiftMinPartHours: {get_param: SwiftMinPartHours}
           SwiftPartPower: {get_param: SwiftPartPower}
           SwiftPassword: {get_param: SwiftPassword}
           SwiftReplicas: { get_param: SwiftReplicas}
+          TimeZone: {get_param: TimeZone}
           VirtualIP: {get_attr: [VipMap, net_ip_map, ctlplane]} # deprecated. Use per service VIP settings instead now.
           PublicVirtualIP: {get_attr: [VipMap, net_ip_map, external]}
           ServiceNetMap: {get_param: ServiceNetMap}
@@ -919,15 +1009,18 @@ resources:
           CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
           CinderApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
+          HeatApiVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
           GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
           NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
           SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
+          MysqlVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
           KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
           NovaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
+          SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
           UpdateIdentifier: {get_param: UpdateIdentifier}
           Hostname:
             str_replace:
@@ -936,6 +1029,7 @@ resources:
                 '%stackname%': {get_param: 'OS::stack_name'}
           NodeIndex: '%index%'
           ServerMetadata: {get_param: ServerMetadata}
+          SchedulerHints: {get_param: ControllerSchedulerHints}
 
   Compute:
     type: OS::Heat::ResourceGroup
@@ -962,6 +1056,7 @@ resources:
           KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
+          NeutronTenantMtu: {get_param: NeutronTenantMtu}
           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
           NeutronEnableL2Pop : {get_param: NeutronEnableL2Pop}
           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
@@ -980,6 +1075,7 @@ resources:
           NeutronServicePlugins: {get_param: NeutronServicePlugins}
           NeutronTypeDrivers: {get_param: NeutronTypeDrivers}
           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
+          NeutronAgentExtensions: {get_param: NeutronAgentExtensions}
           # L3 HA and Failover is not relevant for Computes, should be removed
           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
           NeutronL3HA: {get_param: NeutronL3HA}
@@ -989,6 +1085,7 @@ resources:
           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
           NovaComputeLibvirtVifDriver: {get_param: NovaComputeLibvirtVifDriver}
           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
+          NovaIPv6: {get_param: NovaIPv6}
           NovaPublicIP: {get_attr: [VipMap, net_ip_map, external]}
           NovaPassword: {get_param: NovaPassword}
           NovaOVSBridge: {get_param: NovaOVSBridge}
@@ -1002,6 +1099,7 @@ resources:
           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
           ServiceNetMap: {get_param: ServiceNetMap}
+          TimeZone: {get_param: TimeZone}
           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
           UpdateIdentifier: {get_param: UpdateIdentifier}
           Hostname:
@@ -1011,6 +1109,8 @@ resources:
                 '%stackname%': {get_param: 'OS::stack_name'}
           CloudDomain: {get_param: CloudDomain}
           ServerMetadata: {get_param: ServerMetadata}
+          SchedulerHints: {get_param: NovaComputeSchedulerHints}
+          NodeIndex: '%index%'
 
   BlockStorage:
     type: OS::Heat::ResourceGroup
@@ -1036,6 +1136,7 @@ resources:
           RabbitUserName: {get_param: RabbitUserName}
           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
           RabbitClientPort: {get_param: RabbitClientPort}
+          TimeZone: {get_param: TimeZone}
           NtpServer: {get_param: NtpServer}
           UpdateIdentifier: {get_param: UpdateIdentifier}
           Hostname:
@@ -1045,11 +1146,13 @@ resources:
                 '%stackname%': {get_param: 'OS::stack_name'}
           ServiceNetMap: {get_param: ServiceNetMap}
           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
-          MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
+          MysqlVirtualIPUri: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
           ExtraConfig: {get_param: ExtraConfig}
           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
           CloudDomain: {get_param: CloudDomain}
           ServerMetadata: {get_param: ServerMetadata}
+          SchedulerHints: {get_param: BlockStorageSchedulerHints}
+          NodeIndex: '%index%'
 
   ObjectStorage:
     type: OS::Heat::ResourceGroup
@@ -1068,6 +1171,7 @@ resources:
           PartPower: {get_param: SwiftPartPower}
           Image: {get_param: SwiftStorageImage}
           Replicas: { get_param: SwiftReplicas}
+          TimeZone: {get_param: TimeZone}
           NtpServer: {get_param: NtpServer}
           UpdateIdentifier: {get_param: UpdateIdentifier}
           ServiceNetMap: {get_param: ServiceNetMap}
@@ -1080,6 +1184,8 @@ resources:
           ObjectStorageExtraConfig: {get_param: ObjectStorageExtraConfig}
           CloudDomain: {get_param: CloudDomain}
           ServerMetadata: {get_param: ServerMetadata}
+          SchedulerHints: {get_param: ObjectStorageSchedulerHints}
+          NodeIndex: '%index%'
 
   CephStorage:
     type: OS::Heat::ResourceGroup
@@ -1095,6 +1201,7 @@ resources:
           Flavor: {get_param: OvercloudCephStorageFlavor}
           NtpServer: {get_param: NtpServer}
           ServiceNetMap: {get_param: ServiceNetMap}
+          TimeZone: {get_param: TimeZone}
           UpdateIdentifier: {get_param: UpdateIdentifier}
           Hostname:
             str_replace:
@@ -1105,6 +1212,8 @@ resources:
           CephStorageExtraConfig: {get_param: CephStorageExtraConfig}
           CloudDomain: {get_param: CloudDomain}
           ServerMetadata: {get_param: ServerMetadata}
+          SchedulerHints: {get_param: CephStorageSchedulerHints}
+          NodeIndex: '%index%'
 
   ControllerIpListMap:
     type: OS::TripleO::Network::Ports::NetIpListMap
@@ -1115,6 +1224,7 @@ resources:
       StorageIpList: {get_attr: [Controller, storage_ip_address]}
       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
+      ManagementIpList: {get_attr: [Controller, management_ip_address]}
 
   allNodesConfig:
     type: OS::TripleO::AllNodes::SoftwareConfig
@@ -1143,6 +1253,9 @@ resources:
       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
+      sahara_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
+      DeployIdentifier: {get_param: DeployIdentifier}
+      UpdateIdentifier: {get_param: UpdateIdentifier}
 
   MysqlRootPassword:
     type: OS::Heat::RandomString
@@ -1175,17 +1288,18 @@ resources:
 
   RedisVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::RedisVipPort
+    type: OS::TripleO::Network::Ports::RedisVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
       PortName: redis_virtual_ip
       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
+      ServiceName: redis
 
   # The public VIP is on the External net, falls back to ctlplane
   PublicVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::ExternalPort
+    type: OS::TripleO::Network::Ports::ExternalVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
@@ -1194,34 +1308,41 @@ resources:
 
   InternalApiVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::InternalApiPort
+    type: OS::TripleO::Network::Ports::InternalApiVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       PortName: internal_api_virtual_ip
+      FixedIPs: {get_param: InternalApiVirtualFixedIPs}
 
   StorageVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::StoragePort
+    type: OS::TripleO::Network::Ports::StorageVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       PortName: storage_virtual_ip
+      FixedIPs: {get_param: StorageVirtualFixedIPs}
 
   StorageMgmtVirtualIP:
     depends_on: Networks
-    type: OS::TripleO::Controller::Ports::StorageMgmtPort
+    type: OS::TripleO::Network::Ports::StorageMgmtVipPort
     properties:
       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       PortName: storage_management_virtual_ip
+      FixedIPs: {get_param: StorageMgmtVirtualFixedIPs}
 
   VipMap:
     type: OS::TripleO::Network::Ports::NetVipMap
     properties:
       ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
+      ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
+      InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
+      StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
-      # No tenant VIP required
+      StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
+      # No tenant or management VIP required
 
   VipConfig:
     type: OS::TripleO::VipConfig
@@ -1253,6 +1374,7 @@ resources:
         control_virtual_ip: {get_attr: [VipMap, net_ip_map, ctlplane]}
         public_virtual_ip: {get_attr: [VipMap, net_ip_map, external]}
         internal_api_virtual_ip: {get_attr: [VipMap, net_ip_map, internal_api]}
+        sahara_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
         storage_virtual_ip: {get_attr: [VipMap, net_ip_map, storage]}
         storage_mgmt_virtual_ip: {get_attr: [VipMap, net_ip_map, storage_mgmt]}
 
@@ -1434,10 +1556,29 @@ resources:
       config: {get_resource: AllNodesValidationConfig}
       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
 
+  UpdateWorkflow:
+    type: OS::TripleO::Tasks::UpdateWorkflow
+    properties:
+      controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
+      compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
+      blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
+      objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
+      cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
+      input_values:
+        deploy_identifier: {get_param: DeployIdentifier}
+        update_identifier: {get_param: UpdateIdentifier}
+
   # Optional ExtraConfig for all nodes - all roles are passed in here, but
   # the nested template may configure each role differently (or not at all)
   AllNodesExtraConfig:
     type: OS::TripleO::AllNodesExtraConfig
+    depends_on:
+      - UpdateWorkflow
+      - ComputeAllNodesValidationDeployment
+      - BlockStorageAllNodesValidationDeployment
+      - ObjectStorageAllNodesValidationDeployment
+      - CephStorageAllNodesValidationDeployment
+      - ControllerAllNodesValidationDeployment
     properties:
       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
@@ -1527,6 +1668,15 @@ outputs:
   NovaInternalVip:
     description: VIP for Nova API internal endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
+  SaharaInternalVip:
+    description: VIP for Sahara API internal endpoint
+    value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
   SwiftInternalVip:
     description: VIP for Swift Proxy internal endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
+  HostsEntry:
+    description: |
+      The content that should be appended to your /etc/hosts if you want to get
+      hostname-based access to the deployed nodes (useful for testing without
+      setting up a DNS).
+    value: {get_attr: [allNodesConfig, hosts_entries]}