puppet: allow config of ad-hoc Neutron settings
[apex-tripleo-heat-templates.git] / puppet / controller.yaml
index 388c06a..7014501 100644 (file)
@@ -1,4 +1,4 @@
-heat_template_version: 2015-04-30
+heat_template_version: 2015-10-15
 
 description: >
   OpenStack controller node configured by Puppet.
@@ -10,12 +10,10 @@ parameters:
     type: string
     hidden: true
   AdminPassword:
-    default: unset
     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
     type: string
     hidden: true
   AdminToken:
-    default: unset
     description: The keystone auth secret and db password.
     type: string
     hidden: true
@@ -27,18 +25,25 @@ 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  and db account.
     type: string
     hidden: true
   CinderApiVirtualIP:
     type: string
     default: ''
+  CeilometerWorkers:
+    default: 0
+    description: Number of workers for Ceilometer service.
+    type: number
+  CinderEnableDBPurge:
+    default: true
+    description: |
+      Whether to create cron job for purging soft deleted rows in Cinder database.
+    type: boolean
   CinderEnableNfsBackend:
     default: false
     description: Whether to enable or not the NFS backend for Cinder
@@ -72,7 +77,6 @@ parameters:
       CinderEnableNfsBackend is true.
     type: comma_delimited_list
   CinderPassword:
-    default: unset
     description: The password for the cinder service and db account, used by cinder-api.
     type: string
     hidden: true
@@ -81,8 +85,12 @@ parameters:
     description: Contains parameters to configure Cinder backends. Typically
                  set via parameter_defaults in the resource registry.
     type: json
+  CinderWorkers:
+    default: 0
+    description: Number of workers for Cinder service.
+    type: number
   CloudName:
-    default: ''
+    default: overcloud
     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
     type: string
   ControllerExtraConfig:
@@ -90,6 +98,15 @@ parameters:
     description: |
       Controller specific hiera configuration data to inject into the cluster.
     type: json
+  ControllerIPs:
+    default: {}
+    description: >
+      A network mapped list of IPs to assign to Controllers in the following form:
+      {
+        "internal_api": ["a.b.c.d", "e.f.g.h"],
+        ...
+      }
+    type: json
   ControlVirtualInterface:
     default: 'br-ex'
     description: Interface where virtual ip will be assigned.
@@ -170,7 +187,6 @@ parameters:
     type: string
     default: ''
   GlancePassword:
-    default: unset
     description: The password for the glance service and db account, used by the glance services.
     type: string
     hidden: true
@@ -209,15 +225,17 @@ parameters:
     default: /dev/log
     description: Syslog address where HAproxy will send its log
     type: string
+  GlanceWorkers:
+    default: 0
+    description: Number of workers for Glance service.
+    type: number
   HeatPassword:
-    default: unset
     description: The password for the Heat service and db account, used by the Heat services.
     type: string
     hidden: true
   HeatStackDomainAdminPassword:
     description: Password for heat_domain_admin user.
     type: string
-    default: ''
     hidden: true
   HeatAuthEncryptionKey:
     description: Auth encryption key for heat-engine
@@ -227,6 +245,10 @@ parameters:
     default: '*'
     description: A list of IP/Hostname allowed to connect to horizon
     type: comma_delimited_list
+  HeatWorkers:
+    default: 0
+    description: Number of workers for Heat service.
+    type: number
   HorizonSecret:
     description: Secret key for Django
     type: string
@@ -240,9 +262,13 @@ parameters:
     default: 'REBUILD_PRESERVE_EPHEMERAL'
     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
     type: string
+  InstanceNameTemplate:
+    default: 'instance-%08x'
+    description: Template string to be used to generate instance names
+    type: string
   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
@@ -250,6 +276,11 @@ parameters:
     default: ''
     description: Keystone self-signed certificate authority certificate.
     type: string
+  KeystoneEnableDBPurge:
+    default: true
+    description: |
+        Whether to create cron job for purging soft deleted rows in Keystone database.
+    type: boolean
   KeystoneSigningCertificate:
     default: ''
     description: Keystone certificate for verifying token validity.
@@ -290,6 +321,18 @@ parameters:
     default: false
     description: Whether IPtables rules should be purged before setting up the new ones.
     type: boolean
