Merge "Add support for linuxbridge agent"
[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           - compute_extraconfig
441           - extraconfig
442           - service_names
443           - service_configs
444           - compute
445           - bootstrap_node # provided by allNodesConfig
446           - all_nodes # provided by allNodesConfig
447           - vip_data # provided by allNodesConfig
448           - '"%{::osfamily}"'
449           - neutron_bigswitch_data # Optionally provided by ComputeExtraConfigPre
450           - cisco_n1kv_data  # Optionally provided by ComputeExtraConfigPre
451           - nova_nuage_data  # Optionally provided by ComputeExtraConfigPre
452           - midonet_data # Optionally provided by AllNodesExtraConfig
453           - neutron_opencontrail_data  # Optionally provided by ComputeExtraConfigPre
454           - cisco_aci_data # Optionally provided by ComputeExtraConfigPre
455         merge_behavior: deeper
456         datafiles:
457           service_names:
458             service_names: {get_param: ServiceNames}
459             sensu::subscriptions: {get_param: MonitoringSubscriptions}
460           service_configs:
461             map_replace:
462               - {get_param: ServiceConfigSettings}
463               - values: {get_attr: [NetIpMap, net_ip_map]}
464           compute_extraconfig: {get_param: NovaComputeExtraConfig}
465           extraconfig: {get_param: ExtraConfig}
466           compute:
467             tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
468             fqdn_internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
469             fqdn_storage: {get_attr: [NetHostMap, value, storage, fqdn]}
470             fqdn_storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
471             fqdn_tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
472             fqdn_management: {get_attr: [NetHostMap, value, management, fqdn]}
473             fqdn_ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
474
475   NovaComputeDeployment:
476     type: OS::TripleO::SoftwareDeployment
477     depends_on: NovaComputeUpgradeInitDeployment
478     condition: server_not_blacklisted
479     properties:
480       name: NovaComputeDeployment
481       config: {get_resource: NovaComputeConfig}
482       server: {get_resource: NovaCompute}
483       input_values:
484         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
485
486   # Resource for site-specific injection of root certificate
487   NodeTLSCAData:
488     depends_on: NovaComputeDeployment
489     type: OS::TripleO::NodeTLSCAData
490     properties:
491       server: {get_resource: NovaCompute}
492
493   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
494   ComputeExtraConfigPre:
495     depends_on: NovaComputeDeployment
496     type: OS::TripleO::ComputeExtraConfigPre
497     properties:
498         server: {get_resource: NovaCompute}
499
500   # Hook for site-specific additional pre-deployment config,
501   # applying to all nodes, e.g node registration/unregistration
502   NodeExtraConfig:
503     depends_on: [ComputeExtraConfigPre, NodeTLSCAData]
504     type: OS::TripleO::NodeExtraConfig
505     properties:
506         server: {get_resource: NovaCompute}
507
508   UpdateConfig:
509     type: OS::TripleO::Tasks::PackageUpdate
510
511   UpdateDeployment:
512     type: OS::Heat::SoftwareDeployment
513     depends_on: NetworkDeployment
514     condition: server_not_blacklisted
515     properties:
516       name: UpdateDeployment
517       config: {get_resource: UpdateConfig}
518       server: {get_resource: NovaCompute}
519       input_values:
520         update_identifier:
521           get_param: UpdateIdentifier
522
523   SshHostPubKey:
524     type: OS::TripleO::Ssh::HostPubKey
525     depends_on: NovaComputeDeployment
526     properties:
527         server: {get_resource: NovaCompute}
528
529 outputs:
530   ip_address:
531     description: IP address of the server in the ctlplane network
532     value: {get_attr: [NovaCompute, networks, ctlplane, 0]}
533   external_ip_address:
534     description: IP address of the server in the external network
535     value: {get_attr: [ExternalPort, ip_address]}
536   internal_api_ip_address:
537     description: IP address of the server in the internal_api network
538     value: {get_attr: [InternalApiPort, ip_address]}
539   storage_ip_address:
540     description: IP address of the server in the storage network
541     value: {get_attr: [StoragePort, ip_address]}
542   storage_mgmt_ip_address:
543     description: IP address of the server in the storage_mgmt network
544     value: {get_attr: [StorageMgmtPort, ip_address]}
545   tenant_ip_address:
546     description: IP address of the server in the tenant network
547     value: {get_attr: [TenantPort, ip_address]}
548   management_ip_address:
549     description: IP address of the server in the management network
550     value: {get_attr: [ManagementPort, ip_address]}
551   hostname:
552     description: Hostname of the server
553     value: {get_attr: [NovaCompute, name]}
554   hostname_map:
555     description: Mapping of network names to hostnames
556     value:
557       external: {get_attr: [NetHostMap, value, external, fqdn]}
558       internal_api: {get_attr: [NetHostMap, value, internal_api, fqdn]}
559       storage: {get_attr: [NetHostMap, value, storage, fqdn]}
560       storage_mgmt: {get_attr: [NetHostMap, value, storage_mgmt, fqdn]}
561       tenant: {get_attr: [NetHostMap, value, tenant, fqdn]}
562       management: {get_attr: [NetHostMap, value, management, fqdn]}
563       ctlplane: {get_attr: [NetHostMap, value, ctlplane, fqdn]}
564   hosts_entry:
565     description: >
566       Server's IP address and hostname in the /etc/hosts format
567     value:
568       str_replace:
569         template: |
570           PRIMARYIP PRIMARYHOST.DOMAIN PRIMARYHOST
571           EXTERNALIP EXTERNALHOST.DOMAIN EXTERNALHOST
572           INTERNAL_APIIP INTERNAL_APIHOST.DOMAIN INTERNAL_APIHOST
573           STORAGEIP STORAGEHOST.DOMAIN STORAGEHOST
574           STORAGE_MGMTIP STORAGE_MGMTHOST.DOMAIN STORAGE_MGMTHOST
575           TENANTIP TENANTHOST.DOMAIN TENANTHOST
576           MANAGEMENTIP MANAGEMENTHOST.DOMAIN MANAGEMENTHOST
577           CTLPLANEIP CTLPLANEHOST.DOMAIN CTLPLANEHOST
578         params:
579           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ComputeHostnameResolveNetwork]}]}
580           DOMAIN: {get_param: CloudDomain}
581           PRIMARYHOST: {get_attr: [NovaCompute, name]}
582           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
583           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
584           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
585           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
586           STORAGEIP: {get_attr: [StoragePort, ip_address]}
587           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
588           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
589           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
590           TENANTIP: {get_attr: [TenantPort, ip_address]}
591           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
592           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
593           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
594           CTLPLANEIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
595           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
596   known_hosts_entry:
597     description: Entry for ssh known hosts
598     value:
599       str_replace:
600         template: "PRIMARYIP,PRIMARYHOST.DOMAIN,PRIMARYHOST,\
601 EXTERNALIP,EXTERNALHOST.DOMAIN,EXTERNALHOST,\
602 INTERNAL_APIIP,INTERNAL_APIHOST.DOMAIN,INTERNAL_APIHOST,\
603 STORAGEIP,STORAGEHOST.DOMAIN,STORAGEHOST,\
604 STORAGE_MGMTIP,STORAGE_MGMTHOST.DOMAIN,STORAGE_MGMTHOST,\
605 TENANTIP,TENANTHOST.DOMAIN,TENANTHOST,\
606 MANAGEMENTIP,MANAGEMENTHOST.DOMAIN,MANAGEMENTHOST,\
607 CTLPLANEIP,CTLPLANEHOST.DOMAIN,CTLPLANEHOST HOSTSSHPUBKEY"
608         params:
609           PRIMARYIP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ComputeHostnameResolveNetwork]}]}
610           DOMAIN: {get_param: CloudDomain}
611           PRIMARYHOST: {get_attr: [NovaCompute, name]}
612           EXTERNALIP: {get_attr: [ExternalPort, ip_address]}
613           EXTERNALHOST: {get_attr: [NetHostMap, value, external, short]}
614           INTERNAL_APIIP: {get_attr: [InternalApiPort, ip_address]}
615           INTERNAL_APIHOST: {get_attr: [NetHostMap, value, internal_api, short]}
616           STORAGEIP: {get_attr: [StoragePort, ip_address]}
617           STORAGEHOST: {get_attr: [NetHostMap, value, storage, short]}
618           STORAGE_MGMTIP: {get_attr: [StorageMgmtPort, ip_address]}
619           STORAGE_MGMTHOST: {get_attr: [NetHostMap, value, storage_mgmt, short]}
620           TENANTIP: {get_attr: [TenantPort, ip_address]}
621           TENANTHOST: {get_attr: [NetHostMap, value, tenant, short]}
622           MANAGEMENTIP: {get_attr: [ManagementPort, ip_address]}
623           MANAGEMENTHOST: {get_attr: [NetHostMap, value, management, short]}
624           CTLPLANEIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
625           CTLPLANEHOST: {get_attr: [NetHostMap, value, ctlplane, short]}
626           HOSTSSHPUBKEY: {get_attr: [SshHostPubKey, ecdsa]}
627   nova_server_resource:
628     description: Heat resource handle for the Nova compute server
629     value:
630       {get_resource: NovaCompute}
631     condition: server_not_blacklisted