Changing the default port-binding configuration
[apex-tripleo-heat-templates.git] / puppet / blockstorage-role.yaml
1 heat_template_version: pike
2 description: 'OpenStack cinder storage configured by Puppet'
3 parameters:
4   BlockStorageImage:
5     default: overcloud-full
6     type: string
7     constraints:
8       - custom_constraint: glance.image
9   ExtraConfig:
10     default: {}
11     description: |
12       Additional hiera configuration to inject into the cluster. Note
13       that BlockStorageExtraConfig takes precedence over ExtraConfig.
14     type: json
15   BlockStorageExtraConfig:
16     default: {}
17     description: |
18       Role specific additional hiera configuration to inject into the cluster.
19     type: json
20   BlockStorageIPs:
21     default: {}
22     type: json
23   OvercloudBlockStorageFlavor:
24     description: Flavor for block storage nodes to request when deploying.
25     type: string
26     default: baremetal
27     constraints:
28       - custom_constraint: nova.flavor
29   KeyName:
30     default: default
31     description: Name of an existing Nova key pair to enable SSH access to the instances
32     type: string
33   UpdateIdentifier:
34     default: ''
35     type: string
36     description: >
37       Setting to a previously unused value during stack-update will trigger
38       package update on all nodes
39   Hostname:
40     type: string
41     default: '' # Defaults to Heat created hostname
42   HostnameMap:
43     type: json
44     default: {}
45     description: Optional mapping to override hostnames
46   ServiceNetMap:
47     default: {}
48     description: Mapping of service_name -> network name. Typically set
49                  via parameter_defaults in the resource registry.
50     type: json
51   EndpointMap:
52     default: {}
53     description: Mapping of service endpoint -> protocol. Typically set
54                  via parameter_defaults in the resource registry.
55     type: json
56   NetworkDeploymentActions:
57     type: comma_delimited_list
58     description: >
59       Heat action when to apply network configuration changes
60     default: ['CREATE']
61   SoftwareConfigTransport:
62     default: POLL_SERVER_CFN
63     description: |
64       How the server should receive the metadata required for software configuration.
65     type: string
66     constraints:
67     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
68   CloudDomain:
69     default: 'localdomain'
70     type: string
71     description: >
72       The DNS domain used for the hosts. This must match the
73       overcloud_domain_name configured on the undercloud.
74   BlockStorageServerMetadata:
75     default: {}
76     description: >
77       Extra properties or metadata passed to Nova for the created nodes in
78       the overcloud. It's accessible via the Nova metadata API. This option is
79       role-specific and is merged with the values given to the ServerMetadata
80       parameter.
81     type: json
82   ServerMetadata:
83     default: {}
84     description: >
85       Extra properties or metadata passed to Nova for the created nodes in
86       the overcloud. It's accessible via the Nova metadata API. This applies to
87       all roles and is merged with a role-specific metadata parameter.
88     type: json
89   BlockStorageSchedulerHints:
90     type: json
91     description: Optional scheduler hints to pass to nova
92     default: {}
93   NodeIndex:
94     type: number
95     default: 0
96   ServiceConfigSettings:
97     type: json
98     default: {}
99   ServiceNames:
100     type: comma_delimited_list
101     default: []
102   MonitoringSubscriptions:
103     type: comma_delimited_list
104     default: []
105   ServiceMetadataSettings:
106     type: json
107     default: {}
108   ConfigCommand:
109     type: string
110     description: Command which will be run whenever configuration data changes
111     default: os-refresh-config --timeout 14400
112   ConfigCollectSplay:
113     type: number
114     default: 30
115     description: |
116       Maximum amount of time to possibly to delay configuation collection
117       polling. Defaults to 30 seconds. Set to 0 to disable it which will cause
118       the configuration collection to occur as soon as the collection process
119       starts.  This setting is used to prevent the configuration collection
120       processes from polling all at the exact same time.
121   UpgradeInitCommand:
122     type: string
123     description: |
124       Command or script snippet to run on all overcloud nodes to
125       initialize the upgrade process. E.g. a repository switch.
126     default: ''
127   UpgradeInitCommonCommand:
128     type: string
129     description: |
130       Common commands required by the upgrades process. This should not
131       normally be modified by the operator and is set and unset in the
132       major-upgrade-composable-steps.yaml and major-upgrade-converge.yaml
133       environment files.
134     default: ''
135   DeploymentServerBlacklistDict:
136     default: {}
137     type: json
138     description: >
139       Map of server hostnames to blacklist from any triggered
140       deployments. If the value is 1, the server will be blacklisted. This
141       parameter is generated from the parent template.
142   RoleParameters:
143     type: json
144     description: Role Specific Parameters
145     default: {}
146   DeploymentSwiftDataMap:
147     type: json
148     description: |
149       Map of servers to Swift container and object for storing deployment data.
150       The keys are the Heat assigned hostnames, and the value is a map of the
151       container/object name in Swift. Example value:
152         overcloud-controller-0:
153           container: overcloud-controller
154           object: 0
155         overcloud-controller-1:
156           container: overcloud-controller
157           object: 1
158         overcloud-controller-2:
159           container: overcloud-controller
160           object: 2
161         overcloud-novacompute-0:
162           container: overcloud-compute
163           object: 0
164     default: {}
165
166 conditions:
167   server_not_blacklisted:
168     not:
169       equals:
170         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
171         - 1
172   deployment_swift_data_map_unset:
173     equals:
174       - get_param:
175           - DeploymentSwiftDataMap
176           - {get_param: Hostname}
177       - ""
178
179 resources:
180   BlockStorage:
181     type: OS::TripleO::BlockStorageServer
182     metadata:
183       os-collect-config:
184         command: {get_param: ConfigCommand}
185         splay: {get_param: ConfigCollectSplay}
186     properties:
187       image:
188         {get_param: BlockStorageImage}
189       flavor: {get_param: OvercloudBlockStorageFlavor}
190       key_name: {get_param: KeyName}
191       networks:
192         - network: ctlplane
193       user_data_format: SOFTWARE_CONFIG
194       user_data: {get_resource: UserData}
195       name:
196         str_replace:
197             template: {get_param: Hostname}
198             params: {get_param: HostnameMap}
199       software_config_transport: {get_param: SoftwareConfigTransport}
200       metadata:
201         map_merge:
202           - {get_param: ServerMetadata}
203           - {get_param: BlockStorageServerMetadata}
204           - {get_param: ServiceMetadataSettings}
205       scheduler_hints: {get_param: BlockStorageSchedulerHints}
206       deployment_swift_data:
207         if:
208           - deployment_swift_data_map_unset
209           - {}
210           - {get_param: [DeploymentSwiftDataMap,
211                          {get_param: Hostname}]}
212
213   # Combine the NodeAdminUserData and NodeUserData mime archives
214   UserData:
215     type: OS::Heat::MultipartMime
216     properties:
217       parts:
218       - config: {get_resource: NodeAdminUserData}
219         type: multipart
220       - config: {get_resource: NodeUserData}
221         type: multipart
222       - config: {get_resource: RoleUserData}
223         type: multipart
224
225   # Creates the "heat-admin" user if configured via the environment
226   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
227   NodeAdminUserData:
228     type: OS::TripleO::NodeAdminUserData
229
230   # For optional operator additional userdata
231   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
232   NodeUserData:
233     type: OS::TripleO::NodeUserData
234
235   # For optional operator role-specific userdata
236   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
237   RoleUserData:
238     type: OS::TripleO::BlockStorage::NodeUserData
239
240   ExternalPort:
241     type: OS::TripleO::BlockStorage::Ports::ExternalPort
242     properties:
243       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
244       IPPool: {get_param: BlockStorageIPs}
245       NodeIndex: {get_param: NodeIndex}
246
247   InternalApiPort:
248     type: OS::TripleO::BlockStorage::Ports::InternalApiPort
249     properties:
250       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
251       IPPool: {get_param: BlockStorageIPs}
252       NodeIndex: {get_param: NodeIndex}
253
254   StoragePort:
255     type: OS::TripleO::BlockStorage::Ports::StoragePort
256     properties:
257       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
258       IPPool: {get_param: BlockStorageIPs}
259       NodeIndex: {get_param: NodeIndex}
260
261   StorageMgmtPort:
262     type: OS::TripleO::BlockStorage::Ports::StorageMgmtPort
263     properties:
264       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
265       IPPool: {get_param: BlockStorageIPs}
266       NodeIndex: {get_param: NodeIndex}
267
268   TenantPort:
269     type: OS::TripleO::BlockStorage::Ports::TenantPort
270     properties:
271       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
272       IPPool: {get_param: BlockStorageIPs}
273       NodeIndex: {get_param: NodeIndex}
274
275   ManagementPort:
276     type: OS::TripleO::BlockStorage::Ports::ManagementPort
277     properties:
278       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
279       IPPool: {get_param: BlockStorageIPs}
280       NodeIndex: {get_param: NodeIndex}
281
282   NetworkConfig:
283     type: OS::TripleO::BlockStorage::Net::SoftwareConfig
284     properties:
285       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
286       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
287       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
288       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
289       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
290       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
291       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
292
293   NetIpMap:
294     type: OS::TripleO::Network::Ports::NetIpMap
295     properties:
296       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
297       ExternalIp: {get_attr: [ExternalPort, ip_address]}
298       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
299       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
300       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
301       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
302       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
303       StorageIp: {get_attr: [StoragePort, ip_address]}
304       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
305       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
306       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
307       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
308       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
309       TenantIp: {get_attr: [TenantPort, ip_address]}
310       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
311       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
312       ManagementIp: {get_attr: [ManagementPort, ip_address]}
313       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
314       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
315
316   NetHostMap:
317     type: OS::Heat::Value
318     properties:
319       type: json
320       value:
321         external:
322           fqdn:
323             list_join:
324             - '.'
325             - - {get_attr: [BlockStorage, name]}
326               - external
327               - {get_param: CloudDomain}
328           short:
329             list_join:
330             - '.'
331             - - {get_attr: [BlockStorage, name]}
332               - external
333         internal_api:
334           fqdn:
335             list_join:
336             - '.'
337             - - {get_attr: [BlockStorage, name]}
338               - internalapi
339               - {get_param: CloudDomain}
340           short:
341             list_join:
342             - '.'
343             - - {get_attr: [BlockStorage, name]}
344               - internalapi
345         storage:
346           fqdn:
347             list_join:
348             - '.'
349             - - {get_attr: [BlockStorage, name]}
350               - storage
351               - {get_param: CloudDomain}
352           short:
353             list_join:
354             - '.'
355             - - {get_attr: [BlockStorage, name]}
356               - storage
357         storage_mgmt:
358           fqdn:
359             list_join:
360             - '.'
361             - - {get_attr: [BlockStorage, name]}
362               - storagemgmt
363               - {get_param: CloudDomain}
364           short:
365             list_join:
366             - '.'
367             - - {get_attr: [BlockStorage, name]}
368               - storagemgmt
369         tenant:
370           fqdn:
371             list_join:
372             - '.'
373             - - {get_attr: [BlockStorage, name]}
374               - tenant
375               - {get_param: CloudDomain}
376           short:
377             list_join:
378             - '.'
379             - - {get_attr: [BlockStorage, name]}
380               - tenant
381         management:
382           fqdn:
383             list_join:
384             - '.'
385             - - {get_attr: [BlockStorage, name]}
386               - management
387               - {get_param: CloudDomain}
388           short:
389             list_join:
390             - '.'
391             - - {get_attr: [BlockStorage, name]}
392               - management
393         ctlplane:
394           fqdn:
395             list_join:
396             - '.'
397             - - {get_attr: [BlockStorage, name]}
398               - ctlplane
399               - {get_param: CloudDomain}
400           short:
401             list_join:
402             - '.'
403             - - {get_attr: [BlockStorage, name]}
404               - ctlplane
405
406   PreNetworkConfig:
407     type: OS::TripleO::BlockStorage::PreNetworkConfig
408     properties:
409       server: {get_resource: BlockStorage}
410       RoleParameters: {get_param: RoleParameters}
411       ServiceNames: {get_param: ServiceNames}
412       deployment_actions: {get_attr: [DeploymentActions, value]}
413
414   NetworkDeployment:
415     type: OS::TripleO::SoftwareDeployment
416     depends_on: PreNetworkConfig
417     properties:
418       name: NetworkDeployment
419       config: {get_resource: NetworkConfig}
420       server: {get_resource: BlockStorage}
421       actions:
422         if:
423           - server_not_blacklisted
424           - {get_param: NetworkDeploymentActions}
425           - []
426
427   BlockStorageUpgradeInitConfig:
428     type: OS::Heat::SoftwareConfig
429     properties:
430       group: script
431       config:
432         list_join:
433         - ''
434         - - "#!/bin/bash\n\n"
435           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
436           - get_param: UpgradeInitCommand
437           - get_param: UpgradeInitCommonCommand
438
439   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
440   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
441   BlockStorageUpgradeInitDeployment:
442     type: OS::Heat::SoftwareDeployment
443     depends_on: NetworkDeployment
444     properties:
445       name: BlockStorageUpgradeInitDeployment
446       server: {get_resource: BlockStorage}
447       config: {get_resource: BlockStorageUpgradeInitConfig}
448       actions:
449         if:
450           - server_not_blacklisted
451           - ['CREATE', 'UPDATE']
452           - []
453
454   BlockStorageDeployment:
455     type: OS::Heat::StructuredDeployment
456     depends_on: BlockStorageUpgradeInitDeployment
457     properties:
458       name: BlockStorageDeployment
459       server: {get_resource: BlockStorage}
460       config: {get_resource: BlockStorageConfig}
461       input_values:
462         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
463       actions:
464         if:
465           - server_not_blacklisted
466           - ['CREATE', 'UPDATE']
467           - []
468
469   # Map heat metadata into hiera datafiles
470   BlockStorageConfig:
471     type: OS::Heat::StructuredConfig
472     properties:
473       group: hiera
474       config:
475         hierarchy:
476           - '"%{::uuid}"'
477           - heat_config_%{::deploy_config_name}
478           - config_step
479           - volume_extraconfig
480           - extraconfig
481           - service_names
482           - service_configs
483           - volume
484           - bootstrap_node # provided by allNodesConfig
485           - all_nodes # provided by allNodesConfig
486           - vip_data # provided by allNodesConfig
487           - '"%{::osfamily}"'
488         merge_behavior: deeper
489         datafiles:
490           service_names:
491             service_names: {get_param: ServiceNames}
492             sensu::subscriptions: {get_param: MonitoringSubscriptions}
493           service_configs:
494             map_replace:
495               - {get_param: ServiceConfigSettings}
496               - values: {get_attr: [NetIpMap, net_ip_map]}
497           volume_extraconfig: {get_param: BlockStorageExtraConfig}
498           extraconfig: {get_param: ExtraConfig}
499           volume:
500             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
501             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
502             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
503             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
504             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
505             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
506             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
507             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
508
509   # Resource for site-specific injection of root certificate
510   NodeTLSCAData:
511     depends_on: BlockStorageDeployment
512     type: OS::TripleO::NodeTLSCAData
513     properties:
514       server: {get_resource: BlockStorage}
515
516   # Hook for site-specific additional pre-deployment config,
517   # applying to all nodes, e.g node registration/unregistration
518   NodeExtraConfig:
519     depends_on: NodeTLSCAData
520     type: OS::TripleO::NodeExtraConfig
521     # We have to use conditions here so that we don't break backwards
522     # compatibility with templates everywhere
523     condition: server_not_blacklisted
524     properties:
525         server: {get_resource: BlockStorage}
526
527   UpdateConfig:
528     type: OS::TripleO::Tasks::PackageUpdate
529
530   UpdateDeployment:
531     type: OS::Heat::SoftwareDeployment
532     depends_on: NetworkDeployment
533     properties:
534       name: UpdateDeployment
535       config: {get_resource: UpdateConfig}
536       server: {get_resource: BlockStorage}
537       input_values:
538         update_identifier:
539           get_param: UpdateIdentifier
540       actions:
541         if:
542           - server_not_blacklisted
543           - ['CREATE', 'UPDATE']
544           - []
545
546   DeploymentActions:
547     type: OS::Heat::Value
548     properties:
549       value:
550         if:
551           - server_not_blacklisted
552           - ['CREATE', 'UPDATE']
553           - []
554
555   SshHostPubKey:
556     type: OS::TripleO::Ssh::HostPubKey
557     depends_on: BlockStorageDeployment
558     properties:
559         server: {get_resource: BlockStorage}
560         deployment_actions: {get_attr: [DeploymentActions, value]}
561
562 outputs:
563   ip_address:
564     description: IP address of the server in the ctlplane network
565     value: {get_attr: [BlockStorage, networks, ctlplane, 0]}
566   hostname:
567     description: Hostname of the server
568     value: {get_attr: [BlockStorage, name]}
569   hostname_map:
570     description: Mapping of network names to hostnames
571     value:
572       external: {get_attr: [NetHostMap, value, external, fqdn]}
573       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
574       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
575       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
576       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
577       management: {get_attr: [NetHostMap, value, management, fqdn]}
578       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
579   hosts_entry:
580     value:
581       str_replace:
582         template: |
583           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
584           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
585           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
586           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
587           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
588           TENANTIP TENANTHOST.DOMAIN TENANTHOST
589           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
590           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
591         params:
592           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
593           DOMAIN: {get_param: CloudDomain}
594           PRIMARYHOST: {get_attr: [BlockStorage, name]}
595           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
596           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
597           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
598           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
599           STORAGEIP: {get_attr: [StoragePort, ip_address]}
600           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
601           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
602           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
603           TENANTIP: {get_attr: [TenantPort, ip_address]}
604           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
605           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
606           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
607           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
608           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
609   known_hosts_entry:
610     description: Entry for ssh known hosts
611     value:
612       str_replace:
613         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
614 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
615 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
616 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
617 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
618 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
619 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
620 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
621         params:
622           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
623           DOMAIN: {get_param: CloudDomain}
624           PRIMARYHOST: {get_attr: [BlockStorage, name]}
625           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
626           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
627           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
628           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
629           STORAGEIP: {get_attr: [StoragePort, ip_address]}
630           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
631           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
632           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
633           TENANTIP: {get_attr: [TenantPort, ip_address]}
634           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
635           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
636           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
637           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
638           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
639           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
640   nova_server_resource:
641     description: Heat resource handle for the block storage server
642     value:
643       {get_resource: BlockStorage}
644     condition: server_not_blacklisted
645   external_ip_address:
646     description: IP address of the server in the external network
647     value: {get_attr: [ExternalPort, ip_address]}
648   internal_api_ip_address:
649     description: IP address of the server in the internal_api network
650     value: {get_attr: [InternalApiPort, ip_address]}
651   storage_ip_address:
652     description: IP address of the server in the storage network
653     value: {get_attr: [StoragePort, ip_address]}
654   storage_mgmt_ip_address:
655     description: IP address of the server in the storage_mgmt network
656     value: {get_attr: [StorageMgmtPort, ip_address]}
657   tenant_ip_address:
658     description: IP address of the server in the tenant network
659     value: {get_attr: [TenantPort, ip_address]}
660   management_ip_address:
661     description: IP address of the server in the management network
662     value: {get_attr: [ManagementPort, ip_address]}
663   deployed_server_port_map:
664     description: |
665       Map of Heat created hostname of the server to ip address. This is the
666       hostname before it has been mapped with the HostnameMap parameter, and
667       the IP address from the ctlplane network. This map can be used to construct
668       the DeployedServerPortMap parameter when using split-stack.
669     value:
670       map_replace:
671         - hostname:
672             fixed_ips:
673               - ip_address: {get_attr: [BlockStorage, networks, ctlplane, 0]}
674         - keys:
675             hostname:
676               list_join:
677                 - '-'
678                 - - {get_param: Hostname}
679                   - ctlplane
680   deployed_server_deployment_swift_data_map:
681     description:
682       Map of Heat created hostname of the server to the Swift container and object
683       used to created the temporary url for metadata polling with
684       os-collect-config.
685     value:
686       map_replace:
687         - hostname:
688             container:
689               str_split:
690                 - '/'
691                 - {get_attr: [BlockStorage, os_collect_config, request, metadata_url]}
692                 - 5
693             object:
694               str_split:
695                 - '?'
696                 - str_split:
697                     - '/'
698                     - {get_attr: [BlockStorage, os_collect_config, request, metadata_url]}
699                     - 6
700                 - 0
701         - keys: {hostname: {get_param: Hostname}}
702   os_collect_config:
703     description: The os-collect-config configuration associated with this server resource
704     value: {get_attr: [BlockStorage, os_collect_config]}