+  KeystoneWorkers:
+    default: 0
+    description: Number of workers for Keystone service.
+    type: number
+  SaharaApiVirtualIP:
+    type: string
+    default: ''
+  SaharaPassword:
+    default: unset
+    description: The password for the sahara service account, used by sahara-api.
+    type: string
+    hidden: true
   MysqlClusterUniquePart:
     description: A unique identifier of the MySQL cluster the controller is in.
     type: string
@@ -324,7 +367,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"
   NeutronDnsmasqOptions:
     default: 'dhcp-option-force=26,1400'
@@ -363,7 +406,6 @@ parameters:
     description: Whether to configure Neutron Distributed Virtual Routers
     type: string
   NeutronMetadataProxySharedSecret:
-    default: 'unset'
     description: Shared secret to prevent spoofing
     type: string
     hidden: true
@@ -374,7 +416,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.
@@ -387,9 +429,8 @@ 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
   NeutronAllowL3AgentFailover:
     default: 'True'
     description: Allow automatic l3-agent failover
@@ -407,7 +448,7 @@ 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.
   NeutronL3HA:
@@ -416,17 +457,16 @@ parameters:
     type: string
   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
   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
       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
     type: comma_delimited_list
   NeutronPassword:
-    default: unset
     description: The password for the neutron service and db account, used by neutron agents.
     type: string
     hidden: true
@@ -459,9 +499,8 @@ parameters:
   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
@@ -474,14 +513,36 @@ parameters:
         of VXLAN VNI IDs that are available for tenant network allocation
     default: ["1:1000", ]
     type: comma_delimited_list
+  NeutronPluginExtensions:
+    default: "qos"
+    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
   NovaApiVirtualIP:
     type: string
     default: ''
+  NeutronWorkers:
+    default: 0
+    description: Number of workers for Neutron service.
+    type: number
+  NovaEnableDBPurge:
+    default: true
+    description: |
+        Whether to create cron job for purging soft deleted rows in Nova database.
+    type: boolean
   NovaPassword:
-    default: unset
     description: The password for the nova service and db account, used by nova-api.
     type: string
     hidden: true
+  NovaWorkers:
+    default: 0
+    description: Number of workers for Nova service.
+    type: number
   MongoDbNoJournal:
     default: false
     description: Should MongoDb journaling be disabled
@@ -538,12 +599,10 @@ parameters:
     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
   SwiftHashSuffix:
-    default: unset
     description: A random string to be used as a salt when hashing to determine mappings
       in the ring.
     hidden: true
@@ -561,7 +620,6 @@ parameters:
     description: Partition Power to use when building Swift rings
     type: number
   SwiftPassword:
-    default: unset
     description: The password for the swift service account, used by the swift proxy
       services.
     hidden: true
@@ -573,6 +631,14 @@ parameters:
     type: number
     default: 3
     description: How many replicas to use in the swift rings.
+  SwiftWorkers:
+    default: 0
+    description: Number of workers for Swift service.
+    type: number
+  TimeZone:
+    default: 'UTC'
+    description: The timezone to be set on controller nodes.
+    type: string
   VirtualIP: # DEPRECATED: use per service settings instead
     type: string
     default: ''  # Has to be here because of the ignored empty value bug
@@ -628,6 +694,29 @@ parameters:
   NodeIndex:
     type: number
     default: 0
+  SoftwareConfigTransport:
+    default: POLL_SERVER_CFN
+    description: |
+      How the server should receive the metadata required for software configuration.
+    type: string
+    constraints:
+    - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
+  CloudDomain:
+    default: ''
+    type: string
+    description: >
+      The DNS domain used for the hosts. This should match the dhcp_domain
+      configured in the Undercloud neutron. Defaults to localdomain.
+  ServerMetadata:
+    default: {}
+    description: >
+      Extra properties or metadata passed to Nova for the created nodes in
+      the overcloud. It's accessible via the Nova metadata API.
+    type: json
+  SchedulerHints:
+    type: json
+    description: Optional scheduler hints to pass to nova
+    default: {}
 
 resources:
 
@@ -643,6 +732,9 @@ resources:
       user_data_format: SOFTWARE_CONFIG
       user_data: {get_resource: UserData}
       name: {get_param: Hostname}
+      software_config_transport: {get_param: SoftwareConfigTransport}
+      metadata: {get_param: ServerMetadata}
+      scheduler_hints: {get_param: SchedulerHints}
 
   # Combine the NodeAdminUserData and NodeUserData mime archives
   UserData:
