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