Add bootstrap_node and vip_data to hierarchy for all roles
[apex-tripleo-heat-templates.git] / overcloud.yaml
index 0f05f40..0258b0b 100644 (file)
@@ -1,8 +1,8 @@
-heat_template_version: 2016-04-08
+heat_template_version: 2016-10-14
 
 description: >
   Deploy an OpenStack environment, consisting of several node types (roles),
-  Controller, Compute, BlockStorage, SwiftStorage and CephStorage.  The Storage
+  Controller, Compute, BlockStorage, SwiftStorage and CephStorage. The Storage
   roles enable independent scaling of the storage components, but the minimal
   deployment is one Controller and one Compute node.
 
@@ -13,9 +13,33 @@ parameters:
 
   # Common parameters (not specific to a role)
   CloudName:
-    default: overcloud
+    default: overcloud.localdomain
     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
     type: string
+  CloudNameInternal:
+    default: overcloud.internalapi.localdomain
+    description: >
+      The DNS name of this cloud's internal API endpoint. E.g.
+      'ci-overcloud.internalapi.tripleo.org'.
+    type: string
+  CloudNameStorage:
+    default: overcloud.storage.localdomain
+    description: >
+      The DNS name of this cloud's storage endpoint. E.g.
+      'ci-overcloud.storage.tripleo.org'.
+    type: string
+  CloudNameStorageManagement:
+    default: overcloud.storagemgmt.localdomain
+    description: >
+      The DNS name of this cloud's storage management endpoint. E.g.
+      'ci-overcloud.storagemgmt.tripleo.org'.
+    type: string
+  CloudNameManagement:
+    default: overcloud.management.localdomain
+    description: >
+      The DNS name of this cloud's storage management endpoint. E.g.
+      'ci-overcloud.management.tripleo.org'.
+    type: string
   ControlFixedIPs:
     default: []
     description: Should be used for arbitrary ips.
@@ -91,11 +115,6 @@ parameters:
       may be implementation specific, e.g puppet hieradata.  Any role specific
       ExtraConfig, e.g controllerExtraConfig takes precedence over ExtraConfig.
     type: json
-  SwiftHashSuffix:
-    description: A random string to be used as a salt when hashing to determine mappings in the ring.
-    type: string
-    hidden: true
-
 
 # Compute-specific params
   ComputeCount:
@@ -115,6 +134,7 @@ parameters:
 
   ControllerServices:
     default:
+      - OS::TripleO::Services::CACerts
       - OS::TripleO::Services::CephMon
       - OS::TripleO::Services::CephExternal
       - OS::TripleO::Services::CinderApi
@@ -178,6 +198,8 @@ parameters:
       - OS::TripleO::Services::NovaIronic
       - OS::TripleO::Services::TripleoPackages
       - OS::TripleO::Services::TripleoFirewall
+      - OS::TripleO::Services::OpenDaylight
+      - OS::TripleO::Services::SensuClient
     description: A list of service resources (configured in the Heat
                  resource_registry) which represent nested stacks
                  for each service that should get installed on the Controllers.
@@ -185,6 +207,7 @@ parameters:
 
   ComputeServices:
     default:
+      - OS::TripleO::Services::CACerts
       - OS::TripleO::Services::CephClient
       - OS::TripleO::Services::CephExternal
       - OS::TripleO::Services::Timezone
@@ -200,6 +223,9 @@ parameters:
       - OS::TripleO::Services::ComputeNeutronMetadataAgent
       - OS::TripleO::Services::TripleoPackages
       - OS::TripleO::Services::TripleoFirewall
+      - OS::TripleO::Services::NeutronSriovAgent
+      - OS::TripleO::Services::OpenDaylightOvs
+      - OS::TripleO::Services::SensuClient
     description: A list of service resources (configured in the Heat
                  resource_registry) which represent nested stacks
                  for each service that should get installed on the Compute Nodes.
@@ -217,6 +243,7 @@ parameters:
     type: json
   BlockStorageServices:
     default:
+      - OS::TripleO::Services::CACerts
       - OS::TripleO::Services::CinderVolume
       - OS::TripleO::Services::Kernel
       - OS::TripleO::Services::Ntp
