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