Merge "Fixup for manila-api containerized service"
[apex-tripleo-heat-templates.git] / puppet / objectstorage-role.yaml
1 heat_template_version: pike
2 description: 'OpenStack swift storage node configured by Puppet'
3 parameters:
4   OvercloudSwiftStorageFlavor:
5     description: Flavor for Swift storage nodes to request when deploying.
6     default: baremetal
7     type: string
8     constraints:
9       - custom_constraint: nova.flavor
10   SwiftStorageImage:
11     default: overcloud-full
12     type: string
13     constraints:
14       - custom_constraint: glance.image
15   KeyName:
16     default: default
17     description: Name of an existing Nova key pair to enable SSH access to the instances
18     type: string
19   UpdateIdentifier:
20     default: ''
21     type: string
22     description: >
23       Setting to a previously unused value during stack-update will trigger
24       package update on all nodes
25   ServiceNetMap:
26     default: {}
27     description: Mapping of service_name -> network name. Typically set
28                  via parameter_defaults in the resource registry.
29     type: json
30   EndpointMap:
31     default: {}
32     description: Mapping of service endpoint -> protocol. Typically set
33                  via parameter_defaults in the resource registry.
34     type: json
35   Hostname:
36     type: string
37     default: '' # Defaults to Heat created hostname
38   HostnameMap:
39     type: json
40     default: {}
41     description: Optional mapping to override hostnames
42   ExtraConfig:
43     default: {}
44     description: |
45       Additional hiera configuration to inject into the cluster. Note
46       that ObjectStorageExtraConfig takes precedence over ExtraConfig.
47     type: json
48   ObjectStorageExtraConfig:
49     default: {}
50     description: |
51       Role specific additional hiera configuration to inject into the cluster.
52     type: json
53   SwiftStorageIPs:
54     default: {}
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   SwiftStorageServerMetadata:
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   ObjectStorageSchedulerHints:
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
156   SwiftStorage:
157     type: OS::TripleO::ObjectStorageServer
158     metadata:
159       os-collect-config:
160         command: {get_param: ConfigCommand}
161         splay: {get_param: ConfigCollectSplay}
162     properties:
163       image: {get_param: SwiftStorageImage}
164       flavor: {get_param: OvercloudSwiftStorageFlavor}
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: SwiftStorageServerMetadata}
179           - {get_param: ServiceMetadataSettings}
180       scheduler_hints: {get_param: ObjectStorageSchedulerHints}
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::ObjectStorage::NodeUserData
208
209   ExternalPort:
210     type: OS::TripleO::SwiftStorage::Ports::ExternalPort
211     properties:
212       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
213       IPPool: {get_param: SwiftStorageIPs}
214       NodeIndex: {get_param: NodeIndex}
215
216   InternalApiPort:
217     type: OS::TripleO::SwiftStorage::Ports::InternalApiPort
218     properties:
219       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
220       IPPool: {get_param: SwiftStorageIPs}
221       NodeIndex: {get_param: NodeIndex}
222
223   StoragePort:
224     type: OS::TripleO::SwiftStorage::Ports::StoragePort
225     properties:
226       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
227       IPPool: {get_param: SwiftStorageIPs}
228       NodeIndex: {get_param: NodeIndex}
229
230   StorageMgmtPort:
231     type: OS::TripleO::SwiftStorage::Ports::StorageMgmtPort
232     properties:
233       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
234       IPPool: {get_param: SwiftStorageIPs}
235       NodeIndex: {get_param: NodeIndex}
236
237   TenantPort:
238     type: OS::TripleO::SwiftStorage::Ports::TenantPort
239     properties:
240       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
241       IPPool: {get_param: SwiftStorageIPs}
242       NodeIndex: {get_param: NodeIndex}
243
244   ManagementPort:
245     type: OS::TripleO::SwiftStorage::Ports::ManagementPort
246     properties:
247       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
248       IPPool: {get_param: SwiftStorageIPs}
249       NodeIndex: {get_param: NodeIndex}
250
251   NetworkConfig:
252     type: OS::TripleO::ObjectStorage::Net::SoftwareConfig
253     properties:
254       ControlPlaneIp: {get_attr: [SwiftStorage, 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: [SwiftStorage, 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: [SwiftStorage, name]}
295               - external
296               - {get_param: CloudDomain}
297           short:
298             list_join:
299             - '.'
300             - - {get_attr: [SwiftStorage, name]}
301               - external
302         internal_api:
303           fqdn:
304             list_join:
305             - '.'
306             - - {get_attr: [SwiftStorage, name]}
307               - internalapi
308               - {get_param: CloudDomain}
309           short:
310             list_join:
311             - '.'
312             - - {get_attr: [SwiftStorage, name]}
313               - internalapi
314         storage:
315           fqdn:
316             list_join:
317             - '.'
318             - - {get_attr: [SwiftStorage, name]}
319               - storage
320               - {get_param: CloudDomain}
321           short:
322             list_join:
323             - '.'
324             - - {get_attr: [SwiftStorage, name]}
325               - storage
326         storage_mgmt:
327           fqdn:
328             list_join:
329             - '.'
330             - - {get_attr: [SwiftStorage, name]}
331               - storagemgmt
332               - {get_param: CloudDomain}
333           short:
334             list_join:
335             - '.'
336             - - {get_attr: [SwiftStorage, name]}
337               - storagemgmt
338         tenant:
339           fqdn:
340             list_join:
341             - '.'
342             - - {get_attr: [SwiftStorage, name]}
343               - tenant
344               - {get_param: CloudDomain}
345           short:
346             list_join:
347             - '.'
348             - - {get_attr: [SwiftStorage, name]}
349               - tenant
350         management:
351           fqdn:
352             list_join:
353             - '.'
354             - - {get_attr: [SwiftStorage, name]}
355               - management
356               - {get_param: CloudDomain}
357           short:
358             list_join:
359             - '.'
360             - - {get_attr: [SwiftStorage, name]}
361               - management
362         ctlplane:
363           fqdn:
364             list_join:
365             - '.'
366             - - {get_attr: [SwiftStorage, name]}
367               - ctlplane
368               - {get_param: CloudDomain}
369           short:
370             list_join:
371             - '.'
372             - - {get_attr: [SwiftStorage, name]}
373               - ctlplane
374
375   PreNetworkConfig:
376     type: OS::TripleO::ObjectStorage::PreNetworkConfig
377     properties:
378       server: {get_resource: SwiftStorage}
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: SwiftStorage}
389       actions:
390         if:
391           - server_not_blacklisted
392           - {get_param: NetworkDeploymentActions}
393           - []
394
395
396   SwiftStorageUpgradeInitConfig:
397     type: OS::Heat::SoftwareConfig
398     properties:
399       group: script
400       config:
401         list_join:
402         - ''
403         - - "#!/bin/bash\n\n"
404           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
405           - get_param: UpgradeInitCommand
406           - get_param: UpgradeInitCommonCommand
407
408   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
409   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
410   SwiftStorageUpgradeInitDeployment:
411     type: OS::Heat::SoftwareDeployment
412     depends_on: NetworkDeployment
413     properties:
414       name: SwiftStorageUpgradeInitDeployment
415       server: {get_resource: SwiftStorage}
416       config: {get_resource: SwiftStorageUpgradeInitConfig}
417       actions:
418         if:
419           - server_not_blacklisted
420           - ['CREATE', 'UPDATE']
421           - []
422
423   SwiftStorageHieraConfig:
424     type: OS::Heat::StructuredConfig
425     properties:
426       group: hiera
427       config:
428         hierarchy:
429           - '"%{::uuid}"'
430           - heat_config_%{::deploy_config_name}
431           - config_step
432           - object_extraconfig
433           - extraconfig
434           - service_names
435           - service_configs
436           - object
437           - bootstrap_node # provided by allNodesConfig
438           - all_nodes # provided by allNodesConfig
439           - vip_data # provided by allNodesConfig
440           - '"%{::osfamily}"'
441         merge_behavior: deeper
442         datafiles:
443           service_names:
444             service_names: {get_param: ServiceNames}
445             sensu::subscriptions: {get_param: MonitoringSubscriptions}
446           service_configs:
447             map_replace:
448               - {get_param: ServiceConfigSettings}
449               - values: {get_attr: [NetIpMap, net_ip_map]}
450           object_extraconfig: {get_param: ObjectStorageExtraConfig}
451           extraconfig: {get_param: ExtraConfig}
452           object:
453             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
454             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
455             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
456             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
457             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
458             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
459             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
460             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
461
462   SwiftStorageHieraDeploy:
463     type: OS::Heat::StructuredDeployment
464     depends_on: SwiftStorageUpgradeInitDeployment
465     properties:
466       name: SwiftStorageHieraDeploy
467       server: {get_resource: SwiftStorage}
468       config: {get_resource: SwiftStorageHieraConfig}
469       input_values:
470         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
471       actions:
472         if:
473           - server_not_blacklisted
474           - ['CREATE', 'UPDATE']
475           - []
476
477   # Resource for site-specific injection of root certificate
478   NodeTLSCAData:
479     depends_on: SwiftStorageHieraDeploy
480     type: OS::TripleO::NodeTLSCAData
481     properties:
482       server: {get_resource: SwiftStorage}
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: SwiftStorage}
494
495   UpdateConfig:
496     type: OS::TripleO::Tasks::PackageUpdate
497
498   UpdateDeployment:
499     type: OS::Heat::SoftwareDeployment
500     depends_on: NetworkDeployment
501     properties:
502       config: {get_resource: UpdateConfig}
503       server: {get_resource: SwiftStorage}
504       input_values:
505         update_identifier:
506           get_param: UpdateIdentifier
507       actions:
508         if:
509           - server_not_blacklisted
510           - ['CREATE', 'UPDATE']
511           - []
512
513   DeploymentActions:
514     type: OS::Heat::Value
515     properties:
516       value:
517         if:
518           - server_not_blacklisted
519           - ['CREATE', 'UPDATE']
520           - []
521
522   SshHostPubKey:
523     type: OS::TripleO::Ssh::HostPubKey
524     depends_on: SwiftStorageHieraDeploy
525     properties:
526         server: {get_resource: SwiftStorage}
527         deployment_actions: {get_attr: [DeploymentActions, value]}
528
529 outputs:
530   ip_address:
531     description: IP address of the server in the ctlplane network
532     value: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
533   hostname:
534     description: Hostname of the server
535     value: {get_attr: [SwiftStorage, name]}
536   hostname_map:
537     description: Mapping of network names to hostnames
538     value:
539       external: {get_attr: [NetHostMap, value, external, fqdn]}
540       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
541       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
542       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
543       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
544       management: {get_attr: [NetHostMap, value, management, fqdn]}
545       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
546   hosts_entry:
547     value:
548       str_replace:
549         template: |
550           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
551           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
552           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
553           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
554           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
555           TENANTIP TENANTHOST.DOMAIN TENANTHOST
556           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
557           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
558         params:
559           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ObjectStorageHostnameResolveNetwork]}]}
560           DOMAIN: {get_param: CloudDomain}
561           PRIMARYHOST: {get_attr: [SwiftStorage, name]}
562           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
563           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
564           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
565           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
566           STORAGEIP: {get_attr: [StoragePort, ip_address]}
567           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
568           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
569           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
570           TENANTIP: {get_attr: [TenantPort, ip_address]}
571           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
572           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
573           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
574           CTLPLANEIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
575           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
576   known_hosts_entry:
577     description: Entry for ssh known hosts
578     value:
579       str_replace:
580         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
581 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
582 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
583 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
584 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
585 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
586 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
587 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
588         params:
589           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ObjectStorageHostnameResolveNetwork]}]}
590           DOMAIN: {get_param: CloudDomain}
591           PRIMARYHOST: {get_attr: [SwiftStorage, name]}
592           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
593           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
594           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
595           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
596           STORAGEIP: {get_attr: [StoragePort, ip_address]}
597           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
598           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
599           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
600           TENANTIP: {get_attr: [TenantPort, ip_address]}
601           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
602           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
603           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
604           CTLPLANEIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
605           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
606           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
607   nova_server_resource:
608     description: Heat resource handle for the swift storage server
609     value:
610       {get_resource: SwiftStorage}
611     condition: server_not_blacklisted
612   external_ip_address:
613     description: IP address of the server in the external network
614     value: {get_attr: [ExternalPort, ip_address]}
615   internal_api_ip_address:
616     description: IP address of the server in the internal_api network
617     value: {get_attr: [InternalApiPort, ip_address]}
618   storage_ip_address:
619     description: IP address of the server in the storage network
620     value: {get_attr: [StoragePort, ip_address]}
621   storage_mgmt_ip_address:
622     description: IP address of the server in the storage_mgmt network
623     value: {get_attr: [StorageMgmtPort, ip_address]}
624   tenant_ip_address:
625     description: IP address of the server in the tenant network
626     value: {get_attr: [TenantPort, ip_address]}
627   management_ip_address:
628     description: IP address of the server in the management network
629     value: {get_attr: [ManagementPort, ip_address]}