Merge "Refactor Heat dependencies for nova compute"
[apex-tripleo-heat-templates.git] / overcloud-source.yaml
1 description: Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
2   server,Dedicated RabbitMQ Server,Group of Nova Computes
3 heat_template_version: 2013-05-23
4 parameters:
5   AdminPassword:
6     default: unset
7     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
8     type: string
9     hidden: true
10   AdminToken:
11     default: unset
12     description: The keystone auth secret.
13     type: string
14     hidden: true
15   CeilometerComputeAgent:
16     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
17     type: string
18     default: ''
19     constraints:
20     - allowed_values: ['', Present]
21   CeilometerMeteringSecret:
22     default: unset
23     description: Secret shared by the ceilometer services.
24     type: string
25     hidden: true
26   CeilometerPassword:
27     default: unset
28     description: The password for the ceilometer service account.
29     type: string
30     hidden: true
31   CinderISCSIHelper:
32     default: tgtadm
33     description: The iSCSI helper to use with cinder.
34     type: string
35   CinderLVMLoopDeviceSize:
36     default: 5000
37     description: The size of the loopback file used by the cinder LVM driver.
38     type: number
39   CinderPassword:
40     default: unset
41     description: The password for the cinder service account, used by cinder-api.
42     type: string
43     hidden: true
44   CloudName:
45     default: ''
46     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
47     type: string
48   ControlFixedIPs:
49     default: []
50     description: Should be used for arbitrary ips.
51     type: json
52   controllerExtraConfig:
53     default: {}
54     description: |
55       Controller specific configuration to inject into the cluster. Same
56       structure as ExtraConfig.
57     type: json
58   controllerImage:
59     type: string
60     default: overcloud-control
61   ControlVirtualInterface:
62     default: 'br-ex'
63     description: Interface where virtual ip will be assigned.
64     type: string
65   Debug:
66     default: ''
67     description: Set to True to enable debugging on all services.
68     type: string
69   DefaultSignalTransport:
70     default: CFN_SIGNAL
71     description: Transport to use for software-config signals.
72     type: string
73     constraints:
74       - allowed_values: [ CFN_SIGNAL, HEAT_SIGNAL, NO_SIGNAL ]
75   ExtraConfig:
76     default: {}
77     description: |
78       Additional configuration to inject into the cluster. The JSON should have
79       the following structure:
80         {"FILEKEY":
81           {"config":
82             [{"section": "SECTIONNAME",
83               "values":
84                 [{"option": "OPTIONNAME",
85                   "value": "VALUENAME"
86                  }
87                 ]
88              }
89             ]
90           }
91         }
92       For instance:
93         {"nova":
94           {"config":
95             [{"section": "default",
96               "values":
97                 [{"option": "force_config_drive",
98                   "value": "always"
99                  }
100                 ]
101              },
102              {"section": "cells",
103               "values":
104                 [{"option": "driver",
105                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
106                  }
107                 ]
108              }
109             ]
110           }
111         }
112     type: json
113   GlanceLogFile:
114     description: The filepath of the file to use for logging messages from Glance.
115     type: string
116     default: ''
117   GlancePassword:
118     default: unset
119     description: The password for the glance service account, used by the glance services.
120     type: string
121     hidden: true
122   GlancePort:
123     default: 9292
124     description: Glance port.
125     type: string
126   GlanceProtocol:
127     default: http
128     description: Protocol to use when connecting to glance, set to https for SSL.
129     type: string
130   GlanceNotifierStrategy:
131     description: Strategy to use for Glance notification queue
132     type: string
133     default: noop
134   HeatPassword:
135     default: unset
136     description: The password for the Heat service account, used by the Heat services.
137     type: string
138     hidden: true
139   HeatStackDomainAdminPassword:
140     description: Password for heat_domain_admin user.
141     type: string
142     default: ''
143     hidden: true
144   HypervisorNeutronPhysicalBridge:
145     default: 'br-ex'
146     description: >
147       An OVS bridge to create on each hypervisor. This defaults to br-ex the
148       same as the control plane nodes, as we have a uniform configuration of
149       the openvswitch agent. Typically should not need to be changed.
150     type: string
151   HypervisorNeutronPublicInterface:
152     default: 'eth0'
153     description: What interface to add to the HypervisorNeutronPhysicalBridge.
154     type: string
155   ImageUpdatePolicy:
156     default: 'REBUILD_PRESERVE_EPHEMERAL'
157     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
158     type: string
159   KeyName:
160     default: default
161     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
162     type: string
163   KeystoneCACertificate:
164     default: ''
165     description: Keystone self-signed certificate authority certificate.
166     type: string
167   KeystoneSigningCertificate:
168     default: ''
169     description: Keystone certificate for verifying token validity.
170     type: string
171   KeystoneSigningKey:
172     default: ''
173     description: Keystone key for signing tokens.
174     type: string
175     hidden: true
176   LiveUpdateComputeImage:
177     type: string
178     description: The image ID for live-updates to the overcloud compute nodes.
179     default: ''
180   LiveUpdateHost:
181     type: string
182     description: The IP address for the undercloud Glance API.
183     default: ''
184   LiveUpdatePassword:
185     type: string
186     default: ''
187     description: The live-update password for the undercloud Glance API.
188     hidden: true
189   LiveUpdateTenantName:
190     type: string
191     description: The live-update tenant name for the undercloud Glance API.
192     default: ''
193   LiveUpdateUserName:
194     type: string
195     description: The live-update username for the undercloud Glance API.
196     default: ''
197   MysqlInnodbBufferPoolSize:
198     description: >
199         Specifies the size of the buffer pool in megabytes. Setting to
200         zero should be interpreted as "no value" and will defer to the
201         lower level default.
202     type: number
203     default: 0
204   NeutronBridgeMappings:
205     description: >
206       The OVS logical->physical bridge mappings to use. See the Neutron
207       documentation for details. Defaults to mapping br-ex - the external
208       bridge on hosts - to a physical name 'datacentre' which can be used
209       to create provider networks (and we use this for the default floating
210       network) - if changing this either use different post-install network
211       scripts or be sure to keep 'datacentre' as a mapping network name.
212     type: string
213     default: "datacentre:br-ex"
214   NeutronControlPlaneID:
215     default: ''
216     type: string
217     description: Neutron ID for ctlplane network.
218   NeutronDnsmasqOptions:
219     default: 'dhcp-option-force=26,1400'
220     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
221     type: string
222   NeutronFlatNetworks:
223     type: string
224     default: 'datacentre'
225     description: >
226       If set, flat networks to configure in neutron plugins. Defaults to
227       'datacentre' to permit external network creation.
228   NeutronNetworkType:
229     default: 'gre'
230     description: The tenant network type for Neutron, either gre or vxlan.
231     type: string
232   NeutronNetworkVLANRanges:
233     default: 'datacentre'
234     description: >
235       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
236       Neutron documentation for permitted values. Defaults to permitting any
237       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
238     type: string
239   NeutronPassword:
240     default: unset
241     description: The password for the neutron service account, used by neutron agents.
242     type: string
243     hidden: true
244   NeutronPublicInterface:
245     default: eth0
246     description: What interface to bridge onto br-ex for network nodes.
247     type: string
248   NeutronPublicInterfaceDefaultRoute:
249     default: ''
250     description: A custom default route for the NeutronPublicInterface.
251     type: string
252   NeutronPublicInterfaceIP:
253     default: ''
254     description: A custom IP address to put onto the NeutronPublicInterface.
255     type: string
256   NeutronPublicInterfaceRawDevice:
257     default: ''
258     description: If set, the public interface is a vlan with this device as the raw device.
259     type: string
260   NeutronPublicInterfaceTag:
261     default: ''
262     description: >
263       VLAN tag for creating a public VLAN. The tag will be used to
264       create an access port on the exterior bridge for each control plane node,
265       and that port will be given the IP address returned by neutron from the
266       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
267       overcloud.yaml to include the deployment of VLAN ports to the control
268       plane.
269     type: string
270   NeutronTunnelTypes:
271     default: 'gre'
272     description: |
273         The tunnel types for the Neutron tenant network. To specify multiple
274         values, use a comma separated string, like so: 'gre,vxlan'
275     type: string
276   NovaComputeDriver:
277     default: libvirt.LibvirtDriver
278     type: string
279   NovaComputeExtraConfig:
280     default: {}
281     description: |
282       NovaCompute specific configuration to inject into the cluster. Same
283       structure as ExtraConfig.
284     type: json
285   NovaComputeLibvirtType:
286     default: ''
287     type: string
288   NovaImage:
289     type: string
290     default: overcloud-compute
291   NovaPassword:
292     default: unset
293     description: The password for the nova service account, used by nova-api.
294     type: string
295     hidden: true
296   NtpServer:
297     type: string
298     default: ''
299   OvercloudComputeFlavor:
300     default: baremetal
301     description: Flavor for compute nodes to request when deploying.
302     type: string
303   OvercloudControlFlavor:
304     default: baremetal
305     description: Flavor for control nodes to request when deploying.
306     type: string
307   PublicVirtualFixedIPs:
308     default: []
309     description: >
310         Control the IP allocation for the PublicVirtualInterface port. E.g.
311         [{'ip_address':'1.2.3.4'}]
312     type: json
313   PublicVirtualInterface:
314     default: 'br-ex'
315     description: >
316         Specifies the interface where the public-facing virtual ip will be assigned.
317         This should be int_public when a VLAN is being used.
318     type: string
319   PublicVirtualNetwork:
320     default: 'ctlplane'
321     type: string
322     description: >
323         Neutron network to allocate public virtual IP port on.
324   RabbitCookieSalt:
325     type: string
326     default: unset
327     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
328   RabbitPassword:
329     default: guest
330     description: The password for RabbitMQ
331     type: string
332     hidden: true
333   RabbitUserName:
334     default: guest
335     description: The username for RabbitMQ
336     type: string
337   SnmpdReadonlyUserName:
338     default: ro_snmp_user
339     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
340     type: string
341   SnmpdReadonlyUserPassword:
342     default: unset
343     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
344     type: string
345     hidden: true
346 resources:
347   ControlVirtualIP:
348     type: OS::Neutron::Port
349     properties:
350       name: control_virtual_ip
351       network_id: {get_param: NeutronControlPlaneID}
352       fixed_ips:
353         get_param: ControlFixedIPs
354   MysqlClusterUniquePart:
355     type: OS::Heat::RandomString
356     properties:
357       length: 10
358   MysqlRootPassword:
359     type: OS::Heat::RandomString
360     properties:
361       length: 10
362   PublicVirtualIP:
363     type: OS::Neutron::Port
364     properties:
365       name: public_virtual_ip
366       network: {get_param: PublicVirtualNetwork}
367       fixed_ips:
368         get_param: PublicVirtualFixedIPs
369   RabbitCookie:
370     type: OS::Heat::RandomString
371     properties:
372       length: 20
373       salt:
374         get_param: RabbitCookieSalt
375   NovaCompute0Deployment:
376     type: FileInclude
377     Path: nova-compute-instance.yaml
378     SubKey: resources.NovaCompute0Deployment
379     parameters:
380         DefaultSignalTransport:
381             get_param: DefaultSignalTransport
382         NovaApiHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
383         KeystoneHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
384         NeutronHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
385         GlanceHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
386         RabbitHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
387         NovaDSN:
388           Fn::Join:
389             - ''
390             - - mysql://nova:unset@
391               - &compute_database_host {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
392               - /nova
393         NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
394         CeilometerDSN:
395           Fn::Join:
396             - ''
397             - - mysql://ceilometer:unset@
398               - *compute_database_host
399               - /ceilometer
400         NeutronDSN:
401           Fn::Join:
402             - ''
403             - - mysql://neutron:unset@
404               - *compute_database_host
405               - /ovs_neutron
406         NeutronNetworkType:
407             get_param: NeutronNetworkType
408         NeutronTunnelTypes:
409             get_param: NeutronTunnelTypes
410         NeutronEnableTunnelling: "True"
411         NeutronFlatNetworks:
412             get_param: NeutronFlatNetworks
413         NeutronNetworkVLANRanges:
414             get_param: NeutronNetworkVLANRanges
415         NeutronPhysicalBridge:
416             get_param: HypervisorNeutronPhysicalBridge
417         NeutronPublicInterface:
418             get_param: HypervisorNeutronPublicInterface
419         NeutronBridgeMappings:
420             get_param: NeutronBridgeMappings
421   NovaCompute0AllNodesDeployment:
422     type: FileInclude
423     Path: nova-compute-instance.yaml
424     SubKey: resources.NovaCompute0AllNodesDeployment
425     parameters:
426         AllNodesConfig: {get_resource: allNodesConfig}
427   NovaCompute0:
428     type: FileInclude
429     Path: nova-compute-instance.yaml
430     SubKey: resources.NovaCompute0
431   NovaCompute0Passthrough:
432     type: FileInclude
433     Path: nova-compute-instance.yaml
434     SubKey: resources.NovaCompute0Passthrough
435     parameters:
436         passthrough_config: {get_param: ExtraConfig}
437   NovaCompute0PassthroughSpecific:
438     type: FileInclude
439     Path: nova-compute-instance.yaml
440     SubKey: resources.NovaCompute0PassthroughSpecific
441     parameters:
442         passthrough_config_specific: {get_param: NovaComputeExtraConfig}
443   controllerConfig:
444     type: OS::Heat::StructuredConfig
445     properties:
446       group: os-apply-config
447       config:
448         admin-password:
449           get_param: AdminPassword
450         admin-token:
451           get_param: AdminToken
452         bootstack:
453           public_interface_ip:
454             get_param: NeutronPublicInterfaceIP
455         bootstrap_host:
456           bootstrap_nodeid:
457             Fn::Select:
458             - 0
459             - Fn::Select:
460               - 0
461               - Merge::Map:
462                   controller0:
463                   - get_attr:
464                     - controller0
465                     - name
466           nodeid: {get_input: bootstack_nodeid}
467         database:
468           host: &database_host
469             {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
470         cinder:
471           db:
472             Fn::Join:
473               - ''
474               - - mysql://cinder:unset@
475                 - *database_host
476                 - /cinder
477           debug: {get_param: Debug}
478           volume_size_mb:
479             get_param: CinderLVMLoopDeviceSize
480           service-password:
481             get_param: CinderPassword
482           iscsi-helper:
483             get_param: CinderISCSIHelper
484         controller-address:
485           get_input: controller_host
486         corosync:
487           bindnetaddr: {get_input: controller_host}
488           mcastport: 5577
489           nodes:
490             Merge::Map:
491               controller0:
492                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
493         pacemaker:
494           stonith_enabled : false
495           recheck_interval : 5
496           quorum_policy : ignore
497         db-password: unset
498         glance:
499           registry:
500             host: {get_input: controller_virtual_ip}
501           backend: swift
502           db:
503             Fn::Join:
504               - ''
505               - - mysql://glance:unset@
506                 - *database_host
507                 - /glance
508           debug: {get_param: Debug}
509           host:
510             get_input: controller_virtual_ip
511           port:
512             get_param: GlancePort
513           protocol:
514             get_param: GlanceProtocol
515           service-password:
516             get_param: GlancePassword
517           swift-store-user: service:glance
518           swift-store-key:
519             get_param: GlancePassword
520           notifier-strategy:
521             get_param: GlanceNotifierStrategy
522           log-file:
523             get_param: GlanceLogFile
524         heat:
525           admin_password:
526             get_param: HeatPassword
527           admin_tenant_name: service
528           admin_user: heat
529           auth_encryption_key: unset___________
530           db:
531             Fn::Join:
532               - ''
533               - - mysql://heat:unset@
534                 - *database_host
535                 - /heat
536           debug: {get_param: Debug}
537           stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
538           watch_server_url: {get_input: heat.watch_server_url}
539           metadata_server_url: {get_input: heat.metadata_server_url}
540           waitcondition_server_url: {get_input: heat.waitcondition_server_url}
541         horizon:
542           caches:
543             memcached:
544               nodes:
545                 Merge::Map:
546                   controller0:
547                     {get_attr: [controller0, name]}
548         keystone:
549           db:
550             Fn::Join:
551               - ''
552               - - mysql://keystone:unset@
553                 - *database_host
554                 - /keystone
555           debug: {get_param: Debug}
556           host:
557             get_input: controller_virtual_ip
558           ca_certificate: {get_param: KeystoneCACertificate}
559           signing_key: {get_param: KeystoneSigningKey}
560           signing_certificate: {get_param: KeystoneSigningCertificate}
561         mysql:
562           innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
563           local_bind: true
564           root-password: {get_resource: MysqlRootPassword}
565           nodes:
566             Merge::Map:
567               controller0:
568                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
569           cluster_name:
570             Fn::Join:
571               - '-'
572               - - 'tripleo'
573                 - {get_resource: MysqlClusterUniquePart}
574         neutron:
575           debug: {get_param: Debug}
576           flat-networks: {get_param: NeutronFlatNetworks}
577           host: {get_input: controller_virtual_ip}
578           metadata_proxy_shared_secret: unset
579           ovs:
580             enable_tunneling: 'True'
581             local_ip:
582               get_input: controller_host
583             network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
584             bridge_mappings: {get_param: NeutronBridgeMappings}
585             public_interface:
586               get_param: NeutronPublicInterface
587             public_interface_raw_device:
588               get_param: NeutronPublicInterfaceRawDevice
589             public_interface_route:
590               get_param: NeutronPublicInterfaceDefaultRoute
591             public_interface_tag:
592               get_param: NeutronPublicInterfaceTag
593             physical_bridge: br-ex
594             tenant_network_type:
595               get_param: NeutronNetworkType
596             tunnel_types:
597               get_param: NeutronTunnelTypes
598           ovs_db:
599             Fn::Join:
600               - ''
601               - - mysql://neutron:unset@
602                 - *database_host
603                 - /ovs_neutron?charset=utf8
604           service-password:
605             get_param: NeutronPassword
606           dnsmasq-options:
607             get_param: NeutronDnsmasqOptions
608         ceilometer:
609           db:
610             Fn::Join:
611               - ''
612               - - mysql://ceilometer:unset@
613                 - *database_host
614                 - /ceilometer
615           debug: {get_param: Debug}
616           metering_secret: {get_param: CeilometerMeteringSecret}
617           service-password:
618             get_param: CeilometerPassword
619         snmpd:
620           export_MIB: UCD-SNMP-MIB
621           readonly_user_name:
622             get_param: SnmpdReadonlyUserName
623           readonly_user_password:
624             get_param: SnmpdReadonlyUserPassword
625         nova:
626           compute_driver: libvirt.LibvirtDriver
627           db:
628             Fn::Join:
629               - ''
630               - - mysql://nova:unset@
631                 - *database_host
632                 - /nova
633           default_floating_pool:
634             ext-net
635           host: {get_input: controller_virtual_ip}
636           metadata-proxy: true
637           service-password:
638             get_param: NovaPassword
639         rabbit:
640           host: {get_input: controller_virtual_ip}
641           username:
642             get_param: RabbitUserName
643           password:
644             get_param: RabbitPassword
645           cookie:
646             get_attr:
647             - RabbitCookie
648             - value
649         ntp:
650           servers:
651               - {server: {get_param: NtpServer}, fudge: "stratum 0"}
652         virtual_interfaces:
653           instances:
654             - vrrp_instance_name: VI_CONTROL
655               virtual_router_id: 51
656               keepalive_interface:
657                 get_param: ControlVirtualInterface
658               priority: 101
659               virtual_ips:
660               - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
661                 interface:
662                   get_param: ControlVirtualInterface
663             - vrrp_instance_name: VI_PUBLIC
664               virtual_router_id: 52
665               keepalive_interface:
666                 get_param: PublicVirtualInterface
667               priority: 101
668               virtual_ips:
669               - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
670                 interface:
671                   get_param: PublicVirtualInterface
672           vrrp_sync_groups:
673             - name: VG1
674               members:
675                 - VI_CONTROL
676                 - VI_PUBLIC
677         keepalived:
678           keepalive_interface:
679             get_param: PublicVirtualInterface
680           priority: 101
681         virtual_ips:
682             -
683               ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
684               interface:
685                 get_param: ControlVirtualInterface
686             -
687               ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
688               interface:
689                 get_param: PublicVirtualInterface
690         haproxy:
691           nodes:
692             Merge::Map:
693               controller0:
694                 ip: {get_attr: [controller0, networks, ctlplane, 0]}
695                 name: {get_attr: [controller0, name]}
696           net_binds:
697             - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
698           services:
699             - name: keystone_admin
700               port: 35357
701               net_binds: &public_binds
702                 - ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
703                 - ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
704             - name: keystone_public
705               port: 5000
706               net_binds: *public_binds
707             - name: horizon
708               port: 80
709               net_binds: *public_binds
710             - name: neutron
711               port: 9696
712               net_binds: *public_binds
713             - name: cinder
714               port: 8776
715               net_binds: *public_binds
716             - name: glance_api
717               port: 9292
718               net_binds: *public_binds
719             - name: glance_registry
720               port: 9191
721               net_binds: *public_binds
722             - name: heat_api
723               port: 8004
724               net_binds: *public_binds
725             - name: heat_cloudwatch
726               port: 8003
727               net_binds: *public_binds
728             - name: heat_cfn
729               port: 8000
730               net_binds: *public_binds
731             - name: mysql
732               port: 3306
733               extra_server_params:
734                 - backup
735               options:
736                 - timeout client 0
737                 - timeout server 0
738             - name: nova_ec2
739               port: 8773
740             - name: nova_osapi
741               port: 8774
742               net_binds: *public_binds
743             - name: nova_metadata
744               port: 8775
745               net_binds: *public_binds
746             - name: nova_novncproxy
747               port: 6080
748               net_binds: *public_binds
749             - name: ceilometer
750               port: 8777
751               net_binds: *public_binds
752             - name: swift_proxy_server
753               port: 8080
754               net_binds: *public_binds
755             - name: rabbitmq
756               port: 5672
757               options:
758                 - timeout client 0
759                 - timeout server 0
760   controllerPassthrough:
761     type: OS::Heat::StructuredConfig
762     properties:
763       group: os-apply-config
764       config: {get_input: passthrough_config}
765   controllerPassthroughSpecific:
766     type: OS::Heat::StructuredConfig
767     properties:
768       group: os-apply-config
769       config: {get_input: passthrough_config_specific}
770   controller0:
771     type: OS::Nova::Server
772     properties:
773       image:
774         get_param: controllerImage
775       image_update_policy:
776         get_param: ImageUpdatePolicy
777       flavor:
778         get_param: OvercloudControlFlavor
779       key_name:
780         get_param: KeyName
781       networks:
782         - network: ctlplane
783       user_data_format: SOFTWARE_CONFIG
784   controller0AllNodesDeployment:
785     depends_on: [controller0Deployment,controller0SSLDeployment,controller0Swift,controller0PassthroughSpecific]
786     type: OS::Heat::StructuredDeployment
787     properties:
788       signal_transport: {get_param: DefaultSignalTransport}
789       config: {get_resource: allNodesConfig}
790       server: {get_resource: controller0}
791   controller0Deployment:
792     type: OS::Heat::StructuredDeployment
793     properties:
794       signal_transport: NO_SIGNAL
795       config: {get_resource: controllerConfig}
796       server: {get_resource: controller0}
797       input_values:
798         bootstack_nodeid: {get_attr: [controller0, name]}
799         controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
800         controller_virtual_ip:
801           {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
802         heat.watch_server_url:
803           Fn::Join:
804             - ''
805             - - 'http://'
806               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
807               - ':8003'
808         heat.metadata_server_url:
809           Fn::Join:
810             - ''
811             - - 'http://'
812               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
813               - ':8000'
814         heat.waitcondition_server_url:
815           Fn::Join:
816             - ''
817             - - 'http://'
818               - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
819               - ':8000/v1/waitcondition'
820   allNodesConfig:
821     type: OS::Heat::StructuredConfig
822     properties:
823       config:
824         completion-signal: {get_input: deploy_signal_id}
825         hosts:
826           Fn::Join:
827           - "\n"
828           - - Fn::Join:
829               - "\n"
830               - Merge::Map:
831                   NovaCompute0:
832                     Fn::Join:
833                     - ' '
834                     - - {get_attr: [NovaCompute0, networks, ctlplane, 0]}
835                       - {get_attr: [NovaCompute0, name]}
836                       - Fn::Join:
837                         - '.'
838                         - - {get_attr: [NovaCompute0, name]}
839                           - 'novalocal'
840             - Fn::Join:
841               - "\n"
842               - Merge::Map:
843                   BlockStorage0:
844                     Fn::Join:
845                     - ' '
846                     - - {get_attr: [BlockStorage0, networks, ctlplane, 0]}
847                       - {get_attr: [BlockStorage0, name]}
848                       - Fn::Join:
849                         - '.'
850                         - - {get_attr: [BlockStorage0, name]}
851                           - 'novalocal'
852             - Fn::Join:
853               - "\n"
854               - Merge::Map:
855                   SwiftStorage0:
856                     Fn::Join:
857                     - ' '
858                     - - {get_attr: [SwiftStorage0, networks, ctlplane, 0]}
859                       - {get_attr: [SwiftStorage0, name]}
860                       - Fn::Join:
861                         - '.'
862                         - - {get_attr: [SwiftStorage0, name]}
863                           - 'novalocal'
864             - Fn::Join:
865               - "\n"
866               - Merge::Map:
867                   controller0:
868                     Fn::Join:
869                     - ' '
870                     - - {get_attr: [controller0, networks, ctlplane, 0]}
871                       - {get_attr: [controller0, name]}
872                       - Fn::Join:
873                         - '.'
874                         - - {get_attr: [controller0, name]}
875                           - 'novalocal'
876                       - {get_param: CloudName}
877         rabbit:
878           nodes:
879             Fn::Join:
880               - ','
881               - Merge::Map:
882                   controller0:
883                     {get_attr: [controller0, name]}
884   controller0SSLDeployment:
885     type: OS::Heat::StructuredDeployment
886     properties:
887       config: {get_resource: SSLConfig}
888       server: {get_resource: controller0}
889       signal_transport: NO_SIGNAL
890       input_values:
891         controller_host: {get_attr: [controller0, networks, ctlplane, 0]}
892         ssl_certificate: {get_param: SSLCertificate}
893         ssl_key: {get_param: SSLKey}
894         ssl_ca_certificate: {get_param: SSLCACertificate}
895   controller0Passthrough:
896     type: OS::Heat::StructuredDeployment
897     properties:
898       config: {get_resource: controllerPassthrough}
899       server: {get_resource: controller0}
900       signal_transport: NO_SIGNAL
901       input_values:
902         passthrough_config: {get_param: ExtraConfig}
903   controller0PassthroughSpecific:
904     depends_on: [controller0Passthrough]
905     type: OS::Heat::StructuredDeployment
906     properties:
907       config: {get_resource: controllerPassthroughSpecific}
908       server: {get_resource: controller0}
909       signal_transport: NO_SIGNAL
910       input_values:
911         passthrough_config_specific: {get_param: controllerExtraConfig}
912 outputs:
913   KeystoneURL:
914     description: URL for the Overcloud Keystone service
915     value:
916       Fn::Join:
917       - ''
918       - - http://
919         - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
920         - :5000/v2.0/