@@ -667,25 +759,40 @@ resources:
   ExternalPort:
     type: OS::TripleO::Controller::Ports::ExternalPort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   InternalApiPort:
     type: OS::TripleO::Controller::Ports::InternalApiPort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   StoragePort:
     type: OS::TripleO::Controller::Ports::StoragePort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   StorageMgmtPort:
     type: OS::TripleO::Controller::Ports::StorageMgmtPort
     properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
   TenantPort:
     type: OS::TripleO::Controller::Ports::TenantPort
+    properties:
+      IPPool: {get_param: ControllerIPs}
+      NodeIndex: {get_param: NodeIndex}
+      ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
+
+  ManagementPort:
+    type: OS::TripleO::Controller::Ports::ManagementPort
     properties:
       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
 
@@ -698,6 +805,7 @@ resources:
       StorageIp: {get_attr: [StoragePort, ip_address]}
       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
       TenantIp: {get_attr: [TenantPort, ip_address]}
+      ManagementIp: {get_attr: [ManagementPort, ip_address]}
 
   NetIpSubnetMap:
     type: OS::TripleO::Network::Ports::NetIpSubnetMap
@@ -708,6 +816,7 @@ resources:
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetworkConfig:
     type: OS::TripleO::Controller::Net::SoftwareConfig
@@ -718,10 +827,12 @@ resources:
       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
+      ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
 
   NetworkDeployment:
     type: OS::TripleO::SoftwareDeployment
     properties:
+      name: NetworkDeployment
       config: {get_resource: NetworkConfig}
       server: {get_resource: Controller}
       actions: {get_param: NetworkDeploymentActions}
@@ -736,7 +847,7 @@ resources:
     properties:
       server: {get_resource: Controller}
 
-  # Hook for site-specific passing of private keys/certificates
+  # Resource for site-specific passing of private keys/certificates
   NodeTLSData:
     depends_on: NodeTLSCAData
     type: OS::TripleO::NodeTLSData
@@ -744,14 +855,24 @@ resources:
       server: {get_resource: Controller}
       NodeIndex: {get_param: NodeIndex}
 
+
   ControllerDeployment:
     type: OS::TripleO::SoftwareDeployment
     depends_on: NetworkDeployment
     properties:
+      name: ControllerDeployment
       config: {get_resource: ControllerConfig}
       server: {get_resource: Controller}
       input_values:
         bootstack_nodeid: {get_attr: [Controller, name]}
+        ceilometer_workers: {get_param: CeilometerWorkers}
+        cinder_workers: {get_param: CinderWorkers}
+        glance_workers: {get_param: GlanceWorkers}
+        heat_workers: {get_param: HeatWorkers}
+        keystone_workers: {get_param: KeystoneWorkers}
+        nova_workers: {get_param: NovaWorkers}
+        neutron_workers: {get_param: NeutronWorkers}
+        swift_workers: {get_param: SwiftWorkers}
         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
         neutron_enable_l2pop: {get_param: NeutronEnableL2Pop}
         neutron_enable_isolated_metadata: {get_param: NeutronEnableIsolatedMetadata}
@@ -782,17 +903,15 @@ resources:
         admin_token: {get_param: AdminToken}
         neutron_public_interface_ip: {get_param: NeutronPublicInterfaceIP}
         debug: {get_param: Debug}
+        cinder_enable_db_purge: {get_param: CinderEnableDBPurge}
         cinder_enable_nfs_backend: {get_param: CinderEnableNfsBackend}
         cinder_enable_rbd_backend: {get_param: CinderEnableRbdBackend}
         cinder_nfs_mount_options: {get_param: CinderNfsMountOptions}
         cinder_nfs_servers:
           str_replace:
-            template: "['SERVERS']"
+            template: SERVERS
             params:
-              SERVERS:
-                list_join:
-                - "','"
-                - {get_param: CinderNfsServers}
+              SERVERS: {get_param: CinderNfsServers}
         cinder_lvm_loop_device_size: {get_param: CinderLVMLoopDeviceSize}
         cinder_password: {get_param: CinderPassword}
         cinder_enable_iscsi_backend: {get_param: CinderEnableIscsiBackend}
@@ -801,7 +920,7 @@ resources:
         cinder_dsn:
           list_join:
             - ''
