Merge "Customize vcpu_pin_set in nova.conf"
[apex-tripleo-heat-templates.git] / puppet / controller.yaml
1 heat_template_version: 2016-10-14
2
3 description: >
4   OpenStack controller node configured by Puppet.
5
6 parameters:
7   controllerExtraConfig:
8     default: {}
9     description: |
10       Deprecated. Use ControllerExtraConfig via parameter_defaults instead.
11     type: json
12   ControllerExtraConfig:
13     default: {}
14     description: |
15       Controller specific hiera configuration data to inject into the cluster.
16     type: json
17   ControllerIPs:
18     default: {}
19     description: >
20       A network mapped list of IPs to assign to Controllers in the following form:
21       {
22         "internal_api": ["a.b.c.d", "e.f.g.h"],
23         ...
24       }
25     type: json
26   CorosyncIPv6:
27     default: false
28     description: Enable IPv6 in Corosync
29     type: boolean
30   Debug:
31     default: ''
32     description: Set to True to enable debugging on all services.
33     type: string
34   EnableFencing:
35     default: false
36     description: Whether to enable fencing in Pacemaker or not.
37     type: boolean
38   EnableLoadBalancer:
39     default: true
40     description: Whether to deploy a LoadBalancer on the Controller
41     type: boolean
42   ExtraConfig:
43     default: {}
44     description: |
45       Additional hieradata to inject into the cluster, note that
46       ControllerExtraConfig takes precedence over ExtraConfig.
47     type: json
48   FencingConfig:
49     default: {}
50     description: |
51       Pacemaker fencing configuration. The JSON should have
52       the following structure:
53         {
54           "devices": [
55             {
56               "agent": "AGENT_NAME",
57               "host_mac": "HOST_MAC_ADDRESS",
58               "params": {"PARAM_NAME": "PARAM_VALUE"}
59             }
60           ]
61         }
62       For instance:
63         {
64           "devices": [
65             {
66               "agent": "fence_xvm",
67               "host_mac": "52:54:00:aa:bb:cc",
68               "params": {
69                 "multicast_address": "225.0.0.12",
70                 "port": "baremetal_0",
71                 "manage_fw": true,
72                 "manage_key_file": true,
73                 "key_file": "/etc/fence_xvm.key",
74                 "key_file_password": "abcdef"
75               }
76             }
77           ]
78         }
79     type: json
80   OvercloudControlFlavor:
81     description: Flavor for control nodes to request when deploying.
82     default: baremetal
83     type: string
84     constraints:
85       - custom_constraint: nova.flavor
86   HorizonSecret:
87     description: Secret key for Django
88     type: string
89     hidden: true
90   controllerImage:
91     type: string
92     default: overcloud-full
93     constraints:
94       - custom_constraint: glance.image
95   ImageUpdatePolicy:
96     default: 'REBUILD_PRESERVE_EPHEMERAL'
97     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
98     type: string
99   InstanceNameTemplate:
100     default: 'instance-%08x'
101     description: Template string to be used to generate instance names
102     type: string
103   KeyName:
104     default: default
105     description: Name of an existing Nova key pair to enable SSH access to the instances
106     type: string
107     constraints:
108       - custom_constraint: nova.keypair
109   ManageFirewall:
110     default: false
111     description: Whether to manage IPtables rules.
112     type: boolean
113   MemcachedIPv6:
114     default: false
115     description: Enable IPv6 features in Memcached.
116     type: boolean
117   PurgeFirewallRules:
118     default: false
119     description: Whether IPtables rules should be purged before setting up the new ones.
120     type: boolean
121   NeutronMetadataProxySharedSecret:
122     description: Shared secret to prevent spoofing
123     type: string
124     hidden: true
125   NeutronPassword:
126     description: The password for the neutron service and db account, used by neutron agents.
127     type: string
128     hidden: true
129   NeutronPublicInterface:
130     default: nic1
131     description: What interface to bridge onto br-ex for network nodes.
132     type: string
133   NovaEnableDBPurge:
134     default: true
135     description: |
136         Whether to create cron job for purging soft deleted rows in Nova database.
137     type: boolean
138   NovaIPv6:
139     default: false
140     description: Enable IPv6 features in Nova
141     type: boolean
142   NovaPassword:
143     description: The password for the nova service and db account, used by nova-api.
144     type: string
145     hidden: true
146   PcsdPassword:
147     type: string
148     description: The password for the 'pcsd' user.
149     hidden: true
150   RedisPassword:
151     description: The password for Redis
152     type: string
153     hidden: true
154   RedisVirtualIP:
155     type: string
156     default: ''  # Has to be here because of the ignored empty value bug
157   RedisVirtualIPUri:
158     type: string
159     default: ''  # Has to be here because of the ignored empty value bug
160     description: An IP address which is wrapped in brackets in case of IPv6
161   SwiftRawDisks:
162     default: {}
163     description: 'A hash of additional raw devices to use as Swift backend (eg. {sdb: {}})'
164     type: json
165   UpgradeLevelNovaCompute:
166     type: string
167     description: Nova Compute upgrade level
168     default: ''
169   ServiceNetMap:
170     default: {}
171     description: Mapping of service_name -> network name. Typically set
172                  via parameter_defaults in the resource registry.
173     type: json
174   EndpointMap:
175     default: {}
176     description: Mapping of service endpoint -> protocol. Typically set
177                  via parameter_defaults in the resource registry.
178     type: json
179   UpdateIdentifier:
180     default: ''
181     type: string
182     description: >
183       Setting to a previously unused value during stack-update will trigger
184       package update on all nodes
185   Hostname:
186     type: string
187     default: '' # Defaults to Heat created hostname
188   HostnameMap:
189     type: json
190     default: {}
191     description: Optional mapping to override hostnames
192   NetworkDeploymentActions:
193     type: comma_delimited_list
194     description: >
195       Heat action when to apply network configuration changes
196     default: ['CREATE']
197   NodeIndex:
198     type: number
199     default: 0
200   SoftwareConfigTransport:
201     default: POLL_SERVER_CFN
202     description: |
203       How the server should receive the metadata required for software configuration.
204     type: string
205     constraints:
206     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
207   CloudDomain:
208     type: string
209     description: >
210       The DNS domain used for the hosts. This should match the dhcp_domain
211       configured in the Undercloud neutron. Defaults to localdomain.
212   ServerMetadata:
213     default: {}
214     description: >
215       Extra properties or metadata passed to Nova for the created nodes in
216       the overcloud. It's accessible via the Nova metadata API.
217     type: json
218   ControllerSchedulerHints:
219     type: json
220     description: Optional scheduler hints to pass to nova
221     default: {}
222   ServiceConfigSettings:
223     type: json
224     default: {}
225   ServiceNames:
226     type: comma_delimited_list
227     default: []
228   ConfigCommand:
229     type: string
230     description: Command which will be run whenever configuration data changes
231     default: os-refresh-config --timeout 14400
232
233 parameter_groups:
234 - label: deprecated
235   description: Do not use deprecated params, they will be removed.
236   parameters:
237   - controllerExtraConfig
238
239 resources:
240
241   Controller:
242     type: OS::TripleO::Server
243     metadata:
244       os-collect-config:
245         command: {get_param: ConfigCommand}
246     properties:
247       image: {get_param: controllerImage}
248       image_update_policy: {get_param: ImageUpdatePolicy}
249       flavor: {get_param: OvercloudControlFlavor}
250       key_name: {get_param: KeyName}
251       networks:
252         - network: ctlplane
253       user_data_format: SOFTWARE_CONFIG
254       user_data: {get_resource: UserData}
255       name:
256         str_replace:
257             template: {get_param: Hostname}
258             params: {get_param: HostnameMap}
259       software_config_transport: {get_param: SoftwareConfigTransport}
260       metadata: {get_param: ServerMetadata}
261       scheduler_hints: {get_param: ControllerSchedulerHints}
262
263   # Combine the NodeAdminUserData and NodeUserData mime archives
264   UserData:
265     type: OS::Heat::MultipartMime
266     properties:
267       parts:
268       - config: {get_resource: NodeAdminUserData}
269         type: multipart
270       - config: {get_resource: NodeUserData}
271         type: multipart
272
273   # Creates the "heat-admin" user if configured via the environment
274   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
275   NodeAdminUserData:
276     type: OS::TripleO::NodeAdminUserData
277
278   # For optional operator additional userdata
279   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
280   NodeUserData:
281     type: OS::TripleO::NodeUserData
282
283   ExternalPort:
284     type: OS::TripleO::Controller::Ports::ExternalPort
285     properties:
286       IPPool: {get_param: ControllerIPs}
287       NodeIndex: {get_param: NodeIndex}
288       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
289
290   InternalApiPort:
291     type: OS::TripleO::Controller::Ports::InternalApiPort
292     properties:
293       IPPool: {get_param: ControllerIPs}
294       NodeIndex: {get_param: NodeIndex}
295       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
296
297   StoragePort:
298     type: OS::TripleO::Controller::Ports::StoragePort
299     properties:
300       IPPool: {get_param: ControllerIPs}
301       NodeIndex: {get_param: NodeIndex}
302       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
303
304   StorageMgmtPort:
305     type: OS::TripleO::Controller::Ports::StorageMgmtPort
306     properties:
307       IPPool: {get_param: ControllerIPs}
308       NodeIndex: {get_param: NodeIndex}
309       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
310
311   TenantPort:
312     type: OS::TripleO::Controller::Ports::TenantPort
313     properties:
314       IPPool: {get_param: ControllerIPs}
315       NodeIndex: {get_param: NodeIndex}
316       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
317
318   ManagementPort:
319     type: OS::TripleO::Controller::Ports::ManagementPort
320     properties:
321       IPPool: {get_param: ControllerIPs}
322       NodeIndex: {get_param: NodeIndex}
323       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
324
325   NetIpMap:
326     type: OS::TripleO::Network::Ports::NetIpMap
327     properties:
328       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
329       ExternalIp: {get_attr: [ExternalPort, ip_address]}
330       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
331       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
332       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
333       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
334       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
335       StorageIp: {get_attr: [StoragePort, ip_address]}
336       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
337       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
338       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
339       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
340       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
341       TenantIp: {get_attr: [TenantPort, ip_address]}
342       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
343       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
344       ManagementIp: {get_attr: [ManagementPort, ip_address]}
345       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
346       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
347
348   NetworkConfig:
349     type: OS::TripleO::Controller::Net::SoftwareConfig
350     properties:
351       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
352       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
353       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
354       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
355       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
356       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
357       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
358
359   NetworkDeployment:
360     type: OS::TripleO::SoftwareDeployment
361     properties:
362       name: NetworkDeployment
363       config: {get_resource: NetworkConfig}
364       server: {get_resource: Controller}
365       actions: {get_param: NetworkDeploymentActions}
366       input_values:
367         bridge_name: br-ex
368         interface_name: {get_param: NeutronPublicInterface}
369
370   # Resource for site-specific injection of root certificate
371   NodeTLSCAData:
372     depends_on: NetworkDeployment
373     type: OS::TripleO::NodeTLSCAData
374     properties:
375       server: {get_resource: Controller}
376
377   # Resource for site-specific passing of private keys/certificates
378   NodeTLSData:
379     depends_on: NodeTLSCAData
380     type: OS::TripleO::NodeTLSData
381     properties:
382       server: {get_resource: Controller}
383       NodeIndex: {get_param: NodeIndex}
384
385
386   ControllerDeployment:
387     type: OS::TripleO::SoftwareDeployment
388     depends_on: NetworkDeployment
389     properties:
390       name: ControllerDeployment
391       config: {get_resource: ControllerConfig}
392       server: {get_resource: Controller}
393       input_values:
394         bootstack_nodeid: {get_attr: [Controller, name]}
395         horizon_secret: {get_param: HorizonSecret}
396         debug: {get_param: Debug}
397         keystone_identity_uri: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix] }
398         keystone_auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri] }
399         keystone_ec2_uri: { get_param: [EndpointMap, KeystoneEC2, uri] }
400         enable_fencing: {get_param: EnableFencing}
401         enable_load_balancer: {get_param: EnableLoadBalancer}
402         manage_firewall: {get_param: ManageFirewall}
403         purge_firewall_rules: {get_param: PurgeFirewallRules}
404         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
405         nova_enable_db_purge: {get_param: NovaEnableDBPurge}
406         nova_ipv6: {get_param: NovaIPv6}
407         corosync_ipv6: {get_param: CorosyncIPv6}
408         memcached_ipv6: {get_param: MemcachedIPv6}
409         nova_password: {get_param: NovaPassword}
410         upgrade_level_nova_compute: {get_param: UpgradeLevelNovaCompute}
411         instance_name_template: {get_param: InstanceNameTemplate}
412         fencing_config: {get_param: FencingConfig}
413         pcsd_password: {get_param: PcsdPassword}
414         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
415         glance_api_servers: { get_param: [EndpointMap, GlanceInternal, uri]}
416         neutron_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
417         nova_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
418         nova_metadata_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
419         horizon_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
420         horizon_subnet:
421           str_replace:
422             template: "['SUBNET']"
423             params:
424               SUBNET:
425                 get_attr:
426                   - NetIpMap
427                   - net_ip_map
428                   - str_replace:
429                       template: "NETWORK_subnet"
430                       params:
431                         NETWORK: {get_param: [ServiceNetMap, HorizonNetwork]}
432         redis_vip: {get_param: RedisVirtualIP}
433         ironic_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
434
435   # Map heat metadata into hiera datafiles
436   ControllerConfig:
437     type: OS::Heat::StructuredConfig
438     properties:
439       group: os-apply-config
440       config:
441         hiera:
442           hierarchy:
443             - '"%{::uuid}"'
444             - heat_config_%{::deploy_config_name}
445             - controller_extraconfig
446             - extraconfig
447             - service_configs
448             - service_names
449             - controller
450             - swift_devices_and_proxy # provided by SwiftDevicesAndProxyConfig
451             - bootstrap_node # provided by BootstrapNodeConfig
452             - all_nodes # provided by allNodesConfig
453             - vip_data # provided by vip-config
454             - '"%{::osfamily}"'
455             - cinder_dellsc_data # Optionally provided by ControllerExtraConfigPre
456             - cinder_netapp_data # Optionally provided by ControllerExtraConfigPre
457             - cinder_eqlx_data # Optionally provided by ControllerExtraConfigPre
458             - neutron_bigswitch_data # Optionally provided by ControllerExtraConfigPre
459             - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
460             - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
461             - midonet_data #Optionally provided by AllNodesExtraConfig
462             - cisco_aci_data # Optionally provided by ControllerExtraConfigPre
463           merge_behavior: deeper
464           datafiles:
465             service_names:
466               mapped_data:
467                 service_names: {get_param: ServiceNames}
468             service_configs:
469               mapped_data:
470                 map_replace:
471                   - {get_param: ServiceConfigSettings}
472                   - values: {get_attr: [NetIpMap, net_ip_map]}
473             controller_extraconfig:
474               mapped_data:
475                 map_merge:
476                   - {get_param: controllerExtraConfig}
477                   - {get_param: ControllerExtraConfig}
478             extraconfig:
479               mapped_data: {get_param: ExtraConfig}
480             controller:
481               mapped_data: # data supplied directly to this deployment configuration, etc
482                 bootstack_nodeid: {get_input: bootstack_nodeid}
483
484                 # Pacemaker
485                 enable_fencing: {get_input: enable_fencing}
486                 enable_load_balancer: {get_input: enable_load_balancer}
487                 hacluster_pwd: {get_input: pcsd_password}
488                 corosync_ipv6: {get_input: corosync_ipv6}
489                 tripleo::fencing::config: {get_input: fencing_config}
490
491                 # Neutron
492                 neutron::bind_host: {get_input: neutron_api_network}
493                 neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network}
494                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
495                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
496
497                 # Nova
498                 nova::upgrade_level_compute: {get_input: upgrade_level_nova_compute}
499                 nova::use_ipv6: {get_input: nova_ipv6}
500                 nova::api::api_bind_address: {get_input: nova_api_network}
501                 nova::api::metadata_listen: {get_input: nova_metadata_network}
502                 nova::glance_api_servers: {get_input: glance_api_servers}
503                 nova::api::neutron_metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
504                 nova::api::instance_name_template: {get_input: instance_name_template}
505                 nova::vncproxy::host: {get_input: nova_api_network}
506                 nova_enable_db_purge: {get_input: nova_enable_db_purge}
507
508                 # Horizon
509                 apache::mod::remoteip::proxy_ips: {get_input: horizon_subnet}
510                 apache::ip: {get_input: horizon_network}
511                 horizon::django_debug: {get_input: debug}
512                 horizon::secret_key: {get_input: horizon_secret}
513                 horizon::bind_address: {get_input: horizon_network}
514                 horizon::keystone_url: {get_input: keystone_auth_uri}
515
516                 # Redis
517                 redis_vip: {get_input: redis_vip}
518                 # Firewall
519                 tripleo::firewall::manage_firewall: {get_input: manage_firewall}
520                 tripleo::firewall::purge_firewall_rules: {get_input: purge_firewall_rules}
521                 # Misc
522                 memcached_ipv6: {get_input: memcached_ipv6}
523                 tripleo::haproxy::service_certificate: {get_attr: [NodeTLSData, deployed_ssl_certificate_path]}
524                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
525
526   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
527   ControllerExtraConfigPre:
528     depends_on: ControllerDeployment
529     type: OS::TripleO::ControllerExtraConfigPre
530     properties:
531         server: {get_resource: Controller}
532
533   # Hook for site-specific additional pre-deployment config,
534   # applying to all nodes, e.g node registration/unregistration
535   NodeExtraConfig:
536     depends_on: [ControllerExtraConfigPre, NodeTLSData]
537     type: OS::TripleO::NodeExtraConfig
538     properties:
539         server: {get_resource: Controller}
540
541   UpdateConfig:
542     type: OS::TripleO::Tasks::PackageUpdate
543
544   UpdateDeployment:
545     type: OS::Heat::SoftwareDeployment
546     properties:
547       name: UpdateDeployment
548       config: {get_resource: UpdateConfig}
549       server: {get_resource: Controller}
550       input_values:
551         update_identifier:
552           get_param: UpdateIdentifier
553
554 outputs:
555   ip_address:
556     description: IP address of the server in the ctlplane network
557     value: {get_attr: [Controller, networks, ctlplane, 0]}
558   external_ip_address:
559     description: IP address of the server in the external network
560     value: {get_attr: [ExternalPort, ip_address]}
561   internal_api_ip_address:
562     description: IP address of the server in the internal_api network
563     value: {get_attr: [InternalApiPort, ip_address]}
564   storage_ip_address:
565     description: IP address of the server in the storage network
566     value: {get_attr: [StoragePort, ip_address]}
567   storage_mgmt_ip_address:
568     description: IP address of the server in the storage_mgmt network
569     value: {get_attr: [StorageMgmtPort, ip_address]}
570   tenant_ip_address:
571     description: IP address of the server in the tenant network
572     value: {get_attr: [TenantPort, ip_address]}
573   management_ip_address:
574     description: IP address of the server in the management network
575     value: {get_attr: [ManagementPort, ip_address]}
576   hostname:
577     description: Hostname of the server
578     value: {get_attr: [Controller, name]}
579   hosts_entry:
580     description: >
581       Server's IP address and hostname in the /etc/hosts format
582     value:
583       str_replace:
584         template: |
585           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
586           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
587           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
588           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
589           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
590           TENANTIP TENANTHOST.DOMAIN TENANTHOST
591           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
592         params:
593           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
594           DOMAIN: {get_param: CloudDomain}
595           PRIMARYHOST: {get_attr: [Controller, name]}
596           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
597           EXTERNALHOST:
598             list_join:
599             - '.'
600             - - {get_attr: [Controller, name]}
601               - external
602           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
603           INTERNAL_APIHOST:
604             list_join:
605             - '.'
606             - - {get_attr: [Controller, name]}
607               - internalapi
608           STORAGEIP: {get_attr: [StoragePort, ip_address]}
609           STORAGEHOST:
610             list_join:
611             - '.'
612             - - {get_attr: [Controller, name]}
613               - storage
614           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
615           STORAGE_MGMTHOST:
616             list_join:
617             - '.'
618             - - {get_attr: [Controller, name]}
619               - storagemgmt
620           TENANTIP: {get_attr: [TenantPort, ip_address]}
621           TENANTHOST:
622             list_join:
623             - '.'
624             - - {get_attr: [Controller, name]}
625               - tenant
626           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
627           MANAGEMENTHOST:
628             list_join:
629             - '.'
630             - - {get_attr: [Controller, name]}
631               - management
632   nova_server_resource:
633     description: Heat resource handle for the Nova compute server
634     value:
635       {get_resource: Controller}
636   swift_device:
637     description: Swift device formatted for swift-ring-builder
638     value:
639       str_replace:
640         template:
641           list_join:
642             - ','
643             - ['r1z1-IP:%PORT%/d1']
644             - repeat:
645                 template: 'r1z1-IP:%PORT%/DEVICE'
646                 for_each:
647                   DEVICE: {get_param: SwiftRawDisks}
648         params:
649           IP:
650             get_attr:
651               - NetIpMap
652               - net_ip_map
653               - str_replace:
654                   template: "NETWORK_uri"
655                   params:
656                     NETWORK: {get_param: [ServiceNetMap, SwiftMgmtNetwork]}
657   swift_proxy_memcache:
658     description: Swift proxy-memcache value
659     value:
660       str_replace:
661         template: "IP:11211"
662         params:
663           IP:
664             get_attr:
665               - NetIpMap
666               - net_ip_map
667               - str_replace:
668                   template: "NETWORK_uri"
669                   params:
670                     NETWORK: {get_param: [ServiceNetMap, MemcachedNetwork]}
671   tls_key_modulus_md5:
672     description: MD5 checksum of the TLS Key Modulus
673     value: {get_attr: [NodeTLSData, key_modulus_md5]}
674   tls_cert_modulus_md5:
675     description: MD5 checksum of the TLS Certificate Modulus
676     value: {get_attr: [NodeTLSData, cert_modulus_md5]}