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