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