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