c25a6297682441fa6d91d54269a651be5c20ad05
[apex-tripleo-heat-templates.git] / puppet / compute.yaml
1 heat_template_version: 2015-04-30
2
3 description: >
4   OpenStack hypervisor node configured via Puppet.
5
6 parameters:
7   AdminPassword:
8     default: unset
9     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
10     type: string
11     hidden: true
12   CeilometerComputeAgent:
13     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
14     type: string
15     default: ''
16     constraints:
17     - allowed_values: ['', Present]
18   CeilometerMeteringSecret:
19     default: unset
20     description: Secret shared by the ceilometer services.
21     type: string
22     hidden: true
23   CeilometerPassword:
24     default: unset
25     description: The password for the ceilometer service account.
26     type: string
27     hidden: true
28   CinderEnableNfsBackend:
29     default: false
30     description: Whether to enable or not the NFS backend for Cinder
31     type: boolean
32   Debug:
33     default: ''
34     description: Set to True to enable debugging on all services.
35     type: string
36   ExtraConfig:
37     default: {}
38     description: |
39       Additional hiera configuration to inject into the cluster. Note
40       that NovaComputeExtraConfig takes precedence over ExtraConfig.
41     type: json
42   Flavor:
43     description: Flavor for the nova compute node
44     type: string
45     constraints:
46       - custom_constraint: nova.flavor
47   GlanceHost:
48     type: string
49     default: ''  # Has to be here because of the ignored empty value bug
50   GlancePort:
51     default: "9292"
52     description: Glance port.
53     type: string
54   GlanceProtocol:
55     default: http
56     description: Protocol to use when connecting to glance, set to https for SSL.
57     type: string
58   Image:
59     type: string
60     default: overcloud-compute
61     constraints:
62       - custom_constraint: glance.image
63   ImageUpdatePolicy:
64     default: 'REBUILD_PRESERVE_EPHEMERAL'
65     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
66     type: string
67   KeyName:
68     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
69     type: string
70     default: default
71     constraints:
72       - custom_constraint: nova.keypair
73   KeystoneAdminApiVirtualIP:
74     type: string
75     default: ''
76   KeystonePublicApiVirtualIP:
77      type: string
78      default: ''
79   NeutronBridgeMappings:
80     description: >
81       The OVS logical->physical bridge mappings to use. See the Neutron
82       documentation for details. Defaults to mapping br-ex - the external
83       bridge on hosts - to a physical name 'datacentre' which can be used
84       to create provider networks (and we use this for the default floating
85       network) - if changing this either use different post-install network
86       scripts or be sure to keep 'datacentre' as a mapping network name.
87     type: string
88     default: "datacentre:br-ex"
89   NeutronEnableTunnelling:
90     type: string
91     default: "True"
92   NeutronFlatNetworks:
93     type: string
94     default: 'datacentre'
95     description: >
96       If set, flat networks to configure in neutron plugins.
97   NeutronHost:
98     type: string
99     default: ''  # Has to be here because of the ignored empty value bug
100   NeutronNetworkType:
101     type: string
102     description: The tenant network type for Neutron, either gre or vxlan.
103     default: 'vxlan'
104   NeutronNetworkVLANRanges:
105     default: 'datacentre'
106     description: >
107       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
108       Neutron documentation for permitted values. Defaults to permitting any
109       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
110     type: comma_delimited_list
111   NeutronPassword:
112     default: unset
113     description: The password for the neutron service account, used by neutron agents.
114     type: string
115     hidden: true
116   NeutronPhysicalBridge:
117     default: 'br-ex'
118     description: An OVS bridge to create for accessing external networks.
119     type: string
120   NeutronPublicInterface:
121     default: nic1
122     description: A port to add to the NeutronPhysicalBridge.
123     type: string
124   NeutronTunnelTypes:
125     type: string
126     description: |
127         The tunnel types for the Neutron tenant network. To specify multiple
128         values, use a comma separated string, like so: 'gre,vxlan'
129     default: 'vxlan'
130   NeutronTunnelIdRanges:
131     description: |
132         Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
133         of GRE tunnel IDs that are available for tenant network allocation
134     default: ["1:1000", ]
135     type: comma_delimited_list
136   NeutronVniRanges:
137     description: |
138         Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
139         of VXLAN VNI IDs that are available for tenant network allocation
140     default: ["1:1000", ]
141     type: comma_delimited_list
142   NeutronPublicInterfaceRawDevice:
143     default: ''
144     type: string
145   NeutronDVR:
146     default: 'False'
147     type: string
148   NeutronMetadataProxySharedSecret:
149     default: 'unset'
150     description: Shared secret to prevent spoofing
151     type: string
152   NeutronCorePlugin:
153     default: 'ml2'
154     description: |
155         The core plugin for Neutron. The value should be the entrypoint to be loaded
156         from neutron.core_plugins namespace.
157     type: string
158   NeutronServicePlugins:
159     default: "router"
160     description: |
161         Comma-separated list of service plugin entrypoints to be loaded from the
162         neutron.service_plugins namespace.
163     type: comma_delimited_list
164   NeutronTypeDrivers:
165     default: "vxlan,vlan,flat,gre"
166     description: |
167         Comma-separated list of network type driver entrypoints to be loaded.
168     type: comma_delimited_list
169   NeutronMechanismDrivers:
170     default: 'openvswitch'
171     description: |
172         The mechanism drivers for the Neutron tenant network. To specify multiple
173         values, use a comma separated string, like so: 'openvswitch,l2_population'
174     type: string
175   # Not relevant for Computes, should be removed
176   NeutronAllowL3AgentFailover:
177     default: 'True'
178     description: Allow automatic l3-agent failover
179     type: string
180   # Not relevant for Computes, should be removed
181   NeutronL3HA:
182     default: 'False'
183     description: Whether to enable l3-agent HA
184     type: string
185   NeutronAgentMode:
186     default: 'dvr_snat'
187     description: Agent mode for the neutron-l3-agent on the controller hosts
188     type: string
189   NovaApiHost:
190     type: string
191     default: ''  # Has to be here because of the ignored empty value bug
192   NovaComputeDriver:
193     type: string
194     default: libvirt.LibvirtDriver
195   NovaComputeExtraConfig:
196     default: {}
197     description: |
198       NovaCompute specific configuration to inject into the cluster. Same
199       structure as ExtraConfig.
200     type: json
201   NovaComputeLibvirtType:
202     type: string
203     default: ''
204   NovaComputeLibvirtVifDriver:
205     default: ''
206     description: Libvirt VIF driver configuration for the network
207     type: string
208   NovaEnableRbdBackend:
209     default: false
210     description: Whether to enable or not the Rbd backend for Nova
211     type: boolean
212   NovaPassword:
213     default: unset
214     description: The password for the nova service account, used by nova-api.
215     type: string
216     hidden: true
217   NovaPublicIP:
218     type: string
219     default: ''  # Has to be here because of the ignored empty value bug
220   NovaOVSBridge:
221     default: 'br-int'
222     description: Name of integration bridge used by Open vSwitch
223     type: string
224   NovaSecurityGroupAPI:
225     default: 'neutron'
226     description: The full class name of the security API class
227     type: string
228   NtpServer:
229     type: string
230     default: ''
231   RabbitHost:
232     type: string
233     default: ''  # Has to be here because of the ignored empty value bug
234   RabbitPassword:
235     default: guest
236     description: The password for RabbitMQ
237     type: string
238     hidden: true
239   RabbitUserName:
240     default: guest
241     description: The username for RabbitMQ
242     type: string
243   RabbitClientUseSSL:
244     default: false
245     description: >
246         Rabbit client subscriber parameter to specify
247         an SSL connection to the RabbitMQ host.
248     type: string
249   RabbitClientPort:
250     default: 5672
251     description: Set rabbit subscriber port, change this if using SSL
252     type: number
253   SnmpdReadonlyUserName:
254     default: ro_snmp_user
255     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
256     type: string
257   SnmpdReadonlyUserPassword:
258     default: unset
259     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
260     type: string
261     hidden: true
262   EnablePackageInstall:
263     default: 'false'
264     description: Set to true to enable package installation via Puppet
265     type: boolean
266   ServiceNetMap:
267     default: {}
268     description: Mapping of service_name -> network name. Typically set
269                  via parameter_defaults in the resource registry.
270     type: json
271   UpdateIdentifier:
272     default: ''
273     type: string
274     description: >
275       Setting to a previously unused value during stack-update will trigger
276       package update on all nodes
277   Hostname:
278     type: string
279     default: '' # Defaults to Heat created hostname
280
281 resources:
282
283   NovaCompute:
284     type: OS::Nova::Server
285     properties:
286       image:
287         {get_param: Image}
288       image_update_policy:
289         get_param: ImageUpdatePolicy
290       flavor: {get_param: Flavor}
291       key_name: {get_param: KeyName}
292       networks:
293         - network: ctlplane
294       user_data_format: SOFTWARE_CONFIG
295       user_data: {get_resource: UserData}
296       name: {get_param: Hostname}
297
298   # Combine the NodeAdminUserData and NodeUserData mime archives
299   UserData:
300     type: OS::Heat::MultipartMime
301     properties:
302       parts:
303       - config: {get_resource: NodeAdminUserData}
304         type: multipart
305       - config: {get_resource: NodeUserData}
306         type: multipart
307
308   # Creates the "heat-admin" user if configured via the environment
309   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
310   NodeAdminUserData:
311     type: OS::TripleO::NodeAdminUserData
312
313   # For optional operator additional userdata
314   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
315   NodeUserData:
316     type: OS::TripleO::NodeUserData
317
318   InternalApiPort:
319     type: OS::TripleO::Compute::Ports::InternalApiPort
320     properties:
321       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
322
323   StoragePort:
324     type: OS::TripleO::Compute::Ports::StoragePort
325     properties:
326       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
327
328   TenantPort:
329     type: OS::TripleO::Compute::Ports::TenantPort
330     properties:
331       ControlPlaneIP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
332
333   NetIpMap:
334     type: OS::TripleO::Network::Ports::NetIpMap
335     properties:
336       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
337       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
338       StorageIp: {get_attr: [StoragePort, ip_address]}
339       TenantIp: {get_attr: [TenantPort, ip_address]}
340
341   NetworkConfig:
342     type: OS::TripleO::Compute::Net::SoftwareConfig
343     properties:
344       ControlPlaneIp: {get_attr: [NovaCompute, networks, ctlplane, 0]}
345       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
346       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
347       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
348
349   NetworkDeployment:
350     type: OS::TripleO::SoftwareDeployment
351     properties:
352       config: {get_resource: NetworkConfig}
353       server: {get_resource: NovaCompute}
354       input_values:
355         bridge_name: {get_param: NeutronPhysicalBridge}
356         interface_name: {get_param: NeutronPublicInterface}
357
358   NovaComputeConfig:
359     type: OS::Heat::StructuredConfig
360     properties:
361       group: os-apply-config
362       config:
363         hiera:
364           hierarchy:
365             - '"%{::uuid}"'
366             - heat_config_%{::deploy_config_name}
367             - compute_extraconfig
368             - extraconfig
369             - compute
370             - ceph_cluster # provided by CephClusterConfig
371             - ceph
372             - all_nodes # provided by allNodesConfig
373             - '"%{::osfamily}"'
374             - common
375             - cisco_n1kv_data  # Optionally provided by ComputeExtraConfigPre
376           datafiles:
377             compute_extraconfig:
378               mapped_data: {get_param: NovaComputeExtraConfig}
379             extraconfig:
380               mapped_data: {get_param: ExtraConfig}
381             common:
382               raw_data: {get_file: hieradata/common.yaml}
383             ceph:
384               raw_data: {get_file: hieradata/ceph.yaml}
385             compute:
386               raw_data: {get_file: hieradata/compute.yaml}
387               mapped_data:
388                 cinder_enable_nfs_backend: {get_input: cinder_enable_nfs_backend}
389                 nova::debug: {get_input: debug}
390                 nova::rabbit_userid: {get_input: rabbit_username}
391                 nova::rabbit_password: {get_input: rabbit_password}
392                 nova::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
393                 nova::rabbit_port: {get_input: rabbit_client_port}
394                 nova_compute_driver: {get_input: nova_compute_driver}
395                 nova::compute::libvirt::libvirt_virt_type: {get_input: nova_compute_libvirt_type}
396                 nova::compute::neutron::libvirt_vif_driver: {get_input: nova_compute_libvirt_vif_driver}
397                 nova_api_host: {get_input: nova_api_host}
398                 nova::compute::vncproxy_host: {get_input: nova_public_ip}
399                 nova::compute::rbd::ephemeral_storage: {get_input: nova_enable_rbd_backend}
400                 nova_password: {get_input: nova_password}
401                 nova::compute::vncserver_proxyclient_address: {get_input: nova_vnc_proxyclient_address}
402                 nova::network::neutron::neutron_ovs_bridge: {get_input: nova_ovs_bridge}
403                 nova::network::neutron::security_group_api: {get_input: nova_security_group_api}
404                 ceilometer::debug: {get_input: debug}
405                 ceilometer::rabbit_userid: {get_input: rabbit_username}
406                 ceilometer::rabbit_password: {get_input: rabbit_password}
407                 ceilometer::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
408                 ceilometer::rabbit_port: {get_input: rabbit_client_port}
409                 ceilometer::metering_secret: {get_input: ceilometer_metering_secret}
410                 ceilometer::agent::auth::auth_password: {get_input: ceilometer_password}
411                 ceilometer::agent::auth::auth_url: {get_input: ceilometer_agent_auth_url}
412                 ceilometer_compute_agent: {get_input: ceilometer_compute_agent}
413                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
414                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
415                 nova::glance_api_servers: {get_input: glance_api_servers}
416                 neutron::debug: {get_input: debug}
417                 neutron::rabbit_password: {get_input: rabbit_password}
418                 neutron::rabbit_user: {get_input: rabbit_user}
419                 neutron::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
420                 neutron::rabbit_port: {get_input: rabbit_client_port}
421                 neutron_flat_networks: {get_input: neutron_flat_networks}
422                 neutron_host: {get_input: neutron_host}
423                 neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
424
425                 neutron_tenant_network_type: {get_input: neutron_tenant_network_type}
426                 neutron_tunnel_types: {get_input: neutron_tunnel_types}
427                 neutron::plugins::ml2::network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
428                 neutron::plugins::ml2::tunnel_id_ranges: {get_input: neutron_tunnel_id_ranges}
429                 neutron::plugins::ml2::vni_ranges: {get_input: neutron_vni_ranges}
430                 neutron_bridge_mappings: {get_input: neutron_bridge_mappings}
431                 neutron::agents::ml2::ovs::enable_tunneling: {get_input: neutron_enable_tunneling}
432                 neutron_physical_bridge: {get_input: neutron_physical_bridge}
433                 neutron_public_interface: {get_input: neutron_public_interface}
434                 nova::network::neutron::neutron_admin_password: {get_input: neutron_password}
435                 nova::network::neutron::neutron_url: {get_input: neutron_url}
436                 nova::network::neutron::neutron_admin_auth_url: {get_input: neutron_admin_auth_url}
437                 neutron_router_distributed: {get_input: neutron_router_distributed}
438                 neutron_agent_mode: {get_input: neutron_agent_mode}
439                 neutron_metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
440                 neutron::core_plugin: {get_input: neutron_core_plugin}
441                 neutron::service_plugins: {get_input: neutron_service_plugins}
442                 neutron::plugins::ml2::type_drivers: {get_input: neutron_type_drivers}
443                 neutron_mechanism_drivers: {get_input: neutron_mechanism_drivers}
444                 neutron_public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
445                 admin_password: {get_input: admin_password}
446                 ntp::servers: {get_input: ntp_servers}
447                 tripleo::packages::enable_install: {get_input: enable_package_install}
448                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
449
450   NovaComputeDeployment:
451     type: OS::TripleO::SoftwareDeployment
452     depends_on: NetworkDeployment
453     properties:
454       config: {get_resource: NovaComputeConfig}
455       server: {get_resource: NovaCompute}
456       input_values:
457         cinder_enable_nfs_backend: {get_param: CinderEnableNfsBackend}
458         debug: {get_param: Debug}
459         nova_compute_driver: {get_param: NovaComputeDriver}
460         nova_compute_libvirt_type: {get_param: NovaComputeLibvirtType}
461         nova_compute_libvirt_vif_driver: {get_param: NovaComputeLibvirtVifDriver}
462         nova_public_ip: {get_param: NovaPublicIP}
463         nova_api_host: {get_param: NovaApiHost}
464         nova_password: {get_param: NovaPassword}
465         nova_enable_rbd_backend: {get_param: NovaEnableRbdBackend}
466         nova_vnc_proxyclient_address: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaVncProxyNetwork]}]}
467         nova_ovs_bridge: {get_param: NovaOVSBridge}
468         nova_security_group_api: {get_param: NovaSecurityGroupAPI}
469         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
470         ceilometer_password: {get_param: CeilometerPassword}
471         ceilometer_compute_agent: {get_param: CeilometerComputeAgent}
472         ceilometer_agent_auth_url:
473           list_join:
474             - ''
475             - - 'http://'
476               - {get_param: KeystonePublicApiVirtualIP}
477               - ':5000/v2.0'
478         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
479         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
480         glance_api_servers:
481           list_join:
482             - ''
483             - - {get_param: GlanceProtocol}
484               - '://'
485               - {get_param: GlanceHost}
486               - ':'
487               - {get_param: GlancePort}
488         neutron_flat_networks: {get_param: NeutronFlatNetworks}
489         neutron_host: {get_param: NeutronHost}
490         neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
491         neutron_tenant_network_type: {get_param: NeutronNetworkType}
492         neutron_tunnel_types: {get_param: NeutronTunnelTypes}
493         neutron_tunnel_id_ranges:
494           str_replace:
495             template: "['RANGES']"
496             params:
497               RANGES:
498                 list_join:
499                 - "','"
500                 - {get_param: NeutronTunnelIdRanges}
501         neutron_vni_ranges:
502           str_replace:
503             template: "['RANGES']"
504             params:
505               RANGES:
506                 list_join:
507                 - "','"
508                 - {get_param: NeutronVniRanges}
509         neutron_network_vlan_ranges:
510           str_replace:
511             template: "['RANGES']"
512             params:
513               RANGES:
514                 list_join:
515                 - "','"
516                 - {get_param: NeutronNetworkVLANRanges}
517         neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
518         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
519         neutron_physical_bridge: {get_param: NeutronPhysicalBridge}
520         neutron_public_interface: {get_param: NeutronPublicInterface}
521         neutron_password: {get_param: NeutronPassword}
522         neutron_agent_mode: {get_param: NeutronAgentMode}
523         neutron_router_distributed: {get_param: NeutronDVR}
524         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
525         neutron_core_plugin: {get_param: NeutronCorePlugin}
526         neutron_service_plugins:
527           str_replace:
528             template: "['PLUGINS']"
529             params:
530               PLUGINS:
531                 list_join:
532                 - "','"
533                 - {get_param: NeutronServicePlugins}
534         neutron_type_drivers:
535           str_replace:
536             template: "['DRIVERS']"
537             params:
538               DRIVERS:
539                 list_join:
540                 - "','"
541                 - {get_param: NeutronTypeDrivers}
542         neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
543         neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
544         neutron_url:
545           list_join:
546             - ''
547             - - 'http://'
548               - {get_param: NeutronHost}
549               - ':9696'
550         neutron_admin_auth_url:
551           list_join:
552             - ''
553             - - 'http://'
554               - {get_param: KeystoneAdminApiVirtualIP}
555               - ':35357/v2.0'
556         admin_password: {get_param: AdminPassword}
557         rabbit_username: {get_param: RabbitUserName}
558         rabbit_password: {get_param: RabbitPassword}
559         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
560         rabbit_client_port: {get_param: RabbitClientPort}
561         ntp_servers:
562           str_replace:
563             template: '["server"]'
564             params:
565               server: {get_param: NtpServer}
566         enable_package_install: {get_param: EnablePackageInstall}
567         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
568
569   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
570   ComputeExtraConfigPre:
571     depends_on: NovaComputeDeployment
572     type: OS::TripleO::ComputeExtraConfigPre
573     properties:
574         server: {get_resource: NovaCompute}
575
576   # Hook for site-specific additional pre-deployment config,
577   # applying to all nodes, e.g node registration/unregistration
578   NodeExtraConfig:
579     depends_on: ComputeExtraConfigPre
580     type: OS::TripleO::NodeExtraConfig
581     properties:
582         server: {get_resource: NovaCompute}
583
584   UpdateConfig:
585     type: OS::TripleO::Tasks::PackageUpdate
586
587   UpdateDeployment:
588     type: OS::Heat::SoftwareDeployment
589     properties:
590       config: {get_resource: UpdateConfig}
591       server: {get_resource: NovaCompute}
592       input_values:
593         update_identifier:
594           get_param: UpdateIdentifier
595
596 outputs:
597   ip_address:
598     description: IP address of the server in the ctlplane network
599     value: {get_attr: [NovaCompute, networks, ctlplane, 0]}
600   internal_api_ip_address:
601     description: IP address of the server in the internal_api network
602     value: {get_attr: [InternalApiPort, ip_address]}
603   storage_ip_address:
604     description: IP address of the server in the storage network
605     value: {get_attr: [StoragePort, ip_address]}
606   tenant_ip_address:
607     description: IP address of the server in the tenant network
608     value: {get_attr: [TenantPort, ip_address]}
609   hostname:
610     description: Hostname of the server
611     value: {get_attr: [NovaCompute, name]}
612   hosts_entry:
613     description: >
614       Server's IP address and hostname in the /etc/hosts format
615     value:
616       str_replace:
617         template: "IP HOST.localdomain HOST"
618         params:
619           IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ComputeHostnameResolveNetwork]}]}
620           HOST: {get_attr: [NovaCompute, name]}
621   nova_server_resource:
622     description: Heat resource handle for the Nova compute server
623     value:
624       {get_resource: NovaCompute}
625   config_identifier:
626     description: identifier which changes if the node configuration may need re-applying
627     value:
628       list_join:
629       - ','
630       - - {get_attr: [NovaComputeDeployment, deploy_stdout]}
631         - {get_attr: [ComputeExtraConfigPre, deploy_stdout]}
632         - {get_param: UpdateIdentifier}