Replace outdated instruction with link to upstream doc
[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
413   NetworkDeployment:
414     type: OS::TripleO::SoftwareDeployment
415     depends_on: PreNetworkConfig
416     properties:
417       name: NetworkDeployment
418       config: {get_resource: NetworkConfig}
419       server: {get_resource: BlockStorage}
420       actions:
421         if:
422           - server_not_blacklisted
423           - {get_param: NetworkDeploymentActions}
424           - []
425
426   BlockStorageUpgradeInitConfig:
427     type: OS::Heat::SoftwareConfig
428     properties:
429       group: script
430       config:
431         list_join:
432         - ''
433         - - "#!/bin/bash\n\n"
434           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
435           - get_param: UpgradeInitCommand
436           - get_param: UpgradeInitCommonCommand
437
438   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
439   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
440   BlockStorageUpgradeInitDeployment:
441     type: OS::Heat::SoftwareDeployment
442     depends_on: NetworkDeployment
443     properties:
444       name: BlockStorageUpgradeInitDeployment
445       server: {get_resource: BlockStorage}
446       config: {get_resource: BlockStorageUpgradeInitConfig}
447       actions:
448         if:
449           - server_not_blacklisted
450           - ['CREATE', 'UPDATE']
451           - []
452
453   BlockStorageDeployment:
454     type: OS::Heat::StructuredDeployment
455     depends_on: BlockStorageUpgradeInitDeployment
456     properties:
457       name: BlockStorageDeployment
458       server: {get_resource: BlockStorage}
459       config: {get_resource: BlockStorageConfig}
460       input_values:
461         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
462       actions:
463         if:
464           - server_not_blacklisted
465           - ['CREATE', 'UPDATE']
466           - []
467
468   # Map heat metadata into hiera datafiles
469   BlockStorageConfig:
470     type: OS::Heat::StructuredConfig
471     properties:
472       group: hiera
473       config:
474         hierarchy:
475           - '"%{::uuid}"'
476           - heat_config_%{::deploy_config_name}
477           - config_step
478           - volume_extraconfig
479           - extraconfig
480           - service_names
481           - service_configs
482           - volume
483           - bootstrap_node # provided by allNodesConfig
484           - all_nodes # provided by allNodesConfig
485           - vip_data # provided by allNodesConfig
486           - '"%{::osfamily}"'
487         merge_behavior: deeper
488         datafiles:
489           service_names:
490             service_names: {get_param: ServiceNames}
491             sensu::subscriptions: {get_param: MonitoringSubscriptions}
492           service_configs:
493             map_replace:
494               - {get_param: ServiceConfigSettings}
495               - values: {get_attr: [NetIpMap, net_ip_map]}
496           volume_extraconfig: {get_param: BlockStorageExtraConfig}
497           extraconfig: {get_param: ExtraConfig}
498           volume:
499             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
500             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
501             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
502             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
503             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
504             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
505             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
506             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
507
508   # Resource for site-specific injection of root certificate
509   NodeTLSCAData:
510     depends_on: BlockStorageDeployment
511     type: OS::TripleO::NodeTLSCAData
512     properties:
513       server: {get_resource: BlockStorage}
514
515   # Hook for site-specific additional pre-deployment config,
516   # applying to all nodes, e.g node registration/unregistration
517   NodeExtraConfig:
518     depends_on: NodeTLSCAData
519     type: OS::TripleO::NodeExtraConfig
520     properties:
521         server: {get_resource: BlockStorage}
522
523   UpdateConfig:
524     type: OS::TripleO::Tasks::PackageUpdate
525
526   UpdateDeployment:
527     type: OS::Heat::SoftwareDeployment
528     depends_on: NetworkDeployment
529     properties:
530       name: UpdateDeployment
531       config: {get_resource: UpdateConfig}
532       server: {get_resource: BlockStorage}
533       input_values:
534         update_identifier:
535           get_param: UpdateIdentifier
536       actions:
537         if:
538           - server_not_blacklisted
539           - ['CREATE', 'UPDATE']
540           - []
541
542   SshHostPubKey:
543     type: OS::TripleO::Ssh::HostPubKey
544     depends_on: BlockStorageDeployment
545     properties:
546         server: {get_resource: BlockStorage}
547
548 outputs:
549   ip_address:
550     description: IP address of the server in the ctlplane network
551     value: {get_attr: [BlockStorage, networks, ctlplane, 0]}
552   hostname:
553     description: Hostname of the server
554     value: {get_attr: [BlockStorage, name]}
555   hostname_map:
556     description: Mapping of network names to hostnames
557     value:
558       external: {get_attr: [NetHostMap, value, external, fqdn]}
559       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
560       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
561       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
562       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
563       management: {get_attr: [NetHostMap, value, management, fqdn]}
564       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
565   hosts_entry:
566     value:
567       str_replace:
568         template: |
569           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
570           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
571           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
572           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
573           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
574           TENANTIP TENANTHOST.DOMAIN TENANTHOST
575           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
576           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
577         params:
578           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
579           DOMAIN: {get_param: CloudDomain}
580           PRIMARYHOST: {get_attr: [BlockStorage, name]}
581           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
582           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
583           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
584           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
585           STORAGEIP: {get_attr: [StoragePort, ip_address]}
586           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
587           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
588           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
589           TENANTIP: {get_attr: [TenantPort, ip_address]}
590           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
591           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
592           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
593           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
594           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
595   known_hosts_entry:
596     description: Entry for ssh known hosts
597     value:
598       str_replace:
599         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
600 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
601 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
602 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
603 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
604 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
605 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
606 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
607         params:
608           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, BlockStorageHostnameResolveNetwork]}]}
609           DOMAIN: {get_param: CloudDomain}
610           PRIMARYHOST: {get_attr: [BlockStorage, name]}
611           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
612           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
613           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
614           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
615           STORAGEIP: {get_attr: [StoragePort, ip_address]}
616           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
617           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
618           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
619           TENANTIP: {get_attr: [TenantPort, ip_address]}
620           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
621           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
622           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
623           CTLPLANEIP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
624           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
625           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
626   nova_server_resource:
627     description: Heat resource handle for the block storage server
628     value:
629       {get_resource: BlockStorage}
630     condition: server_not_blacklisted
631   external_ip_address:
632     description: IP address of the server in the external network
633     value: {get_attr: [ExternalPort, ip_address]}
634   internal_api_ip_address:
635     description: IP address of the server in the internal_api network
636     value: {get_attr: [InternalApiPort, ip_address]}
637   storage_ip_address:
638     description: IP address of the server in the storage network
639     value: {get_attr: [StoragePort, ip_address]}
640   storage_mgmt_ip_address:
641     description: IP address of the server in the storage_mgmt network
642     value: {get_attr: [StorageMgmtPort, ip_address]}
643   tenant_ip_address:
644     description: IP address of the server in the tenant network
645     value: {get_attr: [TenantPort, ip_address]}
646   management_ip_address:
647     description: IP address of the server in the management network
648     value: {get_attr: [ManagementPort, ip_address]}
649   os_collect_config:
650     description: The os-collect-config configuration associated with this server resource
651     value: {get_attr: [BlockStorage, os_collect_config]}