Merge "Add neutron-midonet sample environment"
[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
387   NetworkDeployment:
388     type: OS::TripleO::SoftwareDeployment
389     depends_on: PreNetworkConfig
390     properties:
391       name: NetworkDeployment
392       config: {get_resource: NetworkConfig}
393       server: {get_resource: CephStorage}
394       actions:
395         if:
396           - server_not_blacklisted
397           - {get_param: NetworkDeploymentActions}
398           - []
399
400   CephStorageUpgradeInitConfig:
401     type: OS::Heat::SoftwareConfig
402     properties:
403       group: script
404       config:
405         list_join:
406         - ''
407         - - "#!/bin/bash\n\n"
408           - "if [[ -f /etc/resolv.conf.save ]] ; then rm /etc/resolv.conf.save; fi\n\n"
409           - get_param: UpgradeInitCommand
410           - get_param: UpgradeInitCommonCommand
411
412   # Note we may be able to make this conditional on UpgradeInitCommandNotEmpty
413   # but https://bugs.launchpad.net/heat/+bug/1649900 needs fixing first
414   CephStorageUpgradeInitDeployment:
415     type: OS::Heat::SoftwareDeployment
416     depends_on: NetworkDeployment
417     properties:
418       name: CephStorageUpgradeInitDeployment
419       server: {get_resource: CephStorage}
420       config: {get_resource: CephStorageUpgradeInitConfig}
421       actions:
422         if:
423           - server_not_blacklisted
424           - ['CREATE', 'UPDATE']
425           - []
426
427   CephStorageDeployment:
428     type: OS::Heat::StructuredDeployment
429     depends_on: CephStorageUpgradeInitDeployment
430     properties:
431       name: CephStorageDeployment
432       config: {get_resource: CephStorageConfig}
433       server: {get_resource: CephStorage}
434       input_values:
435         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
436       actions:
437         if:
438           - server_not_blacklisted
439           - ['CREATE', 'UPDATE']
440           - []
441
442   CephStorageConfig:
443     type: OS::Heat::StructuredConfig
444     properties:
445       group: hiera
446       config:
447         hierarchy:
448           - '"%{::uuid}"'
449           - heat_config_%{::deploy_config_name}
450           - config_step
451           - ceph_extraconfig
452           - extraconfig
453           - service_names
454           - service_configs
455           - ceph
456           - bootstrap_node # provided by allNodesConfig
457           - all_nodes # provided by allNodesConfig
458           - vip_data # provided by allNodesConfig
459           - '"%{::osfamily}"'
460         merge_behavior: deeper
461         datafiles:
462           service_names:
463             service_names: {get_param: ServiceNames}
464             sensu::subscriptions: {get_param: MonitoringSubscriptions}
465           service_configs:
466             map_replace:
467               - {get_param: ServiceConfigSettings}
468               - values: {get_attr: [NetIpMap, net_ip_map]}
469           ceph_extraconfig: {get_param: CephStorageExtraConfig}
470           extraconfig: {get_param: ExtraConfig}
471           ceph:
472             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
473             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
474             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
475             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
476             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
477             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
478             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
479             fqdn_external: {get_attr: [NetHostMap, value, external, fqdn]}
480
481   # Resource for site-specific injection of root certificate
482   NodeTLSCAData:
483     depends_on: CephStorageDeployment
484     type: OS::TripleO::NodeTLSCAData
485     properties:
486       server: {get_resource: CephStorage}
487
488   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
489   CephStorageExtraConfigPre:
490     depends_on: CephStorageDeployment
491     type: OS::TripleO::CephStorageExtraConfigPre
492     properties:
493         server: {get_resource: CephStorage}
494
495   # Hook for site-specific additional pre-deployment config,
496   # applying to all nodes, e.g node registration/unregistration
497   NodeExtraConfig:
498     depends_on: [CephStorageExtraConfigPre, NodeTLSCAData]
499     type: OS::TripleO::NodeExtraConfig
500     properties:
501         server: {get_resource: CephStorage}
502
503   UpdateConfig:
504     type: OS::TripleO::Tasks::PackageUpdate
505
506   UpdateDeployment:
507     type: OS::Heat::SoftwareDeployment
508     depends_on: NetworkDeployment
509     properties:
510       config: {get_resource: UpdateConfig}
511       server: {get_resource: CephStorage}
512       input_values:
513         update_identifier:
514           get_param: UpdateIdentifier
515       actions:
516         if:
517           - server_not_blacklisted
518           - ['CREATE', 'UPDATE']
519           - []
520
521   SshHostPubKey:
522     type: OS::TripleO::Ssh::HostPubKey
523     depends_on: CephStorageDeployment
524     properties:
525         server: {get_resource: CephStorage}
526
527 outputs:
528   ip_address:
529     description: IP address of the server in the ctlplane network
530     value: {get_attr: [CephStorage, networks, ctlplane, 0]}
531   hostname:
532     description: Hostname of the server
533     value: {get_attr: [CephStorage, name]}
534   hostname_map:
535     description: Mapping of network names to hostnames
536     value:
537       external: {get_attr: [NetHostMap, value, external, fqdn]}
538       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
539       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
540       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
541       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
542       management: {get_attr: [NetHostMap, value, management, fqdn]}
543       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
544   hosts_entry:
545     value:
546       str_replace:
547         template: |
548           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
549           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
550           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
551           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
552           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
553           TENANTIP TENANTHOST.DOMAIN TENANTHOST
554           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
555           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
556         params:
557           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephStorageHostnameResolveNetwork]}]}
558           DOMAIN: {get_param: CloudDomain}
559           PRIMARYHOST: {get_attr: [CephStorage, name]}
560           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
561           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
562           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
563           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
564           STORAGEIP: {get_attr: [StoragePort, ip_address]}
565           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
566           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
567           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
568           TENANTIP: {get_attr: [TenantPort, ip_address]}
569           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
570           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
571           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
572           CTLPLANEIP: {get_attr: [CephStorage, networks, ctlplane, 0]}
573           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
574   known_hosts_entry:
575     description: Entry for ssh known hosts
576     value:
577       str_replace:
578         template: "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 HOSTSSHPUBKEY"
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           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
605   nova_server_resource:
606     description: Heat resource handle for the ceph storage server
607     value:
608       {get_resource: CephStorage}
609     condition: server_not_blacklisted
610   external_ip_address:
611     description: IP address of the server in the external network
612     value: {get_attr: [ExternalPort, ip_address]}
613   internal_api_ip_address:
614     description: IP address of the server in the internal_api network
615     value: {get_attr: [InternalApiPort, ip_address]}
616   storage_ip_address:
617     description: IP address of the server in the storage network
618     value: {get_attr: [StoragePort, ip_address]}
619   storage_mgmt_ip_address:
620     description: IP address of the server in the storage_mgmt network
621     value: {get_attr: [StorageMgmtPort, ip_address]}
622   tenant_ip_address:
623     description: IP address of the server in the tenant network
624     value: {get_attr: [TenantPort, ip_address]}
625   management_ip_address:
626     description: IP address of the server in the management network
627     value: {get_attr: [ManagementPort, ip_address]}