@@ -224,6 +251,7 @@ parameters:
       - OS::TripleO::Services::Snmp
       - OS::TripleO::Services::TripleoPackages
       - OS::TripleO::Services::TripleoFirewall
+      - OS::TripleO::Services::SensuClient
     description: A list of service resources (configured in the Heat
                  resource_registry) which represent nested stacks
                  for each service that should get installed on the BlockStorage nodes.
@@ -241,6 +269,7 @@ parameters:
     type: json
   ObjectStorageServices:
     default:
+      - OS::TripleO::Services::CACerts
       - OS::TripleO::Services::Kernel
       - OS::TripleO::Services::Ntp
       - OS::TripleO::Services::SwiftStorage
@@ -249,6 +278,7 @@ parameters:
       - OS::TripleO::Services::Timezone
       - OS::TripleO::Services::TripleoPackages
       - OS::TripleO::Services::TripleoFirewall
+      - OS::TripleO::Services::SensuClient
     description: A list of service resources (configured in the Heat
                  resource_registry) which represent nested stacks
                  for each service that should get installed on the ObjectStorage nodes.
@@ -268,12 +298,14 @@ parameters:
     type: json
   CephStorageServices:
     default:
+      - OS::TripleO::Services::CACerts
       - OS::TripleO::Services::CephOSD
       - OS::TripleO::Services::Kernel
       - OS::TripleO::Services::Ntp
       - OS::TripleO::Services::Timezone
       - OS::TripleO::Services::TripleoPackages
       - OS::TripleO::Services::TripleoFirewall
+      - OS::TripleO::Services::SensuClient
     description: A list of service resources (configured in the Heat
                  resource_registry) which represent nested stacks
                  for each service that should get installed on the CephStorage nodes.
@@ -380,7 +412,12 @@ resources:
   EndpointMap:
     type: OS::TripleO::EndpointMap
     properties:
-      CloudName: {get_param: CloudName}
+      CloudEndpoints:
+        external: {get_param: CloudName}
+        internal_api: {get_param: CloudNameInternal}
+        storage: {get_param: CloudNameStorage}
+        storage_mgmt: {get_param: CloudNameStorageManagement}
+        management: {get_param: CloudNameManagement}
       NetIpMap: {get_attr: [VipMap, net_ip_map]}
       ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
 
@@ -403,10 +440,6 @@ resources:
         properties:
           CloudDomain: {get_param: CloudDomain}
           controllerExtraConfig: {get_param: controllerExtraConfig}
-          HorizonSecret: {get_resource: HorizonSecret}
-          PcsdPassword: {get_resource: PcsdPassword}
-          RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
-          RedisVirtualIPUri: {get_attr: [RedisVirtualIP, ip_address_uri]}
           ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
           Hostname:
@@ -417,6 +450,7 @@ resources:
           NodeIndex: '%index%'
           ServiceConfigSettings: {get_attr: [ControllerServiceChain, role_data, config_settings]}
           ServiceNames: {get_attr: [ControllerServiceChain, role_data, service_names]}
+          MonitoringSubscriptions: {get_attr: [ControllerServiceChain, role_data, monitoring_subscriptions]}
 
   ComputeServiceChain:
     type: OS::TripleO::Services
@@ -448,6 +482,7 @@ resources:
           NodeIndex: '%index%'
           ServiceConfigSettings: {get_attr: [ComputeServiceChain, role_data, config_settings]}
           ServiceNames: {get_attr: [ComputeServiceChain, role_data, service_names]}
+          MonitoringSubscriptions: {get_attr: [ComputeServiceChain, role_data, monitoring_subscriptions]}
 
   BlockStorageServiceChain:
     type: OS::TripleO::Services
@@ -480,6 +515,7 @@ resources:
           NodeIndex: '%index%'
           ServiceConfigSettings: {get_attr: [BlockStorageServiceChain, role_data, config_settings]}
           ServiceNames: {get_attr: [BlockStorageServiceChain, role_data, service_names]}
