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