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