-            - - 'mysql://cinder:'
+            - - 'mysql+pymysql://cinder:'
               - {get_param: CinderPassword}
               - '@'
               - {get_param: MysqlVirtualIP}
@@ -818,7 +937,7 @@ resources:
         glance_dsn:
           list_join:
             - ''
-            - - 'mysql://glance:'
+            - - 'mysql+pymysql://glance:'
               - {get_param: GlancePassword}
               - '@'
               - {get_param: MysqlVirtualIP}
@@ -828,7 +947,7 @@ resources:
         heat_dsn:
           list_join:
             - ''
-            - - 'mysql://heat:'
+            - - 'mysql+pymysql://heat:'
               - {get_param: HeatPassword}
               - '@'
               - {get_param: MysqlVirtualIP}
@@ -840,10 +959,11 @@ resources:
         keystone_ssl_certificate_key: {get_param: KeystoneSSLCertificateKey}
         keystone_notification_driver: {get_param: KeystoneNotificationDriver}
         keystone_notification_format: {get_param: KeystoneNotificationFormat}
+        keystone_enable_db_purge: {get_param: KeystoneEnableDBPurge}
         keystone_dsn:
           list_join:
             - ''
-            - - 'mysql://keystone:'
+            - - 'mysql+pymysql://keystone:'
               - {get_param: AdminToken}
               - '@'
               - {get_param: MysqlVirtualIP}
@@ -868,73 +988,88 @@ resources:
             template: tripleo-CLUSTER
             params:
               CLUSTER: {get_param: MysqlClusterUniquePart}
-        neutron_flat_networks: {get_param: NeutronFlatNetworks}
+        neutron_flat_networks:
+          str_replace:
+            template: NETWORKS
+            params:
+              NETWORKS: {get_param: NeutronFlatNetworks}
         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
         neutron_agent_mode: {get_param: NeutronAgentMode}
         neutron_router_distributed: {get_param: NeutronDVR}
         neutron_core_plugin: {get_param: NeutronCorePlugin}
         neutron_service_plugins:
           str_replace:
-            template: "['PLUGINS']"
+            template: PLUGINS
             params:
-              PLUGINS:
-                list_join:
-                - "','"
-                - {get_param: NeutronServicePlugins}
+              PLUGINS: {get_param: NeutronServicePlugins}
         neutron_type_drivers:
           str_replace:
-            template: "['DRIVERS']"
+            template: DRIVERS
             params:
-              DRIVERS:
-                list_join:
-                - "','"
-                - {get_param: NeutronTypeDrivers}
+              DRIVERS: {get_param: NeutronTypeDrivers}
         neutron_enable_dhcp_agent: {get_param: NeutronEnableDHCPAgent}
         neutron_enable_l3_agent: {get_param: NeutronEnableL3Agent}
         neutron_enable_metadata_agent: {get_param: NeutronEnableMetadataAgent}
         neutron_enable_ovs_agent: {get_param: NeutronEnableOVSAgent}
-        neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
+        neutron_mechanism_drivers:
+          str_replace:
+            template: MECHANISMS
+            params:
+              MECHANISMS: {get_param: NeutronMechanismDrivers}
         neutron_allow_l3agent_failover: {get_param: NeutronAllowL3AgentFailover}
         neutron_l3_ha: {get_param: NeutronL3HA}
         neutron_dhcp_agents_per_network: {get_param: NeutronDhcpAgentsPerNetwork}
         neutron_network_vlan_ranges:
           str_replace:
-            template: "['RANGES']"
+            template: RANGES
             params:
-              RANGES:
-                list_join:
-                - "','"
-                - {get_param: NeutronNetworkVLANRanges}
-        neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
+              RANGES: {get_param: NeutronNetworkVLANRanges}
+        neutron_bridge_mappings:
+          str_replace:
+            template: MAPPINGS
+            params:
+              MAPPINGS: {get_param: NeutronBridgeMappings}
         neutron_external_network_bridge: {get_param: NeutronExternalNetworkBridge}
         neutron_public_interface: {get_param: NeutronPublicInterface}
         neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
         neutron_public_interface_default_route: {get_param: NeutronPublicInterfaceDefaultRoute}
         neutron_public_interface_tag: {get_param: NeutronPublicInterfaceTag}
-        neutron_tenant_network_type: {get_param: NeutronNetworkType}
-        neutron_tunnel_types: {get_param: NeutronTunnelTypes}
         neutron_tunnel_id_ranges:
           str_replace:
