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