+          MonitoringSubscriptions: {get_attr: [BlockStorageServiceChain, role_data, monitoring_subscriptions]}
 
   ObjectStorageServiceChain:
     type: OS::TripleO::Services
@@ -498,7 +534,6 @@ resources:
       resource_def:
         type: OS::TripleO::ObjectStorage
         properties:
-          HashSuffix: {get_param: SwiftHashSuffix}
           UpdateIdentifier: {get_param: UpdateIdentifier}
           ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map]}
           Hostname:
@@ -513,6 +548,7 @@ resources:
           NodeIndex: '%index%'
           ServiceConfigSettings: {get_attr: [ObjectStorageServiceChain, role_data, config_settings]}
           ServiceNames: {get_attr: [ObjectStorageServiceChain, role_data, service_names]}
+          MonitoringSubscriptions: {get_attr: [ObjectStorageServiceChain, role_data, monitoring_subscriptions]}
 
   CephStorageServiceChain:
     type: OS::TripleO::Services
@@ -545,6 +581,7 @@ resources:
           NodeIndex: '%index%'
           ServiceConfigSettings: {get_attr: [CephStorageServiceChain, role_data, config_settings]}
           ServiceNames: {get_attr: [CephStorageServiceChain, role_data, service_names]}
+          MonitoringSubscriptions: {get_attr: [CephStorageServiceChain, role_data, monitoring_subscriptions]}
 
   ControllerIpListMap:
     type: OS::TripleO::Network::Ports::NetIpListMap
@@ -556,6 +593,65 @@ resources:
       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
       ManagementIpList: {get_attr: [Controller, management_ip_address]}
+      EnabledServices: {get_attr: [ControllerServiceChain, role_data, service_names]}
+      ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
+      ServiceHostnameList: {get_attr: [Controller, hostname]}
+
+  ComputeIpListMap:
+    type: OS::TripleO::Network::Ports::NetIpListMap
+    properties:
+      ControlPlaneIpList: {get_attr: [Compute, ip_address]}
+      ExternalIpList: {get_attr: [Compute, external_ip_address]}
+      InternalApiIpList: {get_attr: [Compute, internal_api_ip_address]}
+      StorageIpList: {get_attr: [Compute, storage_ip_address]}
+      StorageMgmtIpList: {get_attr: [Compute, storage_mgmt_ip_address]}
+      TenantIpList: {get_attr: [Compute, tenant_ip_address]}
+      ManagementIpList: {get_attr: [Compute, management_ip_address]}
+      EnabledServices: {get_attr: [ComputeServiceChain, role_data, service_names]}
+      ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
+      ServiceHostnameList: {get_attr: [Compute, hostname]}
+
+  BlockStorageIpListMap:
+    type: OS::TripleO::Network::Ports::NetIpListMap
+    properties:
+      ControlPlaneIpList: {get_attr: [BlockStorage, ip_address]}
+      ExternalIpList: {get_attr: [BlockStorage, external_ip_address]}
+      InternalApiIpList: {get_attr: [BlockStorage, internal_api_ip_address]}
+      StorageIpList: {get_attr: [BlockStorage, storage_ip_address]}
+      StorageMgmtIpList: {get_attr: [BlockStorage, storage_mgmt_ip_address]}
+      TenantIpList: {get_attr: [BlockStorage, tenant_ip_address]}
+      ManagementIpList: {get_attr: [BlockStorage, management_ip_address]}
+      EnabledServices: {get_attr: [BlockStorageServiceChain, role_data, service_names]}
+      ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
+      ServiceHostnameList: {get_attr: [BlockStorage, hostname]}
+
+  ObjectStorageIpListMap:
+    type: OS::TripleO::Network::Ports::NetIpListMap
+    properties:
+      ControlPlaneIpList: {get_attr: [ObjectStorage, ip_address]}
+      ExternalIpList: {get_attr: [ObjectStorage, external_ip_address]}
+      InternalApiIpList: {get_attr: [ObjectStorage, internal_api_ip_address]}
+      StorageIpList: {get_attr: [ObjectStorage, storage_ip_address]}
+      StorageMgmtIpList: {get_attr: [ObjectStorage, storage_mgmt_ip_address]}
+      TenantIpList: {get_attr: [ObjectStorage, tenant_ip_address]}
+      ManagementIpList: {get_attr: [ObjectStorage, management_ip_address]}
+      EnabledServices: {get_attr: [ObjectStorageServiceChain, role_data, service_names]}
+      ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
+      ServiceHostnameList: {get_attr: [ObjectStorage, hostname]}
+
+  CephStorageIpListMap:
+    type: OS::TripleO::Network::Ports::NetIpListMap
+    properties:
+      ControlPlaneIpList: {get_attr: [CephStorage, ip_address]}
+      ExternalIpList: {get_attr: [CephStorage, external_ip_address]}
+      InternalApiIpList: {get_attr: [CephStorage, internal_api_ip_address]}
+      StorageIpList: {get_attr: [CephStorage, storage_ip_address]}
+      StorageMgmtIpList: {get_attr: [CephStorage, storage_mgmt_ip_address]}
+      TenantIpList: {get_attr: [CephStorage, tenant_ip_address]}
+      ManagementIpList: {get_attr: [CephStorage, management_ip_address]}
+      EnabledServices: {get_attr: [CephStorageServiceChain, role_data, service_names]}
+      ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
+      ServiceHostnameList: {get_attr: [CephStorage, hostname]}
 
   allNodesConfig:
     type: OS::TripleO::AllNodes::SoftwareConfig