-            template: "['RANGES']"
+            template: RANGES
             params:
-              RANGES:
-                list_join:
-                - "','"
-                - {get_param: NeutronTunnelIdRanges}
+              RANGES: {get_param: NeutronTunnelIdRanges}
         neutron_vni_ranges:
           str_replace:
-            template: "['RANGES']"
+            template: RANGES
+            params:
+              RANGES: {get_param: NeutronVniRanges}
+        neutron_tenant_network_types:
+          str_replace:
+            template: TYPES
+            params:
+              TYPES: {get_param: NeutronNetworkType}
+        neutron_tunnel_types:
+          str_replace:
+            template: TYPES
+            params:
+              TYPES: {get_param: NeutronTunnelTypes}
+        neutron_plugin_extensions:
+          str_replace:
+            template: PLUGIN_EXTENSIONS
+            params:
+              PLUGIN_EXTENSIONS: {get_param: NeutronPluginExtensions}
+        neutron_agent_extensions:
+          str_replace:
+            template: AGENT_EXTENSIONS
             params:
-              RANGES:
-                list_join:
-                - "','"
-                - {get_param: NeutronVniRanges}
+              AGENT_EXTENSIONS: {get_param: NeutronAgentExtensions}
         neutron_password: {get_param: NeutronPassword}
         neutron_dnsmasq_options: {get_param: NeutronDnsmasqOptions}
         neutron_dsn:
           list_join:
             - ''
-            - - 'mysql://neutron:'
+            - - 'mysql+pymysql://neutron:'
               - {get_param: NeutronPassword}
               - '@'
               - {get_param: MysqlVirtualIP}
@@ -942,7 +1077,7 @@ resources:
         neutron_internal_url: { get_param: [ EndpointMap, NeutronInternal, uri ] }
         neutron_public_url: { get_param: [ EndpointMap, NeutronPublic, uri ] }
         neutron_admin_url: { get_param: [ EndpointMap, NeutronAdmin, uri ] }
-        neutron_admin_auth_url: { get_param: [ EndpointMap, KeystoneAdmin, uri ] }
+        neutron_admin_auth_url: { get_param: [ EndpointMap, KeystoneAdmin, uri_no_suffix ] }
         nova_internal_url: { get_param: [ EndpointMap, NovaInternal, uri ] }
         ceilometer_backend: {get_param: CeilometerBackend}
         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
@@ -956,22 +1091,24 @@ resources:
         ceilometer_dsn:
           list_join:
             - ''
-            - - 'mysql://ceilometer:'
+            - - 'mysql+pymysql://ceilometer:'
               - {get_param: CeilometerPassword}
               - '@'
               - {get_param: MysqlVirtualIP}
               - '/ceilometer'
         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
+        nova_enable_db_purge: {get_param: NovaEnableDBPurge}
         nova_password: {get_param: NovaPassword}
         nova_dsn:
           list_join:
             - ''
-            - - 'mysql://nova:'
+            - - 'mysql+pymysql://nova:'
               - {get_param: NovaPassword}
               - '@'
               - {get_param: MysqlVirtualIP}
               - '/nova'
+        instance_name_template: {get_param: InstanceNameTemplate}
         fencing_config: {get_param: FencingConfig}
         pcsd_password: {get_param: PcsdPassword}
         rabbit_username: {get_param: RabbitUserName}
@@ -989,6 +1126,7 @@ resources:
             params:
               LIMIT: {get_param: RabbitFDLimit}
         ntp_servers: {get_param: NtpServer}
+        timezone: {get_param: TimeZone}
         control_virtual_interface: {get_param: ControlVirtualInterface}
         public_virtual_interface: {get_param: PublicVirtualInterface}
         swift_hash_suffix: {get_param: SwiftHashSuffix}
@@ -999,6 +1137,15 @@ resources:
         swift_mount_check: {get_param: SwiftMountCheck}
         enable_package_install: {get_param: EnablePackageInstall}
         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
+        sahara_password: {get_param: SaharaPassword}
+        sahara_dsn:
+          list_join:
+            - ''
+            - - 'mysql://sahara:'
+              - {get_param: SaharaPassword}
+              - '@'
+              - {get_param: MysqlVirtualIP}
+              - '/sahara'
         swift_proxy_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
         swift_management_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}
         cinder_iscsi_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CinderIscsiNetwork]}]}
