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