Merge "Add DeploymentSwiftDataMap parameter"
[apex-tripleo-heat-templates.git] / puppet / cephstorage-role.yaml
1 heat_template_version: pike
2 description: 'OpenStack ceph storage node configured by Puppet'
3 parameters:
4   OvercloudCephStorageFlavor:
5     description: Flavor for the Ceph Storage node.
6     default: baremetal
7     type: string
8     constraints:
9       - custom_constraint: nova.flavor
10   CephStorageImage:
11     type: string
12     default: overcloud-full
13     constraints:
14       - custom_constraint: glance.image
15   ImageUpdatePolicy:
16     default: 'REBUILD_PRESERVE_EPHEMERAL'
17     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
18     type: string
19   KeyName:
20     description: Name of an existing Nova key pair to enable SSH access to the instances
21     type: string
22     default: default
23     constraints:
24       - custom_constraint: nova.keypair
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   UpdateIdentifier:
36     default: ''
37     type: string
38     description: >
39       Setting to a previously unused value during stack-update will trigger
40       package update on all nodes
41   Hostname:
42     type: string
43     default: '' # Defaults to Heat created hostname
44   HostnameMap:
45     type: json
46     default: {}
47     description: Optional mapping to override hostnames
48   ExtraConfig:
49     default: {}
50     description: |
51       Additional hiera configuration to inject into the cluster. Note
52       that CephStorageExtraConfig takes precedence over ExtraConfig.
53     type: json
54   CephStorageExtraConfig:
55     default: {}
56     description: |
57       Role specific additional hiera configuration to inject into the cluster.
58     type: json
59   CephStorageIPs:
60     default: {}
61     type: json
62   NetworkDeploymentActions:
63     type: comma_delimited_list
64     description: >
65       Heat action when to apply network configuration changes
66     default: ['CREATE']
67   SoftwareConfigTransport:
68     default: POLL_SERVER_CFN
69     description: |
70       How the server should receive the metadata required for software configuration.
71     type: string
72     constraints:
73     - allowed_values: [POLL_SERVER_CFN, POLL_SERVER_HEAT, POLL_TEMP_URL, ZAQAR_MESSAGE]
74   CloudDomain:
75     default: 'localdomain'
76     type: string
77     description: >
78       The DNS domain used for the hosts. This must match the
79       overcloud_domain_name configured on the undercloud.
80   CephStorageServerMetadata:
81     default: {}
82     description: >
83       Extra properties or metadata passed to Nova for the created nodes in
84       the overcloud. It's accessible via the Nova metadata API. This option is
85       role-specific and is merged with the values given to the ServerMetadata
86       parameter.
87     type: json
88   ServerMetadata:
89     default: {}
90     description: >
91       Extra properties or metadata passed to Nova for the created nodes in
92       the overcloud. It's accessible via the Nova metadata API. This applies to
93       all roles and is merged with a role-specific metadata parameter.
94     type: json
95   CephStorageSchedulerHints:
96     type: json
97     description: Optional scheduler hints to pass to nova
98     default: {}
99   NodeIndex:
100     type: number
101     default: 0
102   ServiceConfigSettings:
103     type: json
104     default: {}
105   ServiceNames:
106     type: comma_delimited_list
107     default: []
108   MonitoringSubscriptions:
109     type: comma_delimited_list
110     default: []
111   ServiceMetadataSettings:
112     type: json
113     default: {}
114   ConfigCommand:
115     type: string
116     description: Command which will be run whenever configuration data changes
117     default: os-refresh-config --timeout 14400
118   ConfigCollectSplay:
119     type: number
120     default: 30
121     description: |
122       Maximum amount of time to possibly to delay configuation collection
123       polling. Defaults to 30 seconds. Set to 0 to disable it which will cause
124       the configuration collection to occur as soon as the collection process
125       starts.  This setting is used to prevent the configuration collection
126       processes from polling all at the exact same time.
127   UpgradeInitCommand:
128     type: string
129     description: |
130       Command or script snippet to run on all overcloud nodes to
131       initialize the upgrade process. E.g. a repository switch.
132     default: ''
133   UpgradeInitCommonCommand:
134     type: string
135     description: |
136       Common commands required by the upgrades process. This should not
137       normally be modified by the operator and is set and unset in the
138       major-upgrade-composable-steps.yaml and major-upgrade-converge.yaml
139       environment files.
140     default: ''
141   DeploymentServerBlacklistDict:
142     default: {}
143     type: json
144     description: >
145       Map of server hostnames to blacklist from any triggered
146       deployments. If the value is 1, the server will be blacklisted. This
147       parameter is generated from the parent template.
148   RoleParameters:
149     type: json
150     description: Role Specific Parameters
151   DeploymentSwiftDataMap:
152     type: json
153     description: |
154       Map of servers to Swift container and object for storing deployment data.
155       The keys are the Heat assigned hostnames, and the value is a map of the
156       container/object name in Swift. Example value:
157         overcloud-controller-0:
158           container: overcloud-controller
159           object: 0
160         overcloud-controller-1:
161           container: overcloud-controller
162           object: 1
163         overcloud-controller-2:
164           container: overcloud-controller
165           object: 2
166         overcloud-novacompute-0:
167           container: overcloud-compute
168           object: 0
169     default: {}
170
171 conditions:
172   server_not_blacklisted:
173     not:
174       equals:
175         - {get_param: [DeploymentServerBlacklistDict, {get_param: Hostname}]}
176         - 1
177   deployment_swift_data_map_unset:
178     equals:
179       - get_param:
180           - DeploymentSwiftDataMap
181           - {get_param: Hostname}
182       - ""
183
184 resources:
185   CephStorage:
186     type: OS::TripleO::CephStorageServer
187     metadata:
188       os-collect-config:
189         command: {get_param: ConfigCommand}
190         splay: {get_param: ConfigCollectSplay}
191     properties:
192       image: {get_param: CephStorageImage}
193       image_update_policy: {get_param: ImageUpdatePolicy}
194       flavor: {get_param: OvercloudCephStorageFlavor}
195       key_name: {get_param: KeyName}
196       networks:
197         - network: ctlplane
198       user_data_format: SOFTWARE_CONFIG
199       user_data: {get_resource: UserData}
200       name:
201         str_replace:
202             template: {get_param: Hostname}
203             params: {get_param: HostnameMap}
204       software_config_transport: {get_param: SoftwareConfigTransport}
205       metadata:
206         map_merge:
207           - {get_param: ServerMetadata}
208           - {get_param: CephStorageServerMetadata}
209           - {get_param: ServiceMetadataSettings}
210       scheduler_hints: {get_param: CephStorageSchedulerHints}
211       deployment_swift_data:
212         if:
213           - deployment_swift_data_map_unset
214           - {}
215           - {get_param: [DeploymentSwiftDataMap,
216                          {get_param: Hostname}]}
217
218   # Combine the NodeAdminUserData and NodeUserData mime archives
219   UserData:
220     type: OS::Heat::MultipartMime
221     properties:
222       parts:
223       - config: {get_resource: NodeAdminUserData}
224         type: multipart
225       - config: {get_resource: NodeUserData}
226         type: multipart
227       - config: {get_resource: RoleUserData}
228         type: multipart
229
230   # Creates the "heat-admin" user if configured via the environment
231   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
232   NodeAdminUserData:
233     type: OS::TripleO::NodeAdminUserData
234
235   # For optional operator additional userdata
236   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
237   NodeUserData:
238     type: OS::TripleO::NodeUserData
239
240   # For optional operator role-specific userdata
241   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
242   RoleUserData:
243     type: OS::TripleO::CephStorage::NodeUserData
244
245   ExternalPort:
246     type: OS::TripleO::CephStorage::Ports::ExternalPort
247     properties:
248       ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
249       IPPool: {get_param: CephStorageIPs}
250       NodeIndex: {get_param: NodeIndex}
251
252   InternalApiPort:
253     type: OS::TripleO::CephStorage::Ports::InternalApiPort
254     properties:
255       ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
256       IPPool: {get_param: CephStorageIPs}
257       NodeIndex: {get_param: NodeIndex}
258
259   StoragePort:
260     type: OS::TripleO::CephStorage::Ports::StoragePort
261     properties:
262       ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
263       IPPool: {get_param: CephStorageIPs}
264       NodeIndex: {get_param: NodeIndex}
265
266   StorageMgmtPort:
267     type: OS::TripleO::CephStorage::Ports::StorageMgmtPort
268     properties:
269       ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
270       IPPool: {get_param: CephStorageIPs}
271       NodeIndex: {get_param: NodeIndex}
272
273   TenantPort:
274     type: OS::TripleO::CephStorage::Ports::TenantPort
275     properties:
276       ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
277       IPPool: {get_param: CephStorageIPs}
278       NodeIndex: {get_param: NodeIndex}
279
280   ManagementPort:
281     type: OS::TripleO::CephStorage::Ports::ManagementPort
282     properties:
283       ControlPlaneIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
284       IPPool: {get_param: CephStorageIPs}
285       NodeIndex: {get_param: NodeIndex}
286
287   NetworkConfig:
288     type: OS::TripleO::CephStorage::Net::SoftwareConfig
289     properties:
290       ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
291       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
292       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
293       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
294       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
295       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
296       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
297
298   NetIpMap:
299     type: OS::TripleO::Network::Ports::NetIpMap
300     properties:
301       ControlPlaneIp: {get_attr: [CephStorage, networks, ctlplane, 0]}
302       ExternalIp: {get_attr: [ExternalPort, ip_address]}
303       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
304       ExternalIpUri: {get_attr: [ExternalPort, ip_address_uri]}
305       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
306       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
307       InternalApiIpUri: {get_attr: [InternalApiPort, ip_address_uri]}
308       StorageIp: {get_attr: [StoragePort, ip_address]}
309       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
310       StorageIpUri: {get_attr: [StoragePort, ip_address_uri]}
311       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
312       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
313       StorageMgmtIpUri: {get_attr: [StorageMgmtPort, ip_address_uri]}
314       TenantIp: {get_attr: [TenantPort, ip_address]}
315       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
316       TenantIpUri: {get_attr: [TenantPort, ip_address_uri]}
317       ManagementIp: {get_attr: [ManagementPort, ip_address]}
318       ManagementIpSubnet: {get_attr: [ManagementPort, ip_subnet]}
319       ManagementIpUri: {get_attr: [ManagementPort, ip_address_uri]}
320
321   NetHostMap:
322     type: OS::Heat::Value
323     properties:
324       type: json
325       value:
326         external:
327           fqdn:
328             list_join:
329             - '.'
330             - - {get_attr: [CephStorage, name]}
331               - external
332               - {get_param: CloudDomain}
333           short:
334             list_join:
335             - '.'
336             - - {get_attr: [CephStorage, name]}
337               - external
338         internal_api:
339           fqdn:
340             list_join:
341             - '.'
342             - - {get_attr: [CephStorage, name]}
343               - internalapi
344               - {get_param: CloudDomain}
345           short:
346             list_join:
347             - '.'
348             - - {get_attr: [CephStorage, name]}
349               - internalapi
350         storage:
351           fqdn:
352             list_join:
353             - '.'
354             - - {get_attr: [CephStorage, name]}
355               - storage
356               - {get_param: CloudDomain}
357           short:
358             list_join:
359             - '.'
360             - - {get_attr: [CephStorage, name]}
361               - storage
362         storage_mgmt:
363           fqdn:
364             list_join:
365             - '.'
366             - - {get_attr: [CephStorage, name]}
367               - storagemgmt
368               - {get_param: CloudDomain}
369           short:
370             list_join:
371             - '.'
372             - - {get_attr: [CephStorage, name]}
373               - storagemgmt
374         tenant:
375           fqdn:
376             list_join:
377             - '.'
378             - - {get_attr: [CephStorage, name]}
379               - tenant
380               - {get_param: CloudDomain}
381           short:
382             list_join:
383             - '.'
384             - - {get_attr: [CephStorage, name]}
385               - tenant
386         management:
387           fqdn:
388             list_join:
389             - '.'
390             - - {get_attr: [CephStorage, name]}
391               - management
392               - {get_param: CloudDomain}
393           short:
394             list_join:
395             - '.'
396             - - {get_attr: [CephStorage, name]}
397               - management
398         ctlplane:
399           fqdn:
400             list_join:
401             - '.'
402             - - {get_attr: [CephStorage, name]}
403               - ctlplane
404               - {get_param: CloudDomain}
405           short:
406             list_join:
407             - '.'
408             - - {get_attr: [CephStorage, name]}
409               - ctlplane
410
411   PreNetworkConfig:
412     type: OS::TripleO::CephStorage::PreNetworkConfig
413     properties:
414       server: {get_resource: CephStorage}
415       RoleParameters: {get_param: RoleParameters}
416
417   NetworkDeployment:
418     type: OS::TripleO::SoftwareDeployment
419     depends_on: PreNetworkConfig
420     properties:
421       name: NetworkDeployment
422       config: {get_resource: NetworkConfig}
423       server: {get_resource: CephStorage}
424       actions:
425         if:
426           - server_not_blacklisted
427           - {get_param: NetworkDeploymentActions}
428           - []
429
430   CephStorageUpgradeInitConfig:
431     type: OS::Heat::SoftwareConfig
432     properties:
433       group: script
434       config:
435         list_join:
436         - ''
437         - - "#!/bin/bash\n\n"
438           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
439           - get_param: UpgradeInitCommand
440           - get_param: UpgradeInitCommonCommand
441
442   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
443   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
444   CephStorageUpgradeInitDeployment:
445     type: OS::Heat::SoftwareDeployment
446     depends_on: NetworkDeployment
447     properties:
448       name: CephStorageUpgradeInitDeployment
449       server: {get_resource: CephStorage}
450       config: {get_resource: CephStorageUpgradeInitConfig}
451       actions:
452         if:
453           - server_not_blacklisted
454           - ['CREATE', 'UPDATE']
455           - []
456
457   CephStorageDeployment:
458     type: OS::Heat::StructuredDeployment
459     depends_on: CephStorageUpgradeInitDeployment
460     properties:
461       name: CephStorageDeployment
462       config: {get_resource: CephStorageConfig}
463       server: {get_resource: CephStorage}
464       input_values:
465         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
466       actions:
467         if:
468           - server_not_blacklisted
469           - ['CREATE', 'UPDATE']
470           - []
471
472   CephStorageConfig:
473     type: OS::Heat::StructuredConfig
474     properties:
475       group: hiera
476       config:
477         hierarchy:
478           - '"%{::uuid}"'
479           - heat_config_%{::deploy_config_name}
480           - config_step
481           - ceph_extraconfig
482           - extraconfig
483           - service_names
484           - service_configs
485           - ceph
486           - bootstrap_node # provided by allNodesConfig
487           - all_nodes # provided by allNodesConfig
488           - vip_data # provided by allNodesConfig
489           - '"%{::osfamily}"'
490         merge_behavior: deeper
491         datafiles:
492           service_names:
493             service_names: {get_param: ServiceNames}
494             sensu::subscriptions: {get_param: MonitoringSubscriptions}
495           service_configs:
496             map_replace:
497               - {get_param: ServiceConfigSettings}
498               - values: {get_attr: [NetIpMap, net_ip_map]}
499           ceph_extraconfig: {get_param: CephStorageExtraConfig}
500           extraconfig: {get_param: ExtraConfig}
501           ceph:
502             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
503             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
504             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
505             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
506             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
507             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
508             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
509             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
510
511   # Resource for site-specific injection of root certificate
512   NodeTLSCAData:
513     depends_on: CephStorageDeployment
514     type: OS::TripleO::NodeTLSCAData
515     properties:
516       server: {get_resource: CephStorage}
517
518   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
519   CephStorageExtraConfigPre:
520     depends_on: CephStorageDeployment
521     type: OS::TripleO::CephStorageExtraConfigPre
522     properties:
523         server: {get_resource: CephStorage}
524
525   # Hook for site-specific additional pre-deployment config,
526   # applying to all nodes, e.g node registration/unregistration
527   NodeExtraConfig:
528     depends_on: [CephStorageExtraConfigPre, NodeTLSCAData]
529     type: OS::TripleO::NodeExtraConfig
530     properties:
531         server: {get_resource: CephStorage}
532
533   UpdateConfig:
534     type: OS::TripleO::Tasks::PackageUpdate
535
536   UpdateDeployment:
537     type: OS::Heat::SoftwareDeployment
538     depends_on: NetworkDeployment
539     properties:
540       config: {get_resource: UpdateConfig}
541       server: {get_resource: CephStorage}
542       input_values:
543         update_identifier:
544           get_param: UpdateIdentifier
545       actions:
546         if:
547           - server_not_blacklisted
548           - ['CREATE', 'UPDATE']
549           - []
550
551   SshHostPubKey:
552     type: OS::TripleO::Ssh::HostPubKey
553     depends_on: CephStorageDeployment
554     properties:
555         server: {get_resource: CephStorage}
556
557 outputs:
558   ip_address:
559     description: IP address of the server in the ctlplane network
560     value: {get_attr: [CephStorage, networks, ctlplane, 0]}
561   hostname:
562     description: Hostname of the server
563     value: {get_attr: [CephStorage, name]}
564   hostname_map:
565     description: Mapping of network names to hostnames
566     value:
567       external: {get_attr: [NetHostMap, value, external, fqdn]}
568       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
569       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
570       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
571       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
572       management: {get_attr: [NetHostMap, value, management, fqdn]}
573       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
574   hosts_entry:
575     value:
576       str_replace:
577         template: |
578           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
579           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
580           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
581           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
582           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
583           TENANTIP TENANTHOST.DOMAIN TENANTHOST
584           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
585           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
586         params:
587           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephStorageHostnameResolveNetwork]}]}
588           DOMAIN: {get_param: CloudDomain}
589           PRIMARYHOST: {get_attr: [CephStorage, name]}
590           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
591           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
592           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
593           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
594           STORAGEIP: {get_attr: [StoragePort, ip_address]}
595           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
596           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
597           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
598           TENANTIP: {get_attr: [TenantPort, ip_address]}
599           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
600           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
601           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
602           CTLPLANEIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
603           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
604   known_hosts_entry:
605     description: Entry for ssh known hosts
606     value:
607       str_replace:
608         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
609 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
610 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
611 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
612 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
613 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
614 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
615 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
616         params:
617           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephStorageHostnameResolveNetwork]}]}
618           DOMAIN: {get_param: CloudDomain}
619           PRIMARYHOST: {get_attr: [CephStorage, name]}
620           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
621           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
622           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
623           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
624           STORAGEIP: {get_attr: [StoragePort, ip_address]}
625           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
626           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
627           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
628           TENANTIP: {get_attr: [TenantPort, ip_address]}
629           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
630           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
631           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
632           CTLPLANEIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
633           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
634           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
635   nova_server_resource:
636     description: Heat resource handle for the ceph storage server
637     value:
638       {get_resource: CephStorage}
639     condition: server_not_blacklisted
640   external_ip_address:
641     description: IP address of the server in the external network
642     value: {get_attr: [ExternalPort, ip_address]}
643   internal_api_ip_address:
644     description: IP address of the server in the internal_api network
645     value: {get_attr: [InternalApiPort, ip_address]}
646   storage_ip_address:
647     description: IP address of the server in the storage network
648     value: {get_attr: [StoragePort, ip_address]}
649   storage_mgmt_ip_address:
650     description: IP address of the server in the storage_mgmt network
651     value: {get_attr: [StorageMgmtPort, ip_address]}
652   tenant_ip_address:
653     description: IP address of the server in the tenant network
654     value: {get_attr: [TenantPort, ip_address]}
655   management_ip_address:
656     description: IP address of the server in the management network
657     value: {get_attr: [ManagementPort, ip_address]}
658   os_collect_config:
659     description: The os-collect-config configuration associated with this server resource
660     value: {get_attr: [CephStorage, os_collect_config]}