@@ -1021,6 +1168,7 @@ resources:
         rabbitmq_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
         redis_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
         redis_vip: {get_param: RedisVirtualIP}
+        sahara_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
         memcached_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
         mysql_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
         mysql_virtual_ip: {get_param: MysqlVirtualIP}
@@ -1051,11 +1199,14 @@ resources:
             - vip_data # provided by vip-config
             - '"%{::osfamily}"'
             - common
+            - cinder_dellsc_data # Optionally provided by ControllerExtraConfigPre
             - cinder_netapp_data # Optionally provided by ControllerExtraConfigPre
+            - cinder_eqlx_data # Optionally provided by ControllerExtraConfigPre
             - neutron_bigswitch_data # Optionally provided by ControllerExtraConfigPre
             - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
             - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
             - neutron_nuage_data # Optionally provided by ControllerExtraConfigPre
+            - midonet_data #Optionally provided by AllNodesExtraConfig
           datafiles:
             controller_extraconfig:
               mapped_data: {get_param: ControllerExtraConfig}
@@ -1091,6 +1242,7 @@ resources:
                 swift::storage::all::storage_local_net_ip: {get_input: swift_management_network}
                 swift::swift_hash_suffix: {get_input: swift_hash_suffix}
                 swift::proxy::authtoken::admin_password: {get_input: swift_password}
+                swift::proxy::workers: {get_input: swift_workers}
                 tripleo::ringbuilder::part_power: {get_input: swift_part_power}
                 tripleo::ringbuilder::replicas: {get_input: swift_replicas}
                 tripleo::ringbuilder::min_part_hours: {get_input: swift_min_part_hours}
@@ -1101,6 +1253,7 @@ resources:
                 tripleo::ringbuilder::build_ring: True
 
                 # Cinder
+                cinder_enable_db_purge: {get_input: cinder_enable_db_purge}
                 cinder_enable_nfs_backend: {get_input: cinder_enable_nfs_backend}
                 cinder_enable_rbd_backend: {get_input: cinder_enable_rbd_backend}
                 cinder_nfs_mount_options: {get_input: cinder_nfs_mount_options}
@@ -1131,6 +1284,7 @@ resources:
                 glance::api::registry_host: {get_input: glance_registry_host}
                 glance::api::keystone_password: {get_input: glance_password}
                 glance::api::debug: {get_input: debug}
+                glance::api::workers: {get_input: glance_workers}
                 glance_notifier_strategy: {get_input: glance_notifier_strategy}
                 glance_log_file: {get_input: glance_log_file}
                 glance_log_file: {get_input: glance_log_file}
@@ -1142,6 +1296,7 @@ resources:
                 glance::registry::identity_uri: {get_input: keystone_identity_uri}
                 glance::registry::debug: {get_input: debug}
                 glance::backend::swift::swift_store_auth_address: {get_input: keystone_auth_uri}
+                glance::registry::workers: {get_input: glance_workers}
                 glance::backend::swift::swift_store_user: service:glance
                 glance::backend::swift::swift_store_key: {get_input: glance_password}
                 glance_backend: {get_input: glance_backend}
@@ -1166,8 +1321,11 @@ resources:
                 heat::identity_uri: {get_input: keystone_identity_uri}
                 heat::keystone_password: {get_input: heat_password}
                 heat::api::bind_host: {get_input: heat_api_network}
+                heat::api::workers: {get_input: heat_workers}
                 heat::api_cloudwatch::bind_host: {get_input: heat_api_network}
+                heat::api_cloudwatch::workers: {get_input: heat_workers}
                 heat::api_cfn::bind_host: {get_input: heat_api_network}
+                heat::api_cfn::workers: {get_input: heat_workers}
                 heat::database_connection: {get_input: heat_dsn}
                 heat::debug: {get_input: debug}
                 heat::db::mysql::password: {get_input: heat_password}
@@ -1196,6 +1354,10 @@ resources:
                 keystone::endpoint::internal_url: {get_input: keystone_internal_url}
                 keystone::endpoint::admin_url: {get_input: keystone_identity_uri}
                 keystone::endpoint::region: {get_input: keystone_region}
+                keystone::admin_workers: {get_input: keystone_workers}
+                keystone::public_workers: {get_input: keystone_workers}
+                keystone_enable_db_purge: {get_input: keystone_enable_db_purge}
+
                 # MongoDB
                 mongodb::server::bind_ip: {get_input: mongo_db_network}
                 mongodb::server::nojournal: {get_input: mongodb_no_journal}
@@ -1221,14 +1383,16 @@ resources:
                 neutron::server::auth_uri: {get_input: keystone_auth_uri}
                 neutron::server::identity_uri: {get_input: keystone_identity_uri}
                 neutron::server::database_connection: {get_input: neutron_dsn}
+                neutron::server::api_workers: {get_input: neutron_workers}
                 neutron::agents::l3::external_network_bridge: {get_input: neutron_external_network_bridge}
                 neutron::agents::ml2::ovs::enable_tunneling: {get_input: neutron_enable_tunneling}
                 neutron::agents::ml2::ovs::l2_population: {get_input: neutron_enable_l2pop}
                 neutron::agents::dhcp::enable_isolated_metadata: {get_input: neutron_enable_isolated_metadata}
                 neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
-                neutron_flat_networks: {get_input: neutron_flat_networks}
+                neutron::plugins::ml2::flat_networks: {get_input: neutron_flat_networks}
                 neutron::agents::metadata::shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
                 neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network}
+                neutron::agents::metadata::metadata_workers: {get_input: neutron_workers}
                 neutron_agent_mode: {get_input: neutron_agent_mode}
                 neutron_router_distributed: {get_input: neutron_router_distributed}
                 neutron::core_plugin: {get_input: neutron_core_plugin}
@@ -1238,20 +1402,22 @@ resources:
                 neutron::enable_metadata_agent: {get_input: neutron_enable_metadata_agent}
                 neutron::enable_ovs_agent: {get_input: neutron_enable_ovs_agent}
                 neutron::plugins::ml2::type_drivers: {get_input: neutron_type_drivers}
-                neutron_mechanism_drivers: {get_input: neutron_mechanism_drivers}
+                neutron::plugins::ml2::mechanism_drivers: {get_input: neutron_mechanism_drivers}
+                neutron::plugins::ml2::extension_drivers: {get_input: neutron_plugin_extensions}
                 neutron::server::allow_automatic_l3agent_failover: {get_input: neutron_allow_l3agent_failover}
                 neutron::server::l3_ha: {get_input: neutron_l3_ha}
                 neutron::dhcp_agents_per_network: {get_input: neutron_dhcp_agents_per_network}
                 neutron::plugins::ml2::network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
                 neutron::plugins::ml2::tunnel_id_ranges: {get_input: neutron_tunnel_id_ranges}
                 neutron::plugins::ml2::vni_ranges: {get_input: neutron_vni_ranges}
-                neutron_bridge_mappings: {get_input: neutron_bridge_mappings}
+                neutron::agents::ml2::ovs:bridge_mappings: {get_input: neutron_bridge_mappings}
                 neutron_public_interface: {get_input: neutron_public_interface}
                 neutron_public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
                 neutron_public_interface_default_route: {get_input: neutron_public_interface_default_route}
                 neutron_public_interface_tag: {get_input: neutron_public_interface_tag}
-                neutron_tenant_network_type: {get_input: neutron_tenant_network_type}
-                neutron_tunnel_types: {get_input: neutron_tunnel_types}
+                neutron::plugins::ml2::tenant_network_types: {get_input: neutron_tenant_network_types}
+                neutron::agents::ml2::ovs::tunnel_types: {get_input: neutron_tunnel_types}
+                neutron::agents::ml2::ovs::extensions: {get_input: neutron_agent_extensions}
                 neutron::server::auth_password: {get_input: neutron_password}
                 neutron::agents::metadata::auth_password: {get_input: neutron_password}
                 neutron_dnsmasq_options: {get_input: neutron_dnsmasq_options}
@@ -1266,6 +1432,7 @@ resources:
                 neutron::server::notifications::nova_url: {get_input: nova_internal_url}
                 neutron::server::notifications::auth_url: {get_input: neutron_admin_auth_url}
                 neutron::server::notifications::tenant_name: 'service'
+                neutron::server::notifications::project_name: 'service'
                 neutron::server::notifications::password: {get_input: nova_password}
 
                 # Ceilometer
@@ -1299,14 +1466,19 @@ resources:
                 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::api::osapi_compute_workers: {get_input: nova_workers}