@@ -576,32 +672,47 @@ resources:
         - list_join:
             - '\n'
             - {get_attr: [CephStorage, hosts_entry]}
+      enabled_services:
+        list_join:
+          - ','
+          - {get_attr: [ControllerServiceChain, role_data, service_names]}
+          - {get_attr: [ComputeServiceChain, role_data, service_names]}
+          - {get_attr: [BlockStorageServiceChain, role_data, service_names]}
+          - {get_attr: [ObjectStorageServiceChain, role_data, service_names]}
+          - {get_attr: [CephStorageServiceChain, role_data, service_names]}
       controller_ips: {get_attr: [Controller, ip_address]}
       controller_names: {get_attr: [Controller, hostname]}
-      rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, RabbitmqNetwork]}]}
-      mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, MongodbNetwork]}]}
-      redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, RedisNetwork]}]}
+      service_ips:
+        # Note (shardy) this somewhat complex yaql may be replaced
+        # with a map_deep_merge function in ocata.  It merges the
+        # list of maps, but appends to colliding lists when a service
+        # is deployed on more than one role
+        yaql:
+          expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
+          data:
+            l:
+              - {get_attr: [ControllerIpListMap, service_ips]}
+              - {get_attr: [ComputeIpListMap, service_ips]}
+              - {get_attr: [BlockStorageIpListMap, service_ips]}
+              - {get_attr: [ObjectStorageIpListMap, service_ips]}
+              - {get_attr: [CephStorageIpListMap, service_ips]}
+      service_node_names:
+        yaql:
+          expression: dict($.data.l.where($ != null).selectMany($.items()).groupBy($[0], $[1], [$[0], $[1].flatten()]))
+          data:
+            l:
+              - {get_attr: [ControllerIpListMap, service_hostnames]}
+              - {get_attr: [ComputeIpListMap, service_hostnames]}
+              - {get_attr: [BlockStorageIpListMap, service_hostnames]}
+              - {get_attr: [ObjectStorageIpListMap, service_hostnames]}
+              - {get_attr: [CephStorageIpListMap, service_hostnames]}
+      # FIXME(shardy): These require further work to move into service_ips
       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, MemcachedNetwork]}]}
-      mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, MysqlNetwork]}]}
-      horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, HorizonNetwork]}]}
-      heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, HeatApiNetwork]}]}
-      swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, SwiftProxyNetwork]}]}
-      ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, CeilometerApiNetwork]}]}
-      aodh_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, AodhApiNetwork]}]}
-      gnocchi_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, GnocchiApiNetwork]}]}
-      nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, NovaApiNetwork]}]}
-      nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, NovaMetadataNetwork]}]}
-      glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, GlanceApiNetwork]}]}
-      glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, GlanceRegistryNetwork]}]}
-      cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, CinderApiNetwork]}]}
-      manila_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, ManilaApiNetwork]}]}
-      neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, NeutronApiNetwork]}]}
       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystonePublicApiNetwork]}]}
       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystoneAdminApiNetwork]}]}
