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