+                nova::api::ec2_workers: {get_input: nova_workers}
+                nova::api::metadata_workers: {get_input: nova_workers}
                 nova::database_connection: {get_input: nova_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_admin_password: {get_input: neutron_password}
                 nova::network::neutron::neutron_url: {get_input: neutron_internal_url}
                 nova::network::neutron::neutron_admin_auth_url: {get_input: neutron_admin_auth_url}
                 nova::vncproxy::host: {get_input: nova_api_network}
                 nova::db::mysql::password: {get_input: nova_password}
+                nova_enable_db_purge: {get_input: nova_enable_db_purge}
 
                 # Horizon
                 apache::ip: {get_input: horizon_network}
@@ -1316,6 +1488,29 @@ resources:
                 horizon::bind_address: {get_input: horizon_network}
                 horizon::keystone_url: {get_input: keystone_auth_uri}
 
+                # Sahara
+                sahara::host: {get_input: sahara_api_network}
+                sahara::plugins:
+                  - cdh
+                  - hdp
+                  - mapr
+                  - vanilla
+                  - spark
+                  - storm
+                sahara::admin_password: {get_input: sahara_password}
+                sahara::auth_uri: {get_input: keystone_auth_uri}
+                sahara::admin_user: sahara
+                sahara::identity_uri: {get_input: keystone_identity_uri}
+                sahara::use_neutron: true
+                sahara::database_connection: {get_input: sahara_dsn}
+                sahara::debug: {get_input: debug}
+                sahara::rpc_backend: rabbit
+                sahara::rabbit_userid: {get_input: rabbit_username}
+                sahara::rabbit_password: {get_input: rabbit_password}
+                sahara::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
+                sahara::rabbit_port: {get_input: rabbit_client_port}
+                sahara::db::mysql::password: {get_input: sahara_password}
+
                 # Rabbit
                 rabbitmq::node_ip_address: {get_input: rabbitmq_network}
                 rabbitmq::erlang_cookie: {get_input: rabbit_cookie}
@@ -1332,17 +1527,13 @@ resources:
                 memcached::listen_ip: {get_input: memcached_network}
                 neutron_public_interface_ip: {get_input: neutron_public_interface_ip}
                 ntp::servers: {get_input: ntp_servers}
+                timezone::timezone: {get_input: timezone}
                 control_virtual_interface: {get_input: control_virtual_interface}
                 public_virtual_interface: {get_input: public_virtual_interface}
                 tripleo::loadbalancer::control_virtual_interface: {get_input: control_virtual_interface}
                 tripleo::loadbalancer::public_virtual_interface: {get_input: public_virtual_interface}
                 tripleo::loadbalancer::haproxy_log_address: {get_input: haproxy_log_address}
-                # NOTE(jaosorior): The service certificate configuration for
-                # HAProxy was left commented because to properly use this, we
-                # need to be able to set up the keystone endpoints. And
-                # currently that is not possible, but is being addressed by
-                # other commits.  A subsequent commit will uncomment this.
-                #tripleo::loadbalancer::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
+                tripleo::loadbalancer::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
                 tripleo::packages::enable_install: {get_input: enable_package_install}
                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
 
@@ -1367,6 +1558,7 @@ resources:
   UpdateDeployment:
     type: OS::Heat::SoftwareDeployment
     properties:
+      name: UpdateDeployment
       config: {get_resource: UpdateConfig}
       server: {get_resource: Controller}
       input_values:
@@ -1392,6 +1584,9 @@ outputs:
   tenant_ip_address:
     description: IP address of the server in the tenant network
     value: {get_attr: [TenantPort, ip_address]}
+  management_ip_address:
+    description: IP address of the server in the management network
+    value: {get_attr: [ManagementPort, ip_address]}
   hostname:
     description: Hostname of the server
     value: {get_attr: [Controller, name]}
@@ -1407,9 +1602,10 @@ outputs:
       Server's IP address and hostname in the /etc/hosts format
     value:
       str_replace:
-        template: IP HOST.localdomain HOST CLOUDNAME
+        template: IP HOST.DOMAIN HOST CLOUDNAME
         params:
           IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
+          DOMAIN: {get_param: CloudDomain}
           HOST: {get_attr: [Controller, name]}
           CLOUDNAME: {get_param: CloudName}
   nova_server_resource: