Merge "Enable nova-api to run over httpd again"
[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   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
181   SwiftStorage:
182     type: OS::TripleO::ObjectStorageServer
183     metadata:
184       os-collect-config:
185         command: {get_param: ConfigCommand}
186         splay: {get_param: ConfigCollectSplay}
187     properties:
188       image: {get_param: SwiftStorageImage}
189       flavor: {get_param: OvercloudSwiftStorageFlavor}
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: SwiftStorageServerMetadata}
204           - {get_param: ServiceMetadataSettings}
205       scheduler_hints: {get_param: ObjectStorageSchedulerHints}
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::ObjectStorage::NodeUserData
239
240   ExternalPort:
241     type: OS::TripleO::SwiftStorage::Ports::ExternalPort
242     properties:
243       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
244       IPPool: {get_param: SwiftStorageIPs}
245       NodeIndex: {get_param: NodeIndex}
246
247   InternalApiPort:
248     type: OS::TripleO::SwiftStorage::Ports::InternalApiPort
249     properties:
250       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
251       IPPool: {get_param: SwiftStorageIPs}
252       NodeIndex: {get_param: NodeIndex}
253
254   StoragePort:
255     type: OS::TripleO::SwiftStorage::Ports::StoragePort
256     properties:
257       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
258       IPPool: {get_param: SwiftStorageIPs}
259       NodeIndex: {get_param: NodeIndex}
260
261   StorageMgmtPort:
262     type: OS::TripleO::SwiftStorage::Ports::StorageMgmtPort
263     properties:
264       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
265       IPPool: {get_param: SwiftStorageIPs}
266       NodeIndex: {get_param: NodeIndex}
267
268   TenantPort:
269     type: OS::TripleO::SwiftStorage::Ports::TenantPort
270     properties:
271       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
272       IPPool: {get_param: SwiftStorageIPs}
273       NodeIndex: {get_param: NodeIndex}
274
275   ManagementPort:
276     type: OS::TripleO::SwiftStorage::Ports::ManagementPort
277     properties:
278       ControlPlaneIP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
279       IPPool: {get_param: SwiftStorageIPs}
280       NodeIndex: {get_param: NodeIndex}
281
282   NetworkConfig:
283     type: OS::TripleO::ObjectStorage::Net::SoftwareConfig
284     properties:
285       ControlPlaneIp: {get_attr: [SwiftStorage, 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: [SwiftStorage, 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: [SwiftStorage, name]}
326               - external
327               - {get_param: CloudDomain}
328           short:
329             list_join:
330             - '.'
331             - - {get_attr: [SwiftStorage, name]}
332               - external
333         internal_api:
334           fqdn:
335             list_join:
336             - '.'
337             - - {get_attr: [SwiftStorage, name]}
338               - internalapi
339               - {get_param: CloudDomain}
340           short:
341             list_join:
342             - '.'
343             - - {get_attr: [SwiftStorage, name]}
344               - internalapi
345         storage:
346           fqdn:
347             list_join:
348             - '.'
349             - - {get_attr: [SwiftStorage, name]}
350               - storage
351               - {get_param: CloudDomain}
352           short:
353             list_join:
354             - '.'
355             - - {get_attr: [SwiftStorage, name]}
356               - storage
357         storage_mgmt:
358           fqdn:
359             list_join:
360             - '.'
361             - - {get_attr: [SwiftStorage, name]}
362               - storagemgmt
363               - {get_param: CloudDomain}
364           short:
365             list_join:
366             - '.'
367             - - {get_attr: [SwiftStorage, name]}
368               - storagemgmt
369         tenant:
370           fqdn:
371             list_join:
372             - '.'
373             - - {get_attr: [SwiftStorage, name]}
374               - tenant
375               - {get_param: CloudDomain}
376           short:
377             list_join:
378             - '.'
379             - - {get_attr: [SwiftStorage, name]}
380               - tenant
381         management:
382           fqdn:
383             list_join:
384             - '.'
385             - - {get_attr: [SwiftStorage, name]}
386               - management
387               - {get_param: CloudDomain}
388           short:
389             list_join:
390             - '.'
391             - - {get_attr: [SwiftStorage, name]}
392               - management
393         ctlplane:
394           fqdn:
395             list_join:
396             - '.'
397             - - {get_attr: [SwiftStorage, name]}
398               - ctlplane
399               - {get_param: CloudDomain}
400           short:
401             list_join:
402             - '.'
403             - - {get_attr: [SwiftStorage, name]}
404               - ctlplane
405
406   PreNetworkConfig:
407     type: OS::TripleO::ObjectStorage::PreNetworkConfig
408     properties:
409       server: {get_resource: SwiftStorage}
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: SwiftStorage}
420       actions:
421         if:
422           - server_not_blacklisted
423           - {get_param: NetworkDeploymentActions}
424           - []
425
426
427   SwiftStorageUpgradeInitConfig:
428     type: OS::Heat::SoftwareConfig
429     properties:
430       group: script
431       config:
432         list_join:
433         - ''
434         - - "#!/bin/bash\n\n"
435           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
436           - get_param: UpgradeInitCommand
437           - get_param: UpgradeInitCommonCommand
438
439   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
440   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
441   SwiftStorageUpgradeInitDeployment:
442     type: OS::Heat::SoftwareDeployment
443     depends_on: NetworkDeployment
444     properties:
445       name: SwiftStorageUpgradeInitDeployment
446       server: {get_resource: SwiftStorage}
447       config: {get_resource: SwiftStorageUpgradeInitConfig}
448       actions:
449         if:
450           - server_not_blacklisted
451           - ['CREATE', 'UPDATE']
452           - []
453
454   SwiftStorageHieraConfig:
455     type: OS::Heat::StructuredConfig
456     properties:
457       group: hiera
458       config:
459         hierarchy:
460           - '"%{::uuid}"'
461           - heat_config_%{::deploy_config_name}
462           - config_step
463           - object_extraconfig
464           - extraconfig
465           - service_names
466           - service_configs
467           - object
468           - bootstrap_node # provided by allNodesConfig
469           - all_nodes # provided by allNodesConfig
470           - vip_data # provided by allNodesConfig
471           - '"%{::osfamily}"'
472         merge_behavior: deeper
473         datafiles:
474           service_names:
475             service_names: {get_param: ServiceNames}
476             sensu::subscriptions: {get_param: MonitoringSubscriptions}
477           service_configs:
478             map_replace:
479               - {get_param: ServiceConfigSettings}
480               - values: {get_attr: [NetIpMap, net_ip_map]}
481           object_extraconfig: {get_param: ObjectStorageExtraConfig}
482           extraconfig: {get_param: ExtraConfig}
483           object:
484             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
485             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
486             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
487             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
488             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
489             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
490             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
491             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
492
493   SwiftStorageHieraDeploy:
494     type: OS::Heat::StructuredDeployment
495     depends_on: SwiftStorageUpgradeInitDeployment
496     properties:
497       name: SwiftStorageHieraDeploy
498       server: {get_resource: SwiftStorage}
499       config: {get_resource: SwiftStorageHieraConfig}
500       input_values:
501         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
502       actions:
503         if:
504           - server_not_blacklisted
505           - ['CREATE', 'UPDATE']
506           - []
507
508   # Resource for site-specific injection of root certificate
509   NodeTLSCAData:
510     depends_on: SwiftStorageHieraDeploy
511     type: OS::TripleO::NodeTLSCAData
512     properties:
513       server: {get_resource: SwiftStorage}
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: SwiftStorage}
522
523   UpdateConfig:
524     type: OS::TripleO::Tasks::PackageUpdate
525
526   UpdateDeployment:
527     type: OS::Heat::SoftwareDeployment
528     depends_on: NetworkDeployment
529     properties:
530       config: {get_resource: UpdateConfig}
531       server: {get_resource: SwiftStorage}
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: SwiftStorageHieraDeploy
544     properties:
545         server: {get_resource: SwiftStorage}
546
547 outputs:
548   ip_address:
549     description: IP address of the server in the ctlplane network
550     value: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
551   hostname:
552     description: Hostname of the server
553     value: {get_attr: [SwiftStorage, 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, ObjectStorageHostnameResolveNetwork]}]}
578           DOMAIN: {get_param: CloudDomain}
579           PRIMARYHOST: {get_attr: [SwiftStorage, 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: [SwiftStorage, 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, ObjectStorageHostnameResolveNetwork]}]}
608           DOMAIN: {get_param: CloudDomain}
609           PRIMARYHOST: {get_attr: [SwiftStorage, 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: [SwiftStorage, 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 swift storage server
627     value:
628       {get_resource: SwiftStorage}
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: [SwiftStorage, os_collect_config]}