corosync_ipv6: {get_param: CorosyncIPv6}
         memcached_ipv6: {get_param: MemcachedIPv6}
         nova_password: {get_param: NovaPassword}
-        nova_dsn:
-          list_join:
-            - ''
-            - - {get_param: [EndpointMap, MysqlInternal, protocol]}
-              - '://nova:'
-              - {get_param: NovaPassword}
-              - '@'
-              - {get_param: [EndpointMap, MysqlInternal, host]}
-              - '/nova'
-        nova_api_dsn:
-          list_join:
-            - ''
-            - - {get_param: [EndpointMap, MysqlInternal, protocol]}
-              - '://nova_api:'
-              - {get_param: NovaPassword}
-              - '@'
-              - {get_param: [EndpointMap, MysqlInternal, host]}
-              - '/nova_api'
         upgrade_level_nova_compute: {get_param: UpgradeLevelNovaCompute}
         instance_name_template: {get_param: InstanceNameTemplate}
         nova_public_url: {get_param: [EndpointMap, NovaPublic, uri]}
                 nova::api::api_bind_address: {get_input: nova_api_network}
                 nova::api::metadata_listen: {get_input: nova_metadata_network}
                 nova::api::admin_password: {get_input: nova_password}
-                nova::database_connection: {get_input: nova_dsn}
-                nova::api_database_connection: {get_input: nova_api_dsn}
                 nova::glance_api_servers: {get_input: glance_api_servers}
                 nova::api::neutron_metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
                 nova::api::instance_name_template: {get_input: instance_name_template}
                 nova::network::neutron::neutron_url: {get_input: neutron_internal_url}
                 nova::network::neutron::neutron_auth_url: {get_input: neutron_auth_url}
                 nova::vncproxy::host: {get_input: nova_api_network}
-                nova::db::mysql::password: {get_input: nova_password}
-                nova::db::mysql_api::password: {get_input: nova_password}
                 nova_enable_db_purge: {get_input: nova_enable_db_purge}
                 nova::keystone::auth::public_url: {get_input: nova_public_url}
                 nova::keystone::auth::internal_url: {get_input: nova_internal_url}
 
-# Nova
-nova::db::mysql::user: nova
-nova::db::mysql::host: "%{hiera('mysql_virtual_ip')}"
-nova::db::mysql::dbname: nova
-nova::db::mysql::allowed_hosts:
-  - '%'
-  - "%{hiera('mysql_bind_host')}"
-
-nova::db::mysql_api::user: nova_api
-nova::db::mysql_api::host: "%{hiera('mysql_virtual_ip')}"
-nova::db::mysql_api::dbname: nova_api
-nova::db::mysql_api::allowed_hosts:
-  - '%'
-  - "%{hiera('mysql_bind_host')}"
-
 # Aodh
 aodh::db::mysql::user: aodh
 aodh::db::mysql::host: "%{hiera('mysql_virtual_ip')}"
 
 resources:
   NovaBase:
     type: ./nova-base.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
 
 outputs:
   role_data:
 
   OpenStack Nova base service. Shared for all Nova services.
 
 parameters:
+  EndpointMap:
+    default: {}
+    description: Mapping of service endpoint -> protocol. Typically set
+                 via parameter_defaults in the resource registry.
+    type: json
+  NovaPassword:
+    description: The password for the nova service and db account, used by nova-api.
+    type: string
+    hidden: true
   RabbitPassword:
     description: The password for RabbitMQ
     type: string
         nova::rabbit_user: {get_param: RabbitUserName}
         nova::rabbit_use_ssl: {get_param: RabbitClientUseSSL}
         nova::rabbit_port: {get_param: RabbitClientPort}
+        nova::database_connection:
+          list_join:
+            - ''
+            - - {get_param: [EndpointMap, MysqlInternal, protocol]}
+              - '://nova:'
+              - {get_param: NovaPassword}
+              - '@'
+              - {get_param: [EndpointMap, MysqlInternal, host]}
+              - '/nova'
+        nova::api_database_connection:
+          list_join:
+            - ''
+            - - {get_param: [EndpointMap, MysqlInternal, protocol]}
+              - '://nova_api:'
+              - {get_param: NovaPassword}
+              - '@'
+              - {get_param: [EndpointMap, MysqlInternal, host]}
+              - '/nova_api'
+        nova::db::mysql::password: {get_input: nova_password}
+        nova::db::mysql::user: nova
+        nova::db::mysql::host: {get_param: [EndpointMap, MysqlNoBracketsInternal, host]}
+        nova::db::mysql::dbname: nova
+        nova::db::mysql::allowed_hosts:
+          - '%'
+          - "%{hiera('mysql_bind_host')}"
+        nova::db::mysql_api::password: {get_input: nova_password}
+        nova::db::mysql_api::user: nova_api
+        nova::db::mysql_api::host: {get_param: [EndpointMap, MysqlNoBracketsInternal, host]}
+        nova::db::mysql_api::dbname: nova_api
+        nova::db::mysql_api::allowed_hosts:
+          - '%'
+          - "%{hiera('mysql_bind_host')}"
         nova::debug: {get_param: Debug}
 
 resources:
   NovaBase:
     type: ./nova-base.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
 
 outputs:
   role_data:
 
 resources:
   NovaBase:
     type: ./nova-base.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
 
 outputs:
   role_data:
 
 resources:
   NovaBase:
     type: ./nova-base.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
 
 outputs:
   role_data:
 
 resources:
   NovaBase:
     type: ./nova-base.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
 
 outputs:
   role_data:
 
 resources:
   NovaBase:
     type: ./nova-base.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
 
 outputs:
   role_data:
 
 resources:
   NovaBase:
     type: ./nova-base.yaml
+    properties:
+      EndpointMap: {get_param: EndpointMap}
 
 outputs:
   role_data: