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