Merge "Add network ExtraConfig hook"
[apex-tripleo-heat-templates.git] / puppet / controller.yaml
1 heat_template_version: 2016-04-08
2
3 description: >
4   OpenStack controller node configured by Puppet.
5
6 parameters:
7   AdminPassword:
8     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
9     type: string
10     hidden: true
11   AodhApiVirtualIP:
12     type: string
13     default: ''
14   AodhPassword:
15     description: The password for the aodh services.
16     type: string
17     hidden: true
18   #TODO(composable Redis): Remove the Redis password param
19   #As is used by ceilometer
20   CeilometerApiVirtualIP:
21     type: string
22     default: ''
23   CeilometerBackend:
24     default: 'mongodb'
25     description: The ceilometer backend type.
26     type: string
27   CeilometerMeteringSecret:
28     description: Secret shared by the ceilometer services.
29     type: string
30     hidden: true
31   CeilometerPassword:
32     description: The password for the ceilometer service  and db account.
33     type: string
34     hidden: true
35   CeilometerStoreEvents:
36     default: false
37     description: Whether to store events in ceilometer.
38     type: boolean
39   CeilometerMeterDispatcher:
40     default: 'database'
41     description: Dispatcher to process meter data
42     type: string
43     constraints:
44     - allowed_values: ['gnocchi', 'database']
45   CinderApiVirtualIP:
46     type: string
47     default: ''
48   CeilometerWorkers:
49     default: 0
50     description: Number of workers for Ceilometer service.
51     type: number
52   controllerExtraConfig:
53     default: {}
54     description: |
55       Deprecated. Use ControllerExtraConfig via parameter_defaults instead.
56     type: json
57   ControllerExtraConfig:
58     default: {}
59     description: |
60       Controller specific hiera configuration data to inject into the cluster.
61     type: json
62   ControllerIPs:
63     default: {}
64     description: >
65       A network mapped list of IPs to assign to Controllers in the following form:
66       {
67         "internal_api": ["a.b.c.d", "e.f.g.h"],
68         ...
69       }
70     type: json
71   ControlVirtualInterface:
72     default: 'br-ex'
73     description: Interface where virtual ip will be assigned.
74     type: string
75   CorosyncIPv6:
76     default: false
77     description: Enable IPv6 in Corosync
78     type: boolean
79   Debug:
80     default: ''
81     description: Set to True to enable debugging on all services.
82     type: string
83   EnableFencing:
84     default: false
85     description: Whether to enable fencing in Pacemaker or not.
86     type: boolean
87   EnableGalera:
88     default: true
89     description: Whether to use Galera instead of regular MariaDB.
90     type: boolean
91   EnableLoadBalancer:
92     default: true
93     description: Whether to deploy a LoadBalancer on the Controller
94     type: boolean
95   EnableCephStorage:
96     default: false
97     description: Whether to deploy Ceph Storage (OSD) on the Controller
98     type: boolean
99   EnableSwiftStorage:
100     default: true
101     description: Whether to enable Swift Storage on the Controller
102     type: boolean
103   ExtraConfig:
104     default: {}
105     description: |
106       Additional hieradata to inject into the cluster, note that
107       ControllerExtraConfig takes precedence over ExtraConfig.
108     type: json
109   FencingConfig:
110     default: {}
111     description: |
112       Pacemaker fencing configuration. The JSON should have
113       the following structure:
114         {
115           "devices": [
116             {
117               "agent": "AGENT_NAME",
118               "host_mac": "HOST_MAC_ADDRESS",
119               "params": {"PARAM_NAME": "PARAM_VALUE"}
120             }
121           ]
122         }
123       For instance:
124         {
125           "devices": [
126             {
127               "agent": "fence_xvm",
128               "host_mac": "52:54:00:aa:bb:cc",
129               "params": {
130                 "multicast_address": "225.0.0.12",
131                 "port": "baremetal_0",
132                 "manage_fw": true,
133                 "manage_key_file": true,
134                 "key_file": "/etc/fence_xvm.key",
135                 "key_file_password": "abcdef"
136               }
137             }
138           ]
139         }
140     type: json
141   Flavor:
142     description: Flavor for control nodes to request when deploying.
143     type: string
144     constraints:
145       - custom_constraint: nova.flavor
146   GnocchiBackend:
147     default: file
148     description: The short name of the Gnocchi backend to use. Should be one
149       of swift, rbd, or file
150     type: string
151     constraints:
152     - allowed_values: ['swift', 'file', 'rbd']
153   GnocchiIndexerBackend:
154     default: 'mysql'
155     description: The short name of the Gnocchi indexer backend to use.
156     type: string
157   GnocchiApiVirtualIP:
158     type: string
159     default: ''
160   GnocchiPassword:
161     description: The password for the gnocchi service and db account.
162     type: string
163     hidden: true
164   HAProxyStatsPassword:
165     description: Password for HAProxy stats endpoint
166     type: string
167   HAProxyStatsUser:
168     description: User for HAProxy stats endpoint
169     default: admin
170     type: string
171   HAProxySyslogAddress:
172     default: /dev/log
173     description: Syslog address where HAproxy will send its log
174     type: string
175   HeatAuthEncryptionKey:
176     description: Auth encryption key for heat-engine
177     type: string
178     hidden: true
179   HorizonAllowedHosts:
180     default: '*'
181     description: A list of IP/Hostname allowed to connect to horizon
182     type: comma_delimited_list
183   HorizonSecret:
184     description: Secret key for Django
185     type: string
186     hidden: true
187   Image:
188     type: string
189     default: overcloud-control
190     constraints:
191       - custom_constraint: glance.image
192   ImageUpdatePolicy:
193     default: 'REBUILD_PRESERVE_EPHEMERAL'
194     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
195     type: string
196   InstanceNameTemplate:
197     default: 'instance-%08x'
198     description: Template string to be used to generate instance names
199     type: string
200   KeyName:
201     default: default
202     description: Name of an existing Nova key pair to enable SSH access to the instances
203     type: string
204     constraints:
205       - custom_constraint: nova.keypair
206   KeystoneRegion:
207     type: string
208     default: 'regionOne'
209     description: Keystone region for endpoint
210   ManageFirewall:
211     default: false
212     description: Whether to manage IPtables rules.
213     type: boolean
214   MemcachedIPv6:
215     default: false
216     description: Enable IPv6 features in Memcached.
217     type: boolean
218   PurgeFirewallRules:
219     default: false
220     description: Whether IPtables rules should be purged before setting up the new ones.
221     type: boolean
222   SaharaApiVirtualIP:
223     type: string
224     default: ''
225   MysqlClusterUniquePart:
226     description: A unique identifier of the MySQL cluster the controller is in.
227     type: string
228     default: 'unset'  # Has to be here because of the ignored empty value bug
229     # Drop the validation: https://bugs.launchpad.net/tripleo/+bug/1405446
230     # constraints:
231     # - length: {min: 4, max: 10}
232   MysqlInnodbBufferPoolSize:
233     description: >
234         Specifies the size of the buffer pool in megabytes. Setting to
235         zero should be interpreted as "no value" and will defer to the
236         lower level default.
237     type: number
238     default: 0
239   MysqlMaxConnections:
240     description: Configures MySQL max_connections config setting
241     type: number
242     default: 4096
243   MysqlClustercheckPassword:
244     type: string
245     hidden: true
246   MysqlRootPassword:
247     type: string
248     hidden: true
249     default: ''  # Has to be here because of the ignored empty value bug
250   NeutronMetadataProxySharedSecret:
251     description: Shared secret to prevent spoofing
252     type: string
253     hidden: true
254   NeutronPassword:
255     description: The password for the neutron service and db account, used by neutron agents.
256     type: string
257     hidden: true
258   NeutronPublicInterface:
259     default: nic1
260     description: What interface to bridge onto br-ex for network nodes.
261     type: string
262   NeutronTenantMtu:
263     description: >
264       The default MTU for tenant networks. For VXLAN/GRE tunneling, this should
265       be at least 50 bytes smaller than the MTU on the physical network. This
266       value will be used to set the MTU on the virtual Ethernet device.
267       This number is related to the value of NeutronDnsmasqOptions, since that
268       will determine the MTU that is assigned to the VM host through DHCP.
269     default: 1400
270     type: number
271   NovaApiVirtualIP:
272     type: string
273     default: ''
274   NovaEnableDBPurge:
275     default: true
276     description: |
277         Whether to create cron job for purging soft deleted rows in Nova database.
278     type: boolean
279   NovaIPv6:
280     default: false
281     description: Enable IPv6 features in Nova
282     type: boolean
283   NovaPassword:
284     description: The password for the nova service and db account, used by nova-api.
285     type: string
286     hidden: true
287   PcsdPassword:
288     type: string
289     description: The password for the 'pcsd' user.
290     hidden: true
291   PublicVirtualInterface:
292     default: 'br-ex'
293     description: >
294         Specifies the interface where the public-facing virtual ip will be assigned.
295         This should be int_public when a VLAN is being used.
296     type: string
297   PublicVirtualIP:
298     type: string
299     default: ''  # Has to be here because of the ignored empty value bug
300   RabbitCookie:
301     type: string
302     default: ''  # Has to be here because of the ignored empty value bug
303     hidden: true
304   RabbitPassword:
305     description: The password for RabbitMQ
306     type: string
307     hidden: true
308   RabbitUserName:
309     default: guest
310     description: The username for RabbitMQ
311     type: string
312   RabbitClientUseSSL:
313     default: false
314     description: >
315         Rabbit client subscriber parameter to specify
316         an SSL connection to the RabbitMQ host.
317     type: string
318   RabbitClientPort:
319     default: 5672
320     description: Set rabbit subscriber port, change this if using SSL
321     type: number
322   RedisPassword:
323     description: The password for Redis
324     type: string
325     hidden: true
326   RedisVirtualIP:
327     type: string
328     default: ''  # Has to be here because of the ignored empty value bug
329   RedisVirtualIPUri:
330     type: string
331     default: ''  # Has to be here because of the ignored empty value bug
332     description: An IP address which is wrapped in brackets in case of IPv6
333   SnmpdReadonlyUserName:
334     default: ro_snmp_user
335     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
336     type: string
337   SnmpdReadonlyUserPassword:
338     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
339     type: string
340     hidden: true
341   SwiftHashSuffix:
342     description: A random string to be used as a salt when hashing to determine mappings
343       in the ring.
344     hidden: true
345     type: string
346   SwiftMountCheck:
347     default: 'false'
348     description: Value of mount_check in Swift account/container/object -server.conf
349     type: boolean
350   SwiftMinPartHours:
351     type: number
352     default: 1
353     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
354   SwiftPartPower:
355     default: 10
356     description: Partition Power to use when building Swift rings
357     type: number
358   SwiftRingBuild:
359     default: true
360     description: Whether to manage Swift rings or not
361     type: boolean
362   SwiftProxyVirtualIP:
363     type: string
364     default: ''
365   SwiftReplicas:
366     type: number
367     default: 3
368     description: How many replicas to use in the swift rings.
369   TimeZone:
370     default: 'UTC'
371     description: The timezone to be set on controller nodes.
372     type: string
373   UpgradeLevelNovaCompute:
374     type: string
375     description: Nova Compute upgrade level
376     default: ''
377   VirtualIP: # DEPRECATED: use per service settings instead
378     type: string
379     default: ''  # Has to be here because of the ignored empty value bug
380   HeatApiVirtualIP:
381     type: string
382     default: ''
383   HeatApiVirtualIPUri:
384     type: string
385     default: ''
386   MysqlVirtualIP:
387     type: string
388     default: ''
389   NeutronApiVirtualIP:
390     type: string
391     default: ''
392   EnablePackageInstall:
393     default: 'false'
394     description: Set to true to enable package installation via Puppet
395     type: boolean
396   ServiceNetMap:
397     default: {}
398     description: Mapping of service_name -> network name. Typically set
399                  via parameter_defaults in the resource registry.
400     type: json
401   EndpointMap:
402     default: {}
403     description: Mapping of service endpoint -> protocol. Typically set
404                  via parameter_defaults in the resource registry.
405     type: json
406   UpdateIdentifier:
407     default: ''
408     type: string
409     description: >
410       Setting to a previously unused value during stack-update will trigger
411       package update on all nodes
412   Hostname:
413     type: string
414     default: '' # Defaults to Heat created hostname
415   HostnameMap:
416     type: json
417     default: {}
418     description: Optional mapping to override hostnames
419   NetworkDeploymentActions:
420     type: comma_delimited_list
421     description: >
422       Heat action when to apply network configuration changes
423     default: ['CREATE']
424   NodeIndex:
425     type: number
426     default: 0
427   SoftwareConfigTransport:
428     default: POLL_SERVER_CFN
429     description: |
430       How the server should receive the metadata required for software configuration.
431     type: string
432     constraints:
433     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
434   CloudDomain:
435     default: ''
436     type: string
437     description: >
438       The DNS domain used for the hosts. This should match the dhcp_domain
439       configured in the Undercloud neutron. Defaults to localdomain.
440   ServerMetadata:
441     default: {}
442     description: >
443       Extra properties or metadata passed to Nova for the created nodes in
444       the overcloud. It's accessible via the Nova metadata API.
445     type: json
446   SchedulerHints:
447     type: json
448     description: Optional scheduler hints to pass to nova
449     default: {}
450   ServiceConfigSettings:
451     type: json
452     default: {}
453
454 parameter_groups:
455 - label: deprecated
456   description: Do not use deprecated params, they will be removed.
457   parameters:
458   - controllerExtraConfig
459
460 resources:
461
462   Controller:
463     type: OS::Nova::Server
464     properties:
465       image: {get_param: Image}
466       image_update_policy: {get_param: ImageUpdatePolicy}
467       flavor: {get_param: Flavor}
468       key_name: {get_param: KeyName}
469       networks:
470         - network: ctlplane
471       user_data_format: SOFTWARE_CONFIG
472       user_data: {get_resource: UserData}
473       name:
474         str_replace:
475             template: {get_param: Hostname}
476             params: {get_param: HostnameMap}
477       software_config_transport: {get_param: SoftwareConfigTransport}
478       metadata: {get_param: ServerMetadata}
479       scheduler_hints: {get_param: SchedulerHints}
480
481   # Combine the NodeAdminUserData and NodeUserData mime archives
482   UserData:
483     type: OS::Heat::MultipartMime
484     properties:
485       parts:
486       - config: {get_resource: NodeAdminUserData}
487         type: multipart
488       - config: {get_resource: NodeUserData}
489         type: multipart
490
491   # Creates the "heat-admin" user if configured via the environment
492   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
493   NodeAdminUserData:
494     type: OS::TripleO::NodeAdminUserData
495
496   # For optional operator additional userdata
497   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
498   NodeUserData:
499     type: OS::TripleO::NodeUserData
500
501   ExternalPort:
502     type: OS::TripleO::Controller::Ports::ExternalPort
503     properties:
504       IPPool: {get_param: ControllerIPs}
505       NodeIndex: {get_param: NodeIndex}
506       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
507
508   InternalApiPort:
509     type: OS::TripleO::Controller::Ports::InternalApiPort
510     properties:
511       IPPool: {get_param: ControllerIPs}
512       NodeIndex: {get_param: NodeIndex}
513       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
514
515   StoragePort:
516     type: OS::TripleO::Controller::Ports::StoragePort
517     properties:
518       IPPool: {get_param: ControllerIPs}
519       NodeIndex: {get_param: NodeIndex}
520       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
521
522   StorageMgmtPort:
523     type: OS::TripleO::Controller::Ports::StorageMgmtPort
524     properties:
525       IPPool: {get_param: ControllerIPs}
526       NodeIndex: {get_param: NodeIndex}
527       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
528
529   TenantPort:
530     type: OS::TripleO::Controller::Ports::TenantPort
531     properties:
532       IPPool: {get_param: ControllerIPs}
533       NodeIndex: {get_param: NodeIndex}
534       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
535
536   ManagementPort:
537     type: OS::TripleO::Controller::Ports::ManagementPort
538     properties:
539       IPPool: {get_param: ControllerIPs}
540       NodeIndex: {get_param: NodeIndex}
541       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
542
543   NetIpMap:
544     type: OS::TripleO::Network::Ports::NetIpMap
545     properties:
546       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
547       ExternalIp: {get_attr: [ExternalPort, ip_address]}
548       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
549       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
550       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
551       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
552       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
553       StorageIp: {get_attr: [StoragePort, ip_address]}
554       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
555       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
556       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
557       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
558       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
559       TenantIp: {get_attr: [TenantPort, ip_address]}
560       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
561       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
562       ManagementIp: {get_attr: [ManagementPort, ip_address]}
563       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
564       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
565
566   NetworkConfig:
567     type: OS::TripleO::Controller::Net::SoftwareConfig
568     properties:
569       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
570       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
571       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
572       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
573       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
574       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
575       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
576
577   NetworkDeployment:
578     type: OS::TripleO::SoftwareDeployment
579     properties:
580       name: NetworkDeployment
581       config: {get_resource: NetworkConfig}
582       server: {get_resource: Controller}
583       actions: {get_param: NetworkDeploymentActions}
584       input_values:
585         bridge_name: br-ex
586         interface_name: {get_param: NeutronPublicInterface}
587
588   # Resource for site-specific injection of root certificate
589   NodeTLSCAData:
590     depends_on: NetworkDeployment
591     type: OS::TripleO::NodeTLSCAData
592     properties:
593       server: {get_resource: Controller}
594
595   # Resource for site-specific passing of private keys/certificates
596   NodeTLSData:
597     depends_on: NodeTLSCAData
598     type: OS::TripleO::NodeTLSData
599     properties:
600       server: {get_resource: Controller}
601       NodeIndex: {get_param: NodeIndex}
602
603
604   ControllerDeployment:
605     type: OS::TripleO::SoftwareDeployment
606     depends_on: NetworkDeployment
607     properties:
608       name: ControllerDeployment
609       config: {get_resource: ControllerConfig}
610       server: {get_resource: Controller}
611       input_values:
612         bootstack_nodeid: {get_attr: [Controller, name]}
613         ceilometer_workers: {get_param: CeilometerWorkers}
614         haproxy_log_address: {get_param: HAProxySyslogAddress}
615         haproxy_stats_password: {get_param: HAProxyStatsPassword}
616         haproxy_stats_user: {get_param: HAProxyStatsUser}
617         heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey}
618         horizon_allowed_hosts: {get_param: HorizonAllowedHosts}
619         horizon_secret: {get_param: HorizonSecret}
620         admin_password: {get_param: AdminPassword}
621         debug: {get_param: Debug}
622         cinder_public_url: {get_param: [EndpointMap, CinderPublic, uri]}
623         cinder_internal_url: {get_param: [EndpointMap, CinderInternal, uri]}
624         cinder_admin_url: {get_param: [EndpointMap, CinderAdmin, uri]}
625         cinder_public_url_v2: {get_param: [EndpointMap, CinderV2Public, uri]}
626         cinder_internal_url_v2: {get_param: [EndpointMap, CinderV2Internal, uri]}
627         cinder_admin_url_v2: {get_param: [EndpointMap, CinderV2Admin, uri]}
628         keystone_identity_uri: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix] }
629         keystone_auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri] }
630         keystone_ec2_uri: { get_param: [EndpointMap, KeystoneEC2, uri] }
631         enable_fencing: {get_param: EnableFencing}
632         enable_galera: {get_param: EnableGalera}
633         enable_load_balancer: {get_param: EnableLoadBalancer}
634         enable_ceph_storage: {get_param: EnableCephStorage}
635         enable_swift_storage: {get_param: EnableSwiftStorage}
636         manage_firewall: {get_param: ManageFirewall}
637         purge_firewall_rules: {get_param: PurgeFirewallRules}
638         mysql_innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
639         mysql_max_connections: {get_param: MysqlMaxConnections}
640         mysql_root_password: {get_param: MysqlRootPassword}
641         mysql_clustercheck_password: {get_param: MysqlClustercheckPassword}
642         mysql_cluster_name:
643           str_replace:
644             template: tripleo-CLUSTER
645             params:
646               CLUSTER: {get_param: MysqlClusterUniquePart}
647         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
648         neutron_password: {get_param: NeutronPassword}
649         neutron_tenant_mtu: {get_param: NeutronTenantMtu}
650         neutron_internal_url: { get_param: [ EndpointMap, NeutronInternal, uri ] }
651         neutron_public_url: { get_param: [ EndpointMap, NeutronPublic, uri ] }
652         neutron_admin_url: { get_param: [ EndpointMap, NeutronAdmin, uri ] }
653         neutron_auth_url: { get_param: [ EndpointMap, KeystoneV3Admin, uri ] }
654         nova_internal_url: { get_param: [ EndpointMap, NovaInternal, uri ] }
655         ceilometer_backend: {get_param: CeilometerBackend}
656         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
657         ceilometer_password: {get_param: CeilometerPassword}
658         ceilometer_store_events: {get_param: CeilometerStoreEvents}
659         aodh_password: {get_param: AodhPassword}
660         aodh_internal_url: { get_param: [ EndpointMap, AodhInternal, uri ] }
661         aodh_public_url: { get_param: [ EndpointMap, AodhPublic, uri ] }
662         aodh_admin_url: { get_param: [ EndpointMap, AodhAdmin, uri ] }
663         ceilometer_meter_dispatcher: {get_param: CeilometerMeterDispatcher}
664         gnocchi_password: {get_param: GnocchiPassword}
665         gnocchi_backend: {get_param: GnocchiBackend}
666         gnocchi_indexer_backend: {get_param: GnocchiIndexerBackend}
667         ceilometer_coordination_url:
668           list_join:
669             - ''
670             - - 'redis://:'
671               - {get_param: RedisPassword}
672               - '@'
673               - {get_param: RedisVirtualIPUri}
674               - ':6379/'
675         ceilometer_dsn:
676           list_join:
677             - ''
678             - - {get_param: [EndpointMap, MysqlInternal, protocol]}
679               - '://ceilometer:'
680               - {get_param: CeilometerPassword}
681               - '@'
682               - {get_param: [EndpointMap, MysqlInternal, host]}
683               - '/ceilometer'
684         gnocchi_dsn:
685           list_join:
686             - ''
687             - - {get_param: [EndpointMap, MysqlInternal, protocol]}
688               - '://gnocchi:'
689               - {get_param: GnocchiPassword}
690               - '@'
691               - {get_param: [EndpointMap, MysqlInternal, host]}
692               - '/gnocchi'
693         aodh_dsn:
694           list_join:
695             - ''
696             - - {get_param: [EndpointMap, MysqlInternal, protocol]}
697               - '://aodh:'
698               - {get_param: AodhPassword}
699               - '@'
700               - {get_param: [EndpointMap, MysqlInternal, host]}
701               - '/aodh'
702         gnocchi_internal_url: {get_param: [EndpointMap, GnocchiInternal, uri]}
703         gnocchi_public_url: { get_param: [ EndpointMap, GnocchiPublic, uri ] }
704         gnocchi_admin_url: { get_param: [ EndpointMap, GnocchiAdmin, uri ] }
705         ceilometer_public_url: {get_param: [EndpointMap, CeilometerPublic, uri]}
706         ceilometer_internal_url: {get_param: [EndpointMap, CeilometerInternal, uri]}
707         ceilometer_admin_url: {get_param: [EndpointMap, CeilometerAdmin, uri]}
708         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
709         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
710         nova_enable_db_purge: {get_param: NovaEnableDBPurge}
711         nova_ipv6: {get_param: NovaIPv6}
712         corosync_ipv6: {get_param: CorosyncIPv6}
713         memcached_ipv6: {get_param: MemcachedIPv6}
714         nova_password: {get_param: NovaPassword}
715         nova_dsn:
716           list_join:
717             - ''
718             - - {get_param: [EndpointMap, MysqlInternal, protocol]}
719               - '://nova:'
720               - {get_param: NovaPassword}
721               - '@'
722               - {get_param: [EndpointMap, MysqlInternal, host]}
723               - '/nova'
724         nova_api_dsn:
725           list_join:
726             - ''
727             - - {get_param: [EndpointMap, MysqlInternal, protocol]}
728               - '://nova_api:'
729               - {get_param: NovaPassword}
730               - '@'
731               - {get_param: [EndpointMap, MysqlInternal, host]}
732               - '/nova_api'
733         upgrade_level_nova_compute: {get_param: UpgradeLevelNovaCompute}
734         instance_name_template: {get_param: InstanceNameTemplate}
735         nova_public_url: {get_param: [EndpointMap, NovaPublic, uri]}
736         nova_internal_url: {get_param: [EndpointMap, NovaInternal, uri]}
737         nova_admin_url: {get_param: [EndpointMap, NovaAdmin, uri]}
738         fencing_config: {get_param: FencingConfig}
739         pcsd_password: {get_param: PcsdPassword}
740         rabbit_username: {get_param: RabbitUserName}
741         rabbit_password: {get_param: RabbitPassword}
742         rabbit_cookie: {get_param: RabbitCookie}
743         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
744         rabbit_client_port: {get_param: RabbitClientPort}
745         timezone: {get_param: TimeZone}
746         control_virtual_interface: {get_param: ControlVirtualInterface}
747         public_virtual_interface: {get_param: PublicVirtualInterface}
748         swift_hash_suffix: {get_param: SwiftHashSuffix}
749         swift_part_power: {get_param: SwiftPartPower}
750         swift_ring_build: {get_param: SwiftRingBuild}
751         swift_replicas: {get_param: SwiftReplicas}
752         swift_min_part_hours: {get_param: SwiftMinPartHours}
753         swift_mount_check: {get_param: SwiftMountCheck}
754         enable_package_install: {get_param: EnablePackageInstall}
755         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
756         swift_proxy_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
757         swift_management_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}
758         cinder_iscsi_network:
759           str_replace:
760             template: "'IP'"
761             params:
762               IP: {get_attr: [NetIpMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderIscsiNetwork]}]}
763         cinder_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
764         glance_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
765         glance_registry_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
766         glance_api_servers: { get_param: [EndpointMap, GlanceInternal, uri]}
767         heat_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
768         keystone_public_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
769         keystone_admin_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
770         keystone_region: {get_param: KeystoneRegion}
771         mongo_db_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
772         neutron_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
773         neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
774         ceilometer_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
775         aodh_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
776         gnocchi_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
777         nova_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
778         nova_metadata_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
779         horizon_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
780         horizon_subnet:
781           str_replace:
782             template: "['SUBNET']"
783             params:
784               SUBNET: {get_attr: [NetIpMap, net_ip_subnet_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
785         rabbitmq_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
786         redis_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
787         redis_vip: {get_param: RedisVirtualIP}
788         sahara_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
789         memcached_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
790         mysql_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
791         mysql_virtual_ip: {get_param: MysqlVirtualIP}
792         ceph_cluster_network: {get_attr: [NetIpMap, net_ip_subnet_map, {get_param: [ServiceNetMap, CephClusterNetwork]}]}
793         ceph_public_network: {get_attr: [NetIpMap, net_ip_subnet_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
794         ceph_public_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
795
796   # Map heat metadata into hiera datafiles
797   ControllerConfig:
798     type: OS::Heat::StructuredConfig
799     properties:
800       group: os-apply-config
801       config:
802         hiera:
803           hierarchy:
804             - '"%{::uuid}"'
805             - heat_config_%{::deploy_config_name}
806             - controller_extraconfig
807             - extraconfig
808             - service_configs
809             - controller
810             - database
811             - object
812             - swift_devices_and_proxy # provided by SwiftDevicesAndProxyConfig
813             - ceph_cluster # provided by CephClusterConfig
814             - ceph
815             - bootstrap_node # provided by BootstrapNodeConfig
816             - all_nodes # provided by allNodesConfig
817             - vip_data # provided by vip-config
818             - '"%{::osfamily}"'
819             - common
820             - network
821             - cinder_dellsc_data # Optionally provided by ControllerExtraConfigPre
822             - cinder_netapp_data # Optionally provided by ControllerExtraConfigPre
823             - cinder_eqlx_data # Optionally provided by ControllerExtraConfigPre
824             - neutron_bigswitch_data # Optionally provided by ControllerExtraConfigPre
825             - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
826             - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
827             - midonet_data #Optionally provided by AllNodesExtraConfig
828           merge_behavior: deeper
829           datafiles:
830             service_configs:
831               mapped_data: {get_param: ServiceConfigSettings}
832             controller_extraconfig:
833               mapped_data:
834                 map_merge:
835                   - {get_param: controllerExtraConfig}
836                   - {get_param: ControllerExtraConfig}
837             extraconfig:
838               mapped_data: {get_param: ExtraConfig}
839             common:
840               raw_data: {get_file: hieradata/common.yaml}
841             network:
842               mapped_data:
843                 net_ip_map: {get_attr: [NetIpMap, net_ip_map]}
844                 net_ip_subnet_map: {get_attr: [NetIpMap, net_ip_subnet_map]}
845                 net_ip_uri_map: {get_attr: [NetIpMap, net_ip_uri_map]}
846             ceph:
847               raw_data: {get_file: hieradata/ceph.yaml}
848               mapped_data:
849                 ceph::profile::params::cluster_network: {get_input: ceph_cluster_network}
850                 ceph::profile::params::public_network: {get_input: ceph_public_network}
851                 ceph::profile::params::public_addr: {get_input: ceph_public_ip}
852             database:
853               raw_data: {get_file: hieradata/database.yaml}
854             object:
855               raw_data: {get_file: hieradata/object.yaml}
856             controller:
857               raw_data: {get_file: hieradata/controller.yaml}
858               mapped_data: # data supplied directly to this deployment configuration, etc
859                 bootstack_nodeid: {get_input: bootstack_nodeid}
860
861                 # Pacemaker
862                 enable_fencing: {get_input: enable_fencing}
863                 enable_load_balancer: {get_input: enable_load_balancer}
864                 hacluster_pwd: {get_input: pcsd_password}
865                 corosync_ipv6: {get_input: corosync_ipv6}
866                 tripleo::fencing::config: {get_input: fencing_config}
867
868                 # Swift
869                 # FIXME: need to move proxy_local_net_ip into swift-proxy.yaml
870                 swift::proxy::proxy_local_net_ip: {get_input: swift_proxy_network}
871                 swift::storage::all::storage_local_net_ip: {get_input: swift_management_network}
872                 swift::swift_hash_path_suffix: {get_input: swift_hash_suffix}
873                 tripleo::ringbuilder::build_ring: { get_input: swift_ring_build }
874                 tripleo::ringbuilder::part_power: {get_input: swift_part_power}
875                 tripleo::ringbuilder::replicas: {get_input: swift_replicas}
876                 tripleo::ringbuilder::min_part_hours: {get_input: swift_min_part_hours}
877                 swift_mount_check: {get_input: swift_mount_check}
878
879                 # Cinder
880                 tripleo::profile::base::cinder::volume::iscsi::cinder_iscsi_address: {get_input: cinder_iscsi_network}
881                 cinder::api::bind_host: {get_input: cinder_api_network}
882                 cinder::keystone::auth::public_url: {get_input: cinder_public_url }
883                 cinder::keystone::auth::internal_url: {get_input: cinder_internal_url }
884                 cinder::keystone::auth::admin_url: {get_input: cinder_admin_url }
885                 cinder::keystone::auth::public_url_v2: {get_input: cinder_public_url_v2 }
886                 cinder::keystone::auth::internal_url_v2: {get_input: cinder_internal_url_v2 }
887                 cinder::keystone::auth::admin_url_v2: {get_input: cinder_admin_url_v2 }
888                 cinder::keystone::auth::password: {get_input: cinder_password }
889                 cinder::keystone::auth::region: {get_input: keystone_region}
890
891                 # Glance
892                 glance::api::bind_host: {get_input: glance_api_network}
893                 glance::registry::bind_host: {get_input: glance_registry_network}
894                 glance::keystone::auth::region: {get_input: keystone_region}
895
896                 # Heat
897                 heat::api::bind_host: {get_input: heat_api_network}
898                 heat::api_cloudwatch::bind_host: {get_input: heat_api_network}
899                 heat::api_cfn::bind_host: {get_input: heat_api_network}
900                 heat::engine::auth_encryption_key: {get_input: heat_auth_encryption_key}
901
902                 # Keystone
903                 keystone::admin_bind_host: {get_input: keystone_admin_api_network}
904                 keystone::public_bind_host: {get_input: keystone_public_api_network}
905                 keystone::wsgi::apache::bind_host: {get_input: keystone_public_api_network}
906                 keystone::wsgi::apache::admin_bind_host: {get_input: keystone_admin_api_network}
907
908                 # MongoDB
909                 mongodb::server::bind_ip: {get_input: mongo_db_network}
910
911                 # MySQL
912                 admin_password: {get_input: admin_password}
913                 enable_galera: {get_input: enable_galera}
914                 enable_ceph_storage: {get_input: enable_ceph_storage}
915                 enable_swift_storage: {get_input: enable_swift_storage}
916                 mysql_innodb_buffer_pool_size: {get_input: mysql_innodb_buffer_pool_size}
917                 mysql_max_connections: {get_input: mysql_max_connections}
918                 mysql::server::root_password: {get_input: mysql_root_password}
919                 mysql_clustercheck_password: {get_input: mysql_clustercheck_password}
920                 mysql_cluster_name: {get_input: mysql_cluster_name}
921                 mysql_bind_host: {get_input: mysql_network}
922                 mysql_virtual_ip: {get_input: mysql_virtual_ip}
923
924                 # Neutron
925                 neutron::bind_host: {get_input: neutron_api_network}
926                 neutron::network_device_mtu: {get_input: neutron_tenant_mtu}
927                 neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
928                 neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network}
929                 neutron::keystone::auth::public_url: {get_input: neutron_public_url }
930                 neutron::keystone::auth::internal_url: {get_input: neutron_internal_url }
931                 neutron::keystone::auth::admin_url: {get_input: neutron_admin_url }
932                 neutron::keystone::auth::password: {get_input: neutron_password }
933                 neutron::keystone::auth::region: {get_input: keystone_region}
934
935                 # Ceilometer
936                 ceilometer_backend: {get_input: ceilometer_backend}
937                 ceilometer_mysql_conn_string: {get_input: ceilometer_dsn}
938                 ceilometer::telemetry_secret: {get_input: ceilometer_metering_secret}
939                 ceilometer::rabbit_userid: {get_input: rabbit_username}
940                 ceilometer::rabbit_password: {get_input: rabbit_password}
941                 ceilometer::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
942                 ceilometer::rabbit_port: {get_input: rabbit_client_port}
943                 ceilometer::debug: {get_input: debug}
944                 ceilometer::api::host: {get_input: ceilometer_api_network}
945                 ceilometer::api::keystone_password: {get_input: ceilometer_password}
946                 ceilometer::api::auth_uri: {get_input: keystone_auth_uri}
947                 ceilometer::api::identity_uri: {get_input: keystone_identity_uri}
948                 ceilometer::agent::auth::auth_password: {get_input: ceilometer_password}
949                 ceilometer::agent::auth::auth_url: {get_input: keystone_auth_uri}
950                 ceilometer::agent::central::coordination_url: {get_input: ceilometer_coordination_url}
951                 ceilometer::agent::notification::store_events: {get_input: ceilometer_store_events}
952                 ceilometer::db::mysql::password: {get_input: ceilometer_password}
953                 ceilometer::collector::meter_dispatcher: {get_input: ceilometer_meter_dispatcher}
954                 ceilometer::dispatcher::gnocchi::url: {get_input: gnocchi_internal_url }
955                 ceilometer::dispatcher::gnocchi::filter_project: 'service'
956                 ceilometer::dispatcher::gnocchi::archive_policy: 'low'
957                 ceilometer::dispatcher::gnocchi::resources_definition_file: 'gnocchi_resources.yaml'
958                 ceilometer::keystone::auth::public_url: {get_input: ceilometer_public_url }
959                 ceilometer::keystone::auth::internal_url: {get_input: ceilometer_internal_url }
960                 ceilometer::keystone::auth::admin_url: {get_input: ceilometer_admin_url }
961                 ceilometer::keystone::auth::password: {get_input: ceilometer_password }
962                 ceilometer::keystone::auth::region: {get_input: keystone_region}
963                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
964                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
965
966                 # Aodh
967                 aodh_mysql_conn_string: {get_input: aodh_dsn}
968                 aodh::rabbit_userid: {get_input: rabbit_username}
969                 aodh::rabbit_password: {get_input: rabbit_password}
970                 aodh::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
971                 aodh::rabbit_port: {get_input: rabbit_client_port}
972                 aodh::debug: {get_input: debug}
973                 aodh::wsgi::apache::ssl: false
974                 aodh::wsgi::apache::bind_host: {get_input: aodh_api_network}
975                 aodh::api::service_name: 'httpd'
976                 aodh::api::host: {get_input: aodh_api_network}
977                 aodh::api::keystone_password: {get_input: aodh_password}
978                 aodh::api::keystone_auth_uri: {get_input: keystone_auth_uri}
979                 aodh::api::keystone_identity_uri: {get_input: keystone_identity_uri}
980                 aodh::auth::auth_url: {get_input: keystone_auth_uri}
981                 aodh::auth::auth_password: {get_input: aodh_password}
982                 aodh::db::mysql::password: {get_input: aodh_password}
983                 # for a migration path from ceilometer-alarm to aodh, we use the same database & coordination
984                 aodh::evaluator::coordination_url: {get_input: ceilometer_coordination_url}
985                 aodh::keystone::auth::public_url: {get_input: aodh_public_url }
986                 aodh::keystone::auth::internal_url: {get_input: aodh_internal_url }
987                 aodh::keystone::auth::admin_url: {get_input: aodh_admin_url }
988                 aodh::keystone::auth::password: {get_input: aodh_password }
989                 aodh::keystone::auth::region: {get_input: keystone_region}
990
991                 # Gnocchi
992                 gnocchi_backend: {get_input: gnocchi_backend}
993                 gnocchi_indexer_backend: {get_input: gnocchi_indexer_backend}
994                 gnocchi_mysql_conn_string: {get_input: gnocchi_dsn}
995                 gnocchi::debug: {get_input: debug}
996                 gnocchi::wsgi::apache::ssl: false
997                 gnocchi::wsgi::apache::bind_host: {get_input: gnocchi_api_network}
998                 gnocchi::api::service_name: 'httpd'
999                 gnocchi::api::host: {get_input: gnocchi_api_network}
1000                 gnocchi::api::keystone_password: {get_input: gnocchi_password}
1001                 gnocchi::api::keystone_auth_uri: {get_input: keystone_auth_uri}
1002                 gnocchi::api::keystone_identity_uri: {get_input: keystone_identity_uri}
1003                 gnocchi::db::mysql::password: {get_input: gnocchi_password}
1004                 gnocchi::storage::swift::swift_authurl: {get_input: keystone_auth_uri}
1005                 gnocchi::storage::swift::swift_key: {get_input: gnocchi_password}
1006                 gnocchi::keystone::auth::public_url: {get_input: gnocchi_public_url }
1007                 gnocchi::keystone::auth::internal_url: {get_input: gnocchi_internal_url }
1008                 gnocchi::keystone::auth::admin_url: {get_input: gnocchi_admin_url }
1009                 gnocchi::keystone::auth::password: {get_input: gnocchi_password }
1010                 gnocchi::keystone::auth::region: {get_input: keystone_region}
1011
1012                 # Nova
1013                 nova::upgrade_level_compute: {get_input: upgrade_level_nova_compute}
1014                 nova::use_ipv6: {get_input: nova_ipv6}
1015                 nova::api::auth_uri: {get_input: keystone_auth_uri}
1016                 nova::api::identity_uri: {get_input: keystone_identity_uri}
1017                 nova::api::api_bind_address: {get_input: nova_api_network}
1018                 nova::api::metadata_listen: {get_input: nova_metadata_network}
1019                 nova::api::admin_password: {get_input: nova_password}
1020                 nova::compute::network_device_mtu: {get_input: neutron_tenant_mtu}
1021                 nova::database_connection: {get_input: nova_dsn}
1022                 nova::api_database_connection: {get_input: nova_api_dsn}
1023                 nova::glance_api_servers: {get_input: glance_api_servers}
1024                 nova::api::neutron_metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
1025                 nova::api::instance_name_template: {get_input: instance_name_template}
1026                 nova::network::neutron::neutron_password: {get_input: neutron_password}
1027                 nova::network::neutron::neutron_url: {get_input: neutron_internal_url}
1028                 nova::network::neutron::neutron_auth_url: {get_input: neutron_auth_url}
1029                 nova::vncproxy::host: {get_input: nova_api_network}
1030                 nova::db::mysql::password: {get_input: nova_password}
1031                 nova::db::mysql_api::password: {get_input: nova_password}
1032                 nova_enable_db_purge: {get_input: nova_enable_db_purge}
1033                 nova::keystone::auth::public_url: {get_input: nova_public_url}
1034                 nova::keystone::auth::internal_url: {get_input: nova_internal_url}
1035                 nova::keystone::auth::admin_url: {get_input: nova_admin_url}
1036                 nova::keystone::auth::password: {get_input: nova_password }
1037                 nova::keystone::auth::region: {get_input: keystone_region}
1038
1039                 # Horizon
1040                 apache::mod::remoteip::proxy_ips: {get_input: horizon_subnet}
1041                 apache::ip: {get_input: horizon_network}
1042                 horizon::allowed_hosts: {get_input: horizon_allowed_hosts}
1043                 horizon::django_debug: {get_input: debug}
1044                 horizon::secret_key: {get_input: horizon_secret}
1045                 horizon::bind_address: {get_input: horizon_network}
1046                 horizon::keystone_url: {get_input: keystone_auth_uri}
1047
1048                 # RabbitMQ
1049                 rabbitmq::node_ip_address: {get_input: rabbitmq_network}
1050                 rabbitmq::erlang_cookie: {get_input: rabbit_cookie}
1051                 # Redis
1052                 redis::bind: {get_input: redis_network}
1053                 redis_vip: {get_input: redis_vip}
1054                 # Firewall
1055                 tripleo::firewall::manage_firewall: {get_input: manage_firewall}
1056                 tripleo::firewall::purge_firewall_rules: {get_input: purge_firewall_rules}
1057                 # Misc
1058                 memcached_ipv6: {get_input: memcached_ipv6}
1059                 memcached::listen_ip: {get_input: memcached_network}
1060                 timezone::timezone: {get_input: timezone}
1061                 control_virtual_interface: {get_input: control_virtual_interface}
1062                 public_virtual_interface: {get_input: public_virtual_interface}
1063                 tripleo::keepalived::control_virtual_interface: {get_input: control_virtual_interface}
1064                 tripleo::keepalived::public_virtual_interface: {get_input: public_virtual_interface}
1065                 tripleo::haproxy::control_virtual_interface: {get_input: control_virtual_interface}
1066                 tripleo::haproxy::public_virtual_interface: {get_input: public_virtual_interface}
1067                 tripleo::haproxy::haproxy_log_address: {get_input: haproxy_log_address}
1068                 tripleo::haproxy::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
1069                 tripleo::haproxy::haproxy_stats_user: {get_input: haproxy_stats_user}
1070                 tripleo::haproxy::haproxy_stats_password: {get_input: haproxy_stats_password}
1071                 tripleo::haproxy::redis_password: {get_input: redis_password}
1072                 tripleo::packages::enable_install: {get_input: enable_package_install}
1073                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
1074
1075   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
1076   ControllerExtraConfigPre:
1077     depends_on: ControllerDeployment
1078     type: OS::TripleO::ControllerExtraConfigPre
1079     properties:
1080         server: {get_resource: Controller}
1081
1082   # Hook for site-specific additional pre-deployment config,
1083   # applying to all nodes, e.g node registration/unregistration
1084   NodeExtraConfig:
1085     depends_on: [ControllerExtraConfigPre, NodeTLSData]
1086     type: OS::TripleO::NodeExtraConfig
1087     properties:
1088         server: {get_resource: Controller}
1089
1090   UpdateConfig:
1091     type: OS::TripleO::Tasks::PackageUpdate
1092
1093   UpdateDeployment:
1094     type: OS::Heat::SoftwareDeployment
1095     properties:
1096       name: UpdateDeployment
1097       config: {get_resource: UpdateConfig}
1098       server: {get_resource: Controller}
1099       input_values:
1100         update_identifier:
1101           get_param: UpdateIdentifier
1102
1103 outputs:
1104   ip_address:
1105     description: IP address of the server in the ctlplane network
1106     value: {get_attr: [Controller, networks, ctlplane, 0]}
1107   external_ip_address:
1108     description: IP address of the server in the external network
1109     value: {get_attr: [ExternalPort, ip_address]}
1110   internal_api_ip_address:
1111     description: IP address of the server in the internal_api network
1112     value: {get_attr: [InternalApiPort, ip_address]}
1113   storage_ip_address:
1114     description: IP address of the server in the storage network
1115     value: {get_attr: [StoragePort, ip_address]}
1116   storage_mgmt_ip_address:
1117     description: IP address of the server in the storage_mgmt network
1118     value: {get_attr: [StorageMgmtPort, ip_address]}
1119   tenant_ip_address:
1120     description: IP address of the server in the tenant network
1121     value: {get_attr: [TenantPort, ip_address]}
1122   management_ip_address:
1123     description: IP address of the server in the management network
1124     value: {get_attr: [ManagementPort, ip_address]}
1125   hostname:
1126     description: Hostname of the server
1127     value: {get_attr: [Controller, name]}
1128   hosts_entry:
1129     description: >
1130       Server's IP address and hostname in the /etc/hosts format
1131     value:
1132       str_replace:
1133         template: |
1134           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
1135           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
1136           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
1137           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
1138           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
1139           TENANTIP TENANTHOST.DOMAIN TENANTHOST
1140           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
1141         params:
1142           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
1143           DOMAIN: {get_param: CloudDomain}
1144           PRIMARYHOST: {get_attr: [Controller, name]}
1145           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
1146           EXTERNALHOST:
1147             list_join:
1148             - '.'
1149             - - {get_attr: [Controller, name]}
1150               - external
1151           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
1152           INTERNAL_APIHOST:
1153             list_join:
1154             - '.'
1155             - - {get_attr: [Controller, name]}
1156               - internalapi
1157           STORAGEIP: {get_attr: [StoragePort, ip_address]}
1158           STORAGEHOST:
1159             list_join:
1160             - '.'
1161             - - {get_attr: [Controller, name]}
1162               - storage
1163           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
1164           STORAGE_MGMTHOST:
1165             list_join:
1166             - '.'
1167             - - {get_attr: [Controller, name]}
1168               - storagemgmt
1169           TENANTIP: {get_attr: [TenantPort, ip_address]}
1170           TENANTHOST:
1171             list_join:
1172             - '.'
1173             - - {get_attr: [Controller, name]}
1174               - tenant
1175           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
1176           MANAGEMENTHOST:
1177             list_join:
1178             - '.'
1179             - - {get_attr: [Controller, name]}
1180               - management
1181   nova_server_resource:
1182     description: Heat resource handle for the Nova compute server
1183     value:
1184       {get_resource: Controller}
1185   swift_device:
1186     description: Swift device formatted for swift-ring-builder
1187     value:
1188       str_replace:
1189         template: 'r1z1-IP:%PORT%/d1'
1190         params:
1191           IP: {get_attr: [NetIpMap, net_ip_uri_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}
1192   swift_proxy_memcache:
1193     description: Swift proxy-memcache value
1194     value:
1195       str_replace:
1196         template: "IP:11211"
1197         params:
1198           IP: {get_attr: [NetIpMap, net_ip_uri_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
1199   config_identifier:
1200     description: identifier which changes if the controller configuration may need re-applying
1201     value:
1202       list_join:
1203         - ','
1204         - - {get_attr: [ControllerDeployment, deploy_stdout]}
1205           - {get_attr: [NodeTLSCAData, deploy_stdout]}
1206           - {get_attr: [NodeTLSData, deploy_stdout]}
1207           - {get_attr: [ControllerExtraConfigPre, deploy_stdout]}
1208           - {get_param: UpdateIdentifier}
1209   tls_key_modulus_md5:
1210     description: MD5 checksum of the TLS Key Modulus
1211     value: {get_attr: [NodeTLSData, key_modulus_md5]}
1212   tls_cert_modulus_md5:
1213     description: MD5 checksum of the TLS Certificate Modulus
1214     value: {get_attr: [NodeTLSData, cert_modulus_md5]}