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