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