Split out Nova software config
[apex-tripleo-heat-templates.git] / overcloud-without-mergepy.yaml
1 heat_template_version: 2014-10-16
2
3 description: >
4   Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
5   server,Dedicated RabbitMQ Server,Group of Nova Computes
6
7
8 # TODO(shadower): we should probably use the parameter groups to put
9 # some order in here.
10 parameters:
11
12   # Common parameters (not specific to a role)
13   AdminPassword:
14     default: unset
15     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
16     type: string
17     hidden: true
18   CeilometerMeteringSecret:
19     default: unset
20     description: Secret shared by the ceilometer services.
21     type: string
22     hidden: true
23   CeilometerPassword:
24     default: unset
25     description: The password for the ceilometer service account.
26     type: string
27     hidden: true
28   CloudName:
29     default: ''
30     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
31     type: string
32   ControlFixedIPs:
33     default: []
34     description: Should be used for arbitrary ips.
35     type: json
36   Debug:
37     default: ''
38     description: Set to True to enable debugging on all services.
39     type: string
40   DefaultSignalTransport:
41     default: CFN_SIGNAL
42     description: Transport to use for software-config signals.
43     type: string
44     constraints:
45       - allowed_values: [ CFN_SIGNAL, HEAT_SIGNAL, NO_SIGNAL ]
46   GlancePort:
47     default: "9292"
48     description: Glance port.
49     type: string
50   GlanceProtocol:
51     default: http
52     description: Protocol to use when connecting to glance, set to https for SSL.
53     type: string
54   ImageUpdatePolicy:
55     default: 'REBUILD_PRESERVE_EPHEMERAL'
56     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
57     type: string
58   KeyName:
59     default: default
60     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
61     type: string
62     constraints:
63       - custom_constraint: nova.keypair
64   NeutronBridgeMappings:
65     description: >
66       The OVS logical->physical bridge mappings to use. See the Neutron
67       documentation for details. Defaults to mapping br-ex - the external
68       bridge on hosts - to a physical name 'datacentre' which can be used
69       to create provider networks (and we use this for the default floating
70       network) - if changing this either use different post-install network
71       scripts or be sure to keep 'datacentre' as a mapping network name.
72     type: string
73     default: "datacentre:br-ex"
74   NeutronControlPlaneID:
75     default: ''
76     type: string
77     description: Neutron ID for ctlplane network.
78   NeutronEnableTunnelling:
79     type: string
80     default: "True"
81   NeutronFlatNetworks:
82     type: string
83     default: 'datacentre'
84     description: >
85       If set, flat networks to configure in neutron plugins. Defaults to
86       'datacentre' to permit external network creation.
87   NeutronNetworkType:
88     default: 'gre'
89     description: The tenant network type for Neutron, either gre or vxlan.
90     type: string
91   NeutronPassword:
92     default: unset
93     description: The password for the neutron service account, used by neutron agents.
94     type: string
95     hidden: true
96   NeutronPublicInterface:
97     default: eth0
98     description: What interface to bridge onto br-ex for network nodes.
99     type: string
100   NeutronPublicInterfaceTag:
101     default: ''
102     description: >
103       VLAN tag for creating a public VLAN. The tag will be used to
104       create an access port on the exterior bridge for each control plane node,
105       and that port will be given the IP address returned by neutron from the
106       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
107       overcloud.yaml to include the deployment of VLAN ports to the control
108       plane.
109     type: string
110   NeutronTunnelTypes:
111     default: 'gre'
112     description: |
113         The tunnel types for the Neutron tenant network. To specify multiple
114         values, use a comma separated string, like so: 'gre,vxlan'
115     type: string
116   NovaPassword:
117     default: unset
118     description: The password for the nova service account, used by nova-api.
119     type: string
120     hidden: true
121   NtpServer:
122     type: string
123     default: ''
124   PublicVirtualFixedIPs:
125     default: []
126     description: >
127         Control the IP allocation for the PublicVirtualInterface port. E.g.
128         [{'ip_address':'1.2.3.4'}]
129     type: json
130   PublicVirtualNetwork:
131     default: 'ctlplane'
132     type: string
133     description: >
134         Neutron network to allocate public virtual IP port on.
135   RabbitCookieSalt:
136     type: string
137     default: unset
138     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
139   RabbitUserName:
140     default: guest
141     description: The username for RabbitMQ
142     type: string
143   RabbitPassword:
144     default: guest
145     description: The password for RabbitMQ
146     type: string
147     hidden: true
148   SnmpdReadonlyUserName:
149     default: ro_snmp_user
150     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
151     type: string
152   SnmpdReadonlyUserPassword:
153     default: unset
154     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
155     type: string
156     hidden: true
157
158
159   # Controller-specific params
160   AdminToken:
161     default: unset
162     description: The keystone auth secret.
163     type: string
164     hidden: true
165   CinderLVMLoopDeviceSize:
166     default: 5000
167     description: The size of the loopback file used by the cinder LVM driver.
168     type: number
169   CinderPassword:
170     default: unset
171     description: The password for the cinder service account, used by cinder-api.
172     type: string
173     hidden: true
174   CinderISCSIHelper:
175     default: tgtadm
176     description: The iSCSI helper to use with cinder.
177     type: string
178   ControllerCount:
179     type: number
180     default: 1
181   controllerExtraConfig:
182     default: {}
183     description: |
184       Controller specific configuration to inject into the cluster. Same
185       structure as ExtraConfig.
186     type: json
187   controllerImage:
188     type: string
189     default: overcloud-control
190     constraints:
191       - custom_constraint: glance.image
192   OvercloudControlFlavor:
193     default: baremetal
194     description: Flavor for control nodes to request when deploying.
195     type: string
196     constraints:
197       - custom_constraint: nova.flavor
198   ControlVirtualInterface:
199     default: 'br-ex'
200     description: Interface where virtual ip will be assigned.
201     type: string
202   ExtraConfig:
203     default: {}
204     description: |
205       Additional configuration to inject into the cluster. The JSON should have
206       the following structure:
207         {"FILEKEY":
208           {"config":
209             [{"section": "SECTIONNAME",
210               "values":
211                 [{"option": "OPTIONNAME",
212                   "value": "VALUENAME"
213                  }
214                 ]
215              }
216             ]
217           }
218         }
219       For instance:
220         {"nova":
221           {"config":
222             [{"section": "default",
223               "values":
224                 [{"option": "force_config_drive",
225                   "value": "always"
226                  }
227                 ]
228              },
229              {"section": "cells",
230               "values":
231                 [{"option": "driver",
232                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
233                  }
234                 ]
235              }
236             ]
237           }
238         }
239     type: json
240   GlanceLogFile:
241     description: The filepath of the file to use for logging messages from Glance.
242     type: string
243     default: ''
244   GlanceNotifierStrategy:
245     description: Strategy to use for Glance notification queue
246     type: string
247     default: noop
248   GlancePassword:
249     default: unset
250     description: The password for the glance service account, used by the glance services.
251     type: string
252     hidden: true
253   HeatPassword:
254     default: unset
255     description: The password for the Heat service account, used by the Heat services.
256     type: string
257     hidden: true
258   HeatStackDomainAdminPassword:
259     description: Password for heat_domain_admin user.
260     type: string
261     default: ''
262     hidden: true
263   KeystoneCACertificate:
264     default: ''
265     description: Keystone self-signed certificate authority certificate.
266     type: string
267   KeystoneSigningCertificate:
268     default: ''
269     description: Keystone certificate for verifying token validity.
270     type: string
271   KeystoneSigningKey:
272     default: ''
273     description: Keystone key for signing tokens.
274     type: string
275     hidden: true
276   MysqlInnodbBufferPoolSize:
277     description: >
278         Specifies the size of the buffer pool in megabytes. Setting to
279         zero should be interpreted as "no value" and will defer to the
280         lower level default.
281     type: number
282     default: 0
283   NeutronDnsmasqOptions:
284     default: 'dhcp-option-force=26,1400'
285     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
286     type: string
287   NeutronPublicInterfaceDefaultRoute:
288     default: ''
289     description: A custom default route for the NeutronPublicInterface.
290     type: string
291   NeutronPublicInterfaceIP:
292     default: ''
293     description: A custom IP address to put onto the NeutronPublicInterface.
294     type: string
295   NeutronPublicInterfaceRawDevice:
296     default: ''
297     description: If set, the public interface is a vlan with this device as the raw device.
298     type: string
299   PublicVirtualInterface:
300     default: 'br-ex'
301     description: >
302         Specifies the interface where the public-facing virtual ip will be assigned.
303         This should be int_public when a VLAN is being used.
304     type: string
305   SSLCertificate:
306     default: ''
307     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
308     type: string
309     hidden: true
310   SSLKey:
311     default: ''
312     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
313     type: string
314     hidden: true
315   SSLCACertificate:
316     default: ''
317     description: If set, the contents of an SSL certificate authority file.
318     type: string
319   SwiftHashSuffix:
320     default: unset
321     description: A random string to be used as a salt when hashing to determine mappings in the ring.
322     type: string
323     hidden: true
324   SwiftPassword:
325     default: unset
326     description: The password for the swift service account, used by the swift proxy services.
327     type: string
328     hidden: true
329   SwiftPartPower:
330     default: 10
331     description: Partition Power to use when building Swift rings
332     type: number
333   SwiftReplicas:
334     type: number
335     default: 1
336     description: How many replicas to use in the swift rings.
337
338 # Compute-specific params
339   CeilometerComputeAgent:
340     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
341     type: string
342     default: ''
343     constraints:
344     - allowed_values: ['', Present]
345   ComputeCount:
346     type: number
347     default: 1
348   HypervisorNeutronPhysicalBridge:
349     default: 'br-ex'
350     description: >
351       An OVS bridge to create on each hypervisor. This defaults to br-ex the
352       same as the control plane nodes, as we have a uniform configuration of
353       the openvswitch agent. Typically should not need to be changed.
354     type: string
355   HypervisorNeutronPublicInterface:
356     default: 'eth0'
357     description: What interface to add to the HypervisorNeutronPhysicalBridge.
358     type: string
359   LiveUpdateComputeImage:
360     type: string
361     description: The image ID for live-updates to the overcloud compute nodes.
362     default: ''
363   LiveUpdateHost:
364     type: string
365     description: The IP address for the undercloud Glance API.
366     default: ''
367   LiveUpdatePassword:
368     type: string
369     default: ''
370     description: The live-update password for the undercloud Glance API.
371     hidden: true
372   LiveUpdateTenantName:
373     type: string
374     description: The live-update tenant name for the undercloud Glance API.
375     default: ''
376   LiveUpdateUserName:
377     type: string
378     description: The live-update username for the undercloud Glance API.
379     default: ''
380   NeutronNetworkVLANRanges:
381     default: 'datacentre'
382     description: >
383       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
384       Neutron documentation for permitted values. Defaults to permitting any
385       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
386     type: string
387   NovaComputeDriver:
388     type: string
389     default: libvirt.LibvirtDriver
390   NovaComputeExtraConfig:
391     default: {}
392     description: |
393       NovaCompute specific configuration to inject into the cluster. Same
394       structure as ExtraConfig.
395     type: json
396   NovaComputeLibvirtType:
397     default: ''
398     type: string
399   NovaImage:
400     type: string
401     default: overcloud-compute
402     constraints:
403       - custom_constraint: glance.image
404   OvercloudComputeFlavor:
405     description: Use this flavor
406     type: string
407     default: baremetal
408     constraints:
409       - custom_constraint: nova.flavor
410
411 # Block storage specific parameters
412   BlockStorageCount:
413     type: number
414     default: 1
415   BlockStorageImage:
416     default: overcloud-cinder-volume
417     type: string
418   OvercloudBlockStorageFlavor:
419     default: baremetal
420     description: Flavor for block storage nodes to request when deploying.
421     type: string
422
423 # Object storage specific parameters
424   ObjectStorageCount:
425     type: number
426     default: 0
427   OvercloudSwiftStorageFlavor:
428     default: baremetal
429     description: Flavor for Swift storage nodes to request when deploying.
430     type: string
431   SwiftStorageImage:
432     default: overcloud-swift-storage
433     type: string
434
435 resources:
436
437   Controller:
438     type: OS::Heat::ResourceGroup
439     properties:
440       count: {get_param: ControllerCount}
441       resource_def:
442         type: OS::TripleO::Controller
443         properties:
444           AdminPassword: {get_param: AdminPassword}
445           AdminToken: {get_param: AdminToken}
446           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
447           CeilometerPassword: {get_param: CeilometerPassword}
448           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
449           CinderPassword: {get_param: CinderPassword}
450           CinderISCSIHelper: {get_param: CinderISCSIHelper}
451           CloudName: {get_param: CloudName}
452           ControlVirtualInterface: {get_param: ControlVirtualInterface}
453           ControllerExtraConfig: {get_param: controllerExtraConfig}
454           ExtraConfig: {get_param: ExtraConfig}
455           Flavor: {get_param: OvercloudControlFlavor}
456           GlancePort: {get_param: GlancePort}
457           GlanceProtocol: {get_param: GlanceProtocol}
458           GlancePassword: {get_param: GlancePassword}
459           GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
460           GlanceLogFile: {get_param: GlanceLogFile}
461           HeatPassword: {get_param: HeatPassword}
462           HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
463           Image: {get_param: controllerImage}
464           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
465           KeyName: {get_param: KeyName}
466           KeystoneCACertificate: {get_param: KeystoneCACertificate}
467           KeystoneSigningCertificate: {get_param: KeystoneSigningCertificate}
468           KeystoneSigningKey: {get_param: KeystoneSigningKey}
469           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
470           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
471           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
472           NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
473           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
474           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
475           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
476           NeutronPublicInterface: {get_param: NeutronPublicInterface}
477           NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
478           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
479           NeutronPassword: {get_param: NeutronPassword}
480           NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
481           NovaPassword: {get_param: NovaPassword}
482           NtpServer: {get_param: NtpServer}
483           PublicVirtualInterface: {get_param: PublicVirtualInterface}
484           RabbitUserName: {get_param: RabbitUserName}
485           RabbitPassword: {get_param: RabbitPassword}
486           RabbitCookie: {get_attr: [RabbitCookie, value]}
487           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
488           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
489           SSLCertificate: {get_param: SSLCertificate}
490           SSLKey: {get_param: SSLKey}
491           SSLCACertificate: {get_param: SSLCACertificate}
492           SwiftHashSuffix: {get_param: SwiftHashSuffix}
493           SwiftPartPower: {get_param: SwiftPartPower}
494           SwiftPassword: {get_param: SwiftPassword}
495           SwiftReplicas: { get_param: SwiftReplicas}
496           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
497           PublicVirtualIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
498
499   Compute:
500     type: OS::Heat::ResourceGroup
501     properties:
502       count: {get_param: ComputeCount}
503       resource_def:
504         type: OS::TripleO::Compute
505         properties:
506           AdminPassword: {get_param: AdminPassword}
507           CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
508           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
509           CeilometerPassword: {get_param: CeilometerPassword}
510           ExtraConfig: {get_param: ExtraConfig}
511           Flavor: {get_param: OvercloudComputeFlavor}
512           GlanceHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
513           GlancePort: {get_param: GlancePort}
514           GlanceProtocol: {get_param: GlanceProtocol}
515           Image: {get_param: NovaImage}
516           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
517           KeyName: {get_param: KeyName}
518           KeystoneHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
519           LiveUpdateComputeImage: {get_param: LiveUpdateComputeImage}
520           LiveUpdateHost: {get_param: LiveUpdateHost}
521           LiveUpdatePassword: {get_param: LiveUpdatePassword}
522           LiveUpdateTenantName: {get_param: LiveUpdateTenantName}
523           LiveUpdateUserName: {get_param: LiveUpdateUserName}
524           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
525           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
526           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
527           NeutronHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
528           NeutronNetworkType: {get_param: NeutronNetworkType}
529           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
530           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
531           NeutronPassword: {get_param: NeutronPassword}
532           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
533           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
534           NovaApiHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
535           NovaComputeDriver: {get_param: NovaComputeDriver}
536           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
537           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
538           NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
539           NovaPassword: {get_param: NovaPassword}
540           NtpServer: {get_param: NtpServer}
541           RabbitHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
542           RabbitPassword: {get_param: RabbitPassword}
543           RabbitUserName: {get_param: RabbitUserName}
544           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
545           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
546           NovaDSN:
547             list_join:
548               - ''
549               - - mysql://nova:unset@
550                 - &compute_database_host {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
551                 - /nova
552           CeilometerDSN:
553             list_join:
554               - ''
555               - - mysql://ceilometer:unset@
556                 - *compute_database_host
557                 - /ceilometer
558           NeutronDSN:
559             list_join:
560               - ''
561               - - mysql://neutron:unset@
562                 - *compute_database_host
563                 - /ovs_neutron
564
565   BlockStorage:
566     type: OS::Heat::ResourceGroup
567     properties:
568       count: {get_param: BlockStorageCount}
569       resource_def:
570         type: OS::TripleO::BlockStorage
571         properties:
572           AdminPassword: {get_param: AdminPassword}
573           Image: {get_param: BlockStorageImage}
574           CinderISCSIHelper: {get_param: CinderISCSIHelper}
575           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
576           CinderPassword: {get_param: CinderPassword}
577           ControllerIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
578           KeyName: {get_param: KeyName}
579           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
580           NeutronNetworkType: {get_param: NeutronNetworkType}
581           NeutronPassword: {get_param: NeutronPassword}
582           NeutronPublicInterface: {get_param: NeutronPublicInterface}
583           Flavor: {get_param: OvercloudBlockStorageFlavor}
584           RabbitPassword: {get_param: RabbitPassword}
585           RabbitUserName: {get_param: RabbitUserName}
586
587   ObjectStorage:
588     type: OS::Heat::ResourceGroup
589     properties:
590       count: {get_param: ObjectStorageCount}
591       resource_def:
592         type: OS::TripleO::ObjectStorage
593         properties:
594           ControllerIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
595           KeyName: {get_param: KeyName}
596           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
597           NeutronNetworkType: {get_param: NeutronNetworkType}
598           Flavor: {get_param: OvercloudSwiftStorageFlavor}
599           HashSuffix: {get_param: SwiftHashSuffix}
600           PartPower: {get_param: SwiftPartPower}
601           Password: {get_param: SwiftPassword}
602           Image: {get_param: SwiftStorageImage}
603           Replicas: { get_param: SwiftReplicas}
604
605
606   allNodesConfig:
607     type: OS::Heat::StructuredConfig
608     properties:
609       config:
610         completion-signal: {get_input: deploy_signal_id}
611         hosts:
612           list_join:
613           - "\n"
614           - - list_join:
615               - "\n"
616               - {get_attr: [Compute, hosts_entry]}
617             - list_join:
618               - "\n"
619               - {get_attr: [Controller, hosts_entry]}
620             - list_join:
621               - "\n"
622               - {get_attr: [BlockStorage, hosts_entry]}
623             - list_join:
624               - "\n"
625               - {get_attr: [ObjectStorage, hosts_entry]}
626         rabbit:
627           nodes:
628             list_join:
629             - ','
630             - {get_attr: [Controller, hostname]}
631
632   MysqlRootPassword:
633     type: OS::Heat::RandomString
634     properties:
635       length: 10
636
637   MysqlClusterUniquePart:
638     type: OS::Heat::RandomString
639     properties:
640       length: 10
641
642   RabbitCookie:
643     type: OS::Heat::RandomString
644     properties:
645       length: 20
646       salt: {get_param: RabbitCookieSalt}
647
648   ControlVirtualIP:
649     type: OS::Neutron::Port
650     properties:
651       name: control_virtual_ip
652       network_id: {get_param: NeutronControlPlaneID}
653       fixed_ips: {get_param: ControlFixedIPs}
654       replacement_policy: AUTO
655
656   PublicVirtualIP:
657     type: OS::Neutron::Port
658     properties:
659       name: public_virtual_ip
660       network: {get_param: PublicVirtualNetwork}
661       fixed_ips: {get_param: PublicVirtualFixedIPs}
662       replacement_policy: AUTO
663
664   ControllerBootstrapNodeConfig:
665     type: OS::Heat::StructuredConfig
666     properties:
667       group: os-apply-config
668       config:
669         bootstrap_host:
670           bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
671
672   ControllerBootstrapNodeDeployment:
673     type: OS::Heat::StructuredDeployments
674     properties:
675       config: {get_resource: ControllerBootstrapNodeConfig}
676       servers: {get_attr: [Controller, attributes, nova_server_resource]}
677       signal_transport: NO_SIGNAL
678
679   ControllerSwiftDeployment:
680     type: OS::Heat::StructuredDeployments
681     properties:
682       config: {get_resource: SwiftDevicesAndProxyConfig}
683       servers: {get_attr: [Controller, attributes, nova_server_resource]}
684       signal_transport: NO_SIGNAL
685
686   ObjectStorageSwiftDeployment:
687     type: OS::Heat::StructuredDeployments
688     properties:
689       config: {get_resource: SwiftDevicesAndProxyConfig}
690       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
691       signal_transport: NO_SIGNAL
692
693   SwiftDevicesAndProxyConfig:
694     type: OS::Heat::StructuredConfig
695     properties:
696       group: os-apply-config
697       config:
698         swift:
699           devices:
700             list_join:
701             - ", "
702             - - list_join:
703                 - ", "
704                 - {get_attr: [Controller, swift_device]}
705               - list_join:
706                 - ", "
707                 - {get_attr: [ObjectStorage, swift_device]}
708           proxy-memcache:
709             list_join:
710             - ","
711             - {get_attr: [Controller, swift_proxy_memcache]}
712
713   ControllerClusterConfig:
714     type: OS::Heat::StructuredConfig
715     properties:
716       config:
717         corosync:
718           nodes: {get_attr: [Controller, corosync_node]}
719         horizon:
720           caches:
721             memcached:
722               nodes: {get_attr: [Controller, hostname]}
723         mysql:
724           nodes: {get_attr: [Controller, corosync_node]}
725         haproxy:
726           nodes: {get_attr: [Controller, corosync_node]}
727
728   ControllerClusterDeployment:
729     type: OS::Heat::StructuredDeployments
730     properties:
731       config: {get_resource: ControllerClusterConfig}
732       servers: {get_attr: [Controller, attributes, nova_server_resource]}
733       signal_transport: NO_SIGNAL
734
735   ControllerAllNodesDeployment:
736     type: OS::Heat::StructuredDeployments
737     properties:
738       config: {get_resource: allNodesConfig}
739       servers: {get_attr: [Controller, attributes, nova_server_resource]}
740
741   ComputeAllNodesDeployment:
742     type: OS::Heat::StructuredDeployments
743     properties:
744       config: {get_resource: allNodesConfig}
745       servers: {get_attr: [Compute, attributes, nova_server_resource]}
746
747
748 outputs:
749   KeystoneURL:
750     description: URL for the Overcloud Keystone service
751     value:
752       list_join:
753       - ''
754       - - http://
755         - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
756         - :5000/v2.0/