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