-      sahara_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, SaharaApiNetwork]}]}
-      ironic_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, IronicApiNetwork]}]}
-      ceph_mon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, CephPublicNetwork]}]}
-      ceph_mon_node_names: {get_attr: [Controller, hostname]}
+      NetVipMap: {get_attr: [VipMap, net_ip_map]}
+      RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
+      ServiceNetMap: {get_attr: [ServiceNetMap, service_net_map_lower]}
       DeployIdentifier: {get_param: DeployIdentifier}
       UpdateIdentifier: {get_param: UpdateIdentifier}
 
@@ -697,44 +808,6 @@ resources:
       StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
       # No tenant or management VIP required
 
-  VipConfig:
-    type: OS::TripleO::VipConfig
-
-  VipDeployment:
-    type: OS::Heat::StructuredDeployments
-    properties:
-      name: VipDeployment
-      config: {get_resource: VipConfig}
-      servers: {get_attr: [Controller, attributes, nova_server_resource]}
-      input_values:
-        # service VIP mappings
-        keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystoneAdminApiNetwork]}]}
-        keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, KeystonePublicApiNetwork]}]}
-        neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, NeutronApiNetwork]}]}
-        cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, CinderApiNetwork]}]}
-        glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, GlanceApiNetwork]}]}
-        glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, GlanceRegistryNetwork]}]}
-        swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, SwiftProxyNetwork]}]}
-        nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, NovaApiNetwork]}]}
-        nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, NovaMetadataNetwork]}]}
-        ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, CeilometerApiNetwork]}]}
-        aodh_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, AodhApiNetwork]}]}
-        gnocchi_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, GnocchiApiNetwork]}]}
-        heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, HeatApiNetwork]}]}
-        horizon_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, HorizonNetwork]}]}
-        redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
-        manila_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, ManilaApiNetwork]}]}
-        mysql_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, MysqlNetwork]}]}
-        rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, RabbitMqNetwork]}]}
-        # direct configuration of Virtual IPs for each network
-        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_attr: [ServiceNetMap, service_net_map, SaharaApiNetwork]}]}
-        ironic_api_vip: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, IronicApiNetwork]}]}
-        storage_virtual_ip: {get_attr: [VipMap, net_ip_map, storage]}
-        storage_mgmt_virtual_ip: {get_attr: [VipMap, net_ip_map, storage_mgmt]}
-
   ControllerSwiftDeployment:
     type: OS::Heat::StructuredDeployments
     properties:
@@ -754,7 +827,6 @@ resources:
     properties:
       controller_swift_devices: {get_attr: [Controller, swift_device]}
       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
-      controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
 
   ControllerAllNodesDeployment:
     type: OS::Heat::StructuredDeployments
@@ -926,7 +998,11 @@ resources:
       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
       RoleData: {get_attr: [CephStorageServiceChain, role_data]}
 
+
 outputs:
+  ManagedEndpoints:
+    description: Asserts that the keystone endpoints have been provisioned.
+    value: true
   KeystoneURL:
     description: URL for the Overcloud Keystone service
     value: {get_attr: [EndpointMap, endpoint_map, KeystonePublic, uri]}
@@ -969,6 +1045,9 @@ outputs:
   NovaInternalVip:
     description: VIP for Nova API internal endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, NovaApiNetwork]}]}
+  OpenDaylightInternalVip:
+    description: VIP for OpenDaylight API internal endpoint
+    value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, OpenDaylightApiNetwork]}]}
   SaharaInternalVip:
     description: VIP for Sahara API internal endpoint
     value: {get_attr: [VipMap, net_ip_map, {get_attr: [ServiceNetMap, service_net_map, SaharaApiNetwork]}]}