Merge "Add split-stack environments"
[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   DeploymentSwiftDataMap:
146     type: json
147     description: |
148       Map of servers to Swift container and object for storing deployment data.
149       The keys are the Heat assigned hostnames, and the value is a map of the
150       container/object name in Swift. Example value:
151         overcloud-controller-0:
152           container: overcloud-controller
153           object: 0
154         overcloud-controller-1:
155           container: overcloud-controller
156           object: 1
157         overcloud-controller-2:
158           container: overcloud-controller
159           object: 2
160         overcloud-novacompute-0:
161           container: overcloud-compute
162           object: 0
163     default: {}
164
165 conditions:
166   server_not_blacklisted:
167     not:
168       equals:
169         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
170         - 1
171   deployment_swift_data_map_unset:
172     equals:
173       - get_param:
174           - DeploymentSwiftDataMap
175           - {get_param: Hostname}
176       - ""
177
178 resources:
179   BlockStorage:
180     type: OS::TripleO::BlockStorageServer
181     metadata:
182       os-collect-config:
183         command: {get_param: ConfigCommand}
184         splay: {get_param: ConfigCollectSplay}
185     properties:
186       image:
187         {get_param: BlockStorageImage}
188       flavor: {get_param: OvercloudBlockStorageFlavor}
189       key_name: {get_param: KeyName}
190       networks:
191         - network: ctlplane
192       user_data_format: SOFTWARE_CONFIG
193       user_data: {get_resource: UserData}
194       name:
195         str_replace:
196             template: {get_param: Hostname}
197             params: {get_param: HostnameMap}
198       software_config_transport: {get_param: SoftwareConfigTransport}
199       metadata:
200         map_merge:
201           - {get_param: ServerMetadata}
202           - {get_param: BlockStorageServerMetadata}
203           - {get_param: ServiceMetadataSettings}
204       scheduler_hints: {get_param: BlockStorageSchedulerHints}
205       deployment_swift_data:
206         if:
207           - deployment_swift_data_map_unset
208           - {}
209           - {get_param: [DeploymentSwiftDataMap,
210                          {get_param: Hostname}]}
211
212   # Combine the NodeAdminUserData and NodeUserData mime archives
213   UserData:
214     type: OS::Heat::MultipartMime
215     properties:
216       parts:
217       - config: {get_resource: NodeAdminUserData}
218         type: multipart
219       - config: {get_resource: NodeUserData}
220         type: multipart
221       - config: {get_resource: RoleUserData}
222         type: multipart
223
224   # Creates the "heat-admin" user if configured via the environment
225   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
226   NodeAdminUserData:
227     type: OS::TripleO::NodeAdminUserData
228
229   # For optional operator additional userdata
230   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
231   NodeUserData:
232     type: OS::TripleO::NodeUserData
233
234   # For optional operator role-specific userdata
235   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
236   RoleUserData:
237     type: OS::TripleO::BlockStorage::NodeUserData
238
239   ExternalPort:
240     type: OS::TripleO::BlockStorage::Ports::ExternalPort
241     properties:
242       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
243       IPPool: {get_param: BlockStorageIPs}
244       NodeIndex: {get_param: NodeIndex}
245
246   InternalApiPort:
247     type: OS::TripleO::BlockStorage::Ports::InternalApiPort
248     properties:
249       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
250       IPPool: {get_param: BlockStorageIPs}
251       NodeIndex: {get_param: NodeIndex}
252
253   StoragePort:
254     type: OS::TripleO::BlockStorage::Ports::StoragePort
255     properties:
256       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
257       IPPool: {get_param: BlockStorageIPs}
258       NodeIndex: {get_param: NodeIndex}
259
260   StorageMgmtPort:
261     type: OS::TripleO::BlockStorage::Ports::StorageMgmtPort
262     properties:
263       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
264       IPPool: {get_param: BlockStorageIPs}
265       NodeIndex: {get_param: NodeIndex}
266
267   TenantPort:
268     type: OS::TripleO::BlockStorage::Ports::TenantPort
269     properties:
270       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
271       IPPool: {get_param: BlockStorageIPs}
272       NodeIndex: {get_param: NodeIndex}
273
274   ManagementPort:
275     type: OS::TripleO::BlockStorage::Ports::ManagementPort
276     properties:
277       ControlPlaneIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
278       IPPool: {get_param: BlockStorageIPs}
279       NodeIndex: {get_param: NodeIndex}
280
281   NetworkConfig:
282     type: OS::TripleO::BlockStorage::Net::SoftwareConfig
283     properties:
284       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
285       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
286       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
287       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
288       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
289       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
290       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
291
292   NetIpMap:
293     type: OS::TripleO::Network::Ports::NetIpMap
294     properties:
295       ControlPlaneIp: {get_attr: [BlockStorage, networks, ctlplane, 0]}
296       ExternalIp: {get_attr: [ExternalPort, ip_address]}
297       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
298       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
299       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
300       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
301       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
302       StorageIp: {get_attr: [StoragePort, ip_address]}
303       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
304       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
305       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
306       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
307       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
308       TenantIp: {get_attr: [TenantPort, ip_address]}
309       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
310       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
311       ManagementIp: {get_attr: [ManagementPort, ip_address]}
312       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
313       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
314
315   NetHostMap:
316     type: OS::Heat::Value
317     properties:
318       type: json
319       value:
320         external:
321           fqdn:
322             list_join:
323             - '.'
324             - - {get_attr: [BlockStorage, name]}
325               - external
326               - {get_param: CloudDomain}
327           short:
328             list_join:
329             - '.'
330             - - {get_attr: [BlockStorage, name]}
331               - external
332         internal_api:
333           fqdn:
334             list_join:
335             - '.'
336             - - {get_attr: [BlockStorage, name]}
337               - internalapi
338               - {get_param: CloudDomain}
339           short:
340             list_join:
341             - '.'
342             - - {get_attr: [BlockStorage, name]}
343               - internalapi
344         storage:
345           fqdn:
346             list_join:
347             - '.'
348             - - {get_attr: [BlockStorage, name]}
349               - storage
350               - {get_param: CloudDomain}
351           short:
352             list_join:
353             - '.'
354             - - {get_attr: [BlockStorage, name]}
355               - storage
356         storage_mgmt:
357           fqdn:
358             list_join:
359             - '.'
360             - - {get_attr: [BlockStorage, name]}
361               - storagemgmt
362               - {get_param: CloudDomain}
363           short:
364             list_join:
365             - '.'
366             - - {get_attr: [BlockStorage, name]}
367               - storagemgmt
368         tenant:
369           fqdn:
370             list_join:
371             - '.'
372             - - {get_attr: [BlockStorage, name]}
373               - tenant
374               - {get_param: CloudDomain}
375           short:
376             list_join:
377             - '.'
378             - - {get_attr: [BlockStorage, name]}
379               - tenant
380         management:
381           fqdn:
382             list_join:
383             - '.'
384             - - {get_attr: [BlockStorage, name]}
385               - management
386               - {get_param: CloudDomain}
387           short:
388             list_join:
389             - '.'
390             - - {get_attr: [BlockStorage, name]}
391               - management
392         ctlplane:
393           fqdn:
394             list_join:
395             - '.'
396             - - {get_attr: [BlockStorage, name]}
397               - ctlplane
398               - {get_param: CloudDomain}
399           short:
400             list_join:
401             - '.'
402             - - {get_attr: [BlockStorage, name]}
403               - ctlplane
404
405   PreNetworkConfig:
406     type: OS::TripleO::BlockStorage::PreNetworkConfig
407     properties:
408       server: {get_resource: BlockStorage}
409       RoleParameters: {get_param: RoleParameters}
410
411   NetworkDeployment:
412     type: OS::TripleO::SoftwareDeployment
413     depends_on: PreNetworkConfig
414     properties:
415       name: NetworkDeployment
416       config: {get_resource: NetworkConfig}
417       server: {get_resource: BlockStorage}
418       actions:
419         if:
420           - server_not_blacklisted
421           - {get_param: NetworkDeploymentActions}
422           - []
423
424   BlockStorageUpgradeInitConfig:
425     type: OS::Heat::SoftwareConfig
426     properties:
427       group: script
428       config:
429         list_join:
430         - ''
431         - - "#!/bin/bash\n\n"
432           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
433           - get_param: UpgradeInitCommand
434           - get_param: UpgradeInitCommonCommand
435
436   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
437   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
438   BlockStorageUpgradeInitDeployment:
439     type: OS::Heat::SoftwareDeployment
440     depends_on: NetworkDeployment
441     properties:
442       name: BlockStorageUpgradeInitDeployment
443       server: {get_resource: BlockStorage}
444       config: {get_resource: BlockStorageUpgradeInitConfig}
445       actions:
446         if:
447           - server_not_blacklisted
448           - ['CREATE', 'UPDATE']
449           - []
450
451   BlockStorageDeployment:
452     type: OS::Heat::StructuredDeployment
453     depends_on: BlockStorageUpgradeInitDeployment
454     properties:
455       name: BlockStorageDeployment
456       server: {get_resource: BlockStorage}
457       config: {get_resource: BlockStorageConfig}
458       input_values:
459         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
460       actions:
461         if:
462           - server_not_blacklisted
463           - ['CREATE', 'UPDATE']
464           - []
465
466   # Map heat metadata into hiera datafiles
467   BlockStorageConfig:
468     type: OS::Heat::StructuredConfig
469     properties:
470       group: hiera
471       config:
472         hierarchy:
473           - '"%{::uuid}"'
474           - heat_config_%{::deploy_config_name}
475           - config_step
476           - volume_extraconfig
477           - extraconfig
478           - service_names
479           - service_configs
480           - volume
481           - bootstrap_node # provided by allNodesConfig
482           - all_nodes # provided by allNodesConfig
483           - vip_data # provided by allNodesConfig
484           - '"%{::osfamily}"'
485         merge_behavior: deeper
486         datafiles:
487           service_names:
488             service_names: {get_param: ServiceNames}
489             sensu::subscriptions: {get_param: MonitoringSubscriptions}
490           service_configs:
491             map_replace:
492               - {get_param: ServiceConfigSettings}
493               - values: {get_attr: [NetIpMap, net_ip_map]}
494           volume_extraconfig: {get_param: BlockStorageExtraConfig}
495           extraconfig: {get_param: ExtraConfig}
496           volume:
497             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
498             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
499             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
500             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
501             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
502             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
503             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
504             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
505
506   # Resource for site-specific injection of root certificate
507   NodeTLSCAData:
508     depends_on: BlockStorageDeployment
509     type: OS::TripleO::NodeTLSCAData
510     properties:
511       server: {get_resource: BlockStorage}
512
513   # Hook for site-specific additional pre-deployment config,
514   # applying to all nodes, e.g node registration/unregistration
515   NodeExtraConfig:
516     depends_on: NodeTLSCAData
517     type: OS::TripleO::NodeExtraConfig
518     properties:
519         server: {get_resource: BlockStorage}
520
521   UpdateConfig:
522     type: OS::TripleO::Tasks::PackageUpdate
523
524   UpdateDeployment:
525     type: OS::Heat::SoftwareDeployment
526     depends_on: NetworkDeployment
527     properties:
528       name: UpdateDeployment
529       config: {get_resource: UpdateConfig}
530       server: {get_resource: BlockStorage}
531       input_values:
532         update_identifier:
533           get_param: UpdateIdentifier
534       actions:
535         if:
536           - server_not_blacklisted
537           - ['CREATE', 'UPDATE']
538           - []
539
540   SshHostPubKey:
541     type: OS::TripleO::Ssh::HostPubKey
542     depends_on: BlockStorageDeployment
543     properties:
544         server: {get_resource: BlockStorage}
545
546 outputs:
547   ip_address:
548     description: IP address of the server in the ctlplane network
549     value: {get_attr: [BlockStorage, networks, ctlplane, 0]}
550   hostname:
551     description: Hostname of the server
552     value: {get_attr: [BlockStorage, name]}
553   hostname_map:
554     description: Mapping of network names to hostnames
555     value:
556       external: {get_attr: [NetHostMap, value, external, fqdn]}
557       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
558       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
559       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
560       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
561       management: {get_attr: [NetHostMap, value, management, fqdn]}
562       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
563   hosts_entry:
564     value:
565       str_replace:
566         template: |
567           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
568           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
569           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
570           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
571           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
572           TENANTIP TENANTHOST.DOMAIN TENANTHOST
573           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
574           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
575         params:
576           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
577           DOMAIN: {get_param: CloudDomain}
578           PRIMARYHOST: {get_attr: [BlockStorage, name]}
579           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
580           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
581           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
582           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
583           STORAGEIP: {get_attr: [StoragePort, ip_address]}
584           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
585           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
586           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
587           TENANTIP: {get_attr: [TenantPort, ip_address]}
588           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
589           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
590           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
591           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
592           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
593   known_hosts_entry:
594     description: Entry for ssh known hosts
595     value:
596       str_replace:
597         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
598 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
599 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
600 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
601 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
602 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
603 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
604 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
605         params:
606           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
607           DOMAIN: {get_param: CloudDomain}
608           PRIMARYHOST: {get_attr: [BlockStorage, name]}
609           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
610           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
611           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
612           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
613           STORAGEIP: {get_attr: [StoragePort, ip_address]}
614           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
615           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
616           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
617           TENANTIP: {get_attr: [TenantPort, ip_address]}
618           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
619           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
620           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
621           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
622           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
623           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
624   nova_server_resource:
625     description: Heat resource handle for the block storage server
626     value:
627       {get_resource: BlockStorage}
628     condition: server_not_blacklisted
629   external_ip_address:
630     description: IP address of the server in the external network
631     value: {get_attr: [ExternalPort, ip_address]}
632   internal_api_ip_address:
633     description: IP address of the server in the internal_api network
634     value: {get_attr: [InternalApiPort, ip_address]}
635   storage_ip_address:
636     description: IP address of the server in the storage network
637     value: {get_attr: [StoragePort, ip_address]}
638   storage_mgmt_ip_address:
639     description: IP address of the server in the storage_mgmt network
640     value: {get_attr: [StorageMgmtPort, ip_address]}
641   tenant_ip_address:
642     description: IP address of the server in the tenant network
643     value: {get_attr: [TenantPort, ip_address]}
644   management_ip_address:
645     description: IP address of the server in the management network
646     value: {get_attr: [ManagementPort, ip_address]}
647   os_collect_config:
648     description: The os-collect-config configuration associated with this server resource
649     value: {get_attr: [BlockStorage, os_collect_config]}