19c65a4ea7d0761a3b34d843ba721248dfece1d6
[apex-tripleo-heat-templates.git] / overcloud-without-mergepy.yaml
1 heat_template_version: 2015-04-30
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   CeilometerBackend:
19     default: 'mongodb'
20     description: The ceilometer backend type.
21     type: string
22   CeilometerMeteringSecret:
23     default: unset
24     description: Secret shared by the ceilometer services.
25     type: string
26     hidden: true
27   CeilometerPassword:
28     default: unset
29     description: The password for the ceilometer service account.
30     type: string
31     hidden: true
32   # This has to be an UUID so for now we generate it outside the template
33   CephClusterFSID:
34     default: ''
35     type: string
36     description: The Ceph cluster FSID. Must be a UUID.
37   CephMonKey:
38     default: ''
39     description: The Ceph monitors key. Can be created with ceph-authtool --gen-print-key.
40     type: string
41   CephAdminKey:
42     default: ''
43     description: The Ceph admin client key. Can be created with ceph-authtool --gen-print-key.
44     type: string
45   CinderEnableIscsiBackend:
46     default: true
47     description: Whether to enable or not the Iscsi backend for Cinder
48     type: boolean
49   CloudName:
50     default: ''
51     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
52     type: string
53   ControlFixedIPs:
54     default: []
55     description: Should be used for arbitrary ips.
56     type: json
57   Debug:
58     default: ''
59     description: Set to True to enable debugging on all services.
60     type: string
61   GlancePort:
62     default: "9292"
63     description: Glance port.
64     type: string
65   GlanceProtocol:
66     default: http
67     description: Protocol to use when connecting to glance, set to https for SSL.
68     type: string
69   ImageUpdatePolicy:
70     default: 'REBUILD_PRESERVE_EPHEMERAL'
71     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
72     type: string
73   KeyName:
74     default: default
75     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
76     type: string
77     constraints:
78       - custom_constraint: nova.keypair
79   NeutronExternalNetworkBridge:
80     description: Name of bridge used for external network traffic.
81     type: string
82     default: 'br-ex'
83   NeutronBridgeMappings:
84     description: >
85       The OVS logical->physical bridge mappings to use. See the Neutron
86       documentation for details. Defaults to mapping br-ex - the external
87       bridge on hosts - to a physical name 'datacentre' which can be used
88       to create provider networks (and we use this for the default floating
89       network) - if changing this either use different post-install network
90       scripts or be sure to keep 'datacentre' as a mapping network name.
91     type: string
92     default: "datacentre:br-ex"
93   NeutronControlPlaneID:
94     default: ''
95     type: string
96     description: Neutron ID for ctlplane network.
97   NeutronEnableTunnelling:
98     type: string
99     default: "True"
100   NeutronFlatNetworks:
101     type: string
102     default: 'datacentre'
103     description: >
104       If set, flat networks to configure in neutron plugins. Defaults to
105       'datacentre' to permit external network creation.
106   NeutronNetworkType:
107     default: 'gre'
108     description: The tenant network type for Neutron, either gre or vxlan.
109     type: string
110   NeutronPassword:
111     default: unset
112     description: The password for the neutron service account, used by neutron agents.
113     type: string
114     hidden: true
115   NeutronPublicInterface:
116     default: nic1
117     description: What interface to bridge onto br-ex for network nodes.
118     type: string
119   NeutronPublicInterfaceTag:
120     default: ''
121     description: >
122       VLAN tag for creating a public VLAN. The tag will be used to
123       create an access port on the exterior bridge for each control plane node,
124       and that port will be given the IP address returned by neutron from the
125       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
126       overcloud.yaml to include the deployment of VLAN ports to the control
127       plane.
128     type: string
129   NeutronComputeAgentMode:
130     default: 'dvr'
131     description: Agent mode for the neutron-l3-agent on the compute hosts
132     type: string
133   NeutronAgentMode:
134     default: 'dvr_snat'
135     description: Agent mode for the neutron-l3-agent on the controller hosts
136     type: string
137   NeutronDVR:
138     default: 'False'
139     description: Whether to configure Neutron Distributed Virtual Routers
140     type: string
141   NeutronMetadataProxySharedSecret:
142     default: 'unset'
143     description: Shared secret to prevent spoofing
144     type: string
145   NeutronTunnelTypes:
146     default: 'gre'
147     description: |
148         The tunnel types for the Neutron tenant network. To specify multiple
149         values, use a comma separated string, like so: 'gre,vxlan'
150     type: string
151   NeutronTunnelIdRanges:
152     description: |
153         Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
154         of GRE tunnel IDs that are available for tenant network allocation
155     default: ["1:1000", ]
156     type: comma_delimited_list
157   NeutronVniRanges:
158     description: |
159         Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
160         of VXLAN VNI IDs that are available for tenant network allocation
161     default: ["1:1000", ]
162     type: comma_delimited_list
163   NeutronMechanismDrivers:
164     default: 'openvswitch'
165     description: |
166         The mechanism drivers for the Neutron tenant network. To specify multiple
167         values, use a comma separated string, like so: 'openvswitch,l2_population'
168     type: string
169   NeutronAllowL3AgentFailover:
170     default: 'True'
171     description: Allow automatic l3-agent failover
172     type: string
173   NeutronL3HA:
174     default: 'False'
175     description: Whether to enable l3-agent HA
176     type: string
177   NeutronDhcpAgentsPerNetwork:
178     type: number
179     default: 3
180     description: The number of neutron dhcp agents to schedule per network
181   NovaPassword:
182     default: unset
183     description: The password for the nova service account, used by nova-api.
184     type: string
185     hidden: true
186   NtpServer:
187     type: string
188     default: ''
189   MongoDbNoJournal:
190     default: false
191     description: Should MongoDb journaling be disabled
192     type: boolean
193   PublicVirtualFixedIPs:
194     default: []
195     description: >
196         Control the IP allocation for the PublicVirtualInterface port. E.g.
197         [{'ip_address':'1.2.3.4'}]
198     type: json
199   PublicVirtualNetwork:
200     default: 'ctlplane'
201     type: string
202     description: >
203         Neutron network to allocate public virtual IP port on.
204   RabbitCookieSalt:
205     type: string
206     default: unset
207     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
208   # FIXME: 'guest' is provisioned in RabbitMQ by default, we should create a user if these are changed
209   RabbitUserName:
210     default: guest
211     description: The username for RabbitMQ
212     type: string
213   RabbitPassword:
214     default: guest
215     description: The password for RabbitMQ
216     type: string
217     hidden: true
218   RabbitClientUseSSL:
219     default: false
220     description: >
221         Rabbit client subscriber parameter to specify
222         an SSL connection to the RabbitMQ host.
223     type: string
224   RabbitClientPort:
225     default: 5672
226     description: Set rabbit subscriber port, change this if using SSL
227     type: number
228   SnmpdReadonlyUserName:
229     default: ro_snmp_user
230     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
231     type: string
232   SnmpdReadonlyUserPassword:
233     default: unset
234     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
235     type: string
236     hidden: true
237
238   # Controller-specific params
239   AdminToken:
240     default: unset
241     description: The keystone auth secret.
242     type: string
243     hidden: true
244   CinderEnableRbdBackend:
245     default: false
246     description: Whether to enable or not the Rbd backend for Cinder
247     type: boolean
248   CinderLVMLoopDeviceSize:
249     default: 5000
250     description: The size of the loopback file used by the cinder LVM driver.
251     type: number
252   CinderPassword:
253     default: unset
254     description: The password for the cinder service account, used by cinder-api.
255     type: string
256     hidden: true
257   CinderISCSIHelper:
258     default: tgtadm
259     description: The iSCSI helper to use with cinder.
260     type: string
261   ControllerCount:
262     type: number
263     default: 1
264   controllerExtraConfig:
265     default: {}
266     description: |
267       Controller specific configuration to inject into the cluster. Same
268       structure as ExtraConfig.
269     type: json
270   controllerImage:
271     type: string
272     default: overcloud-control
273     constraints:
274       - custom_constraint: glance.image
275   OvercloudControlFlavor:
276     description: Flavor for control nodes to request when deploying.
277     type: string
278     constraints:
279       - custom_constraint: nova.flavor
280   ControlVirtualInterface:
281     default: 'br-ex'
282     description: Interface where virtual ip will be assigned.
283     type: string
284   EnableFencing:
285     default: false
286     description: Whether to enable fencing in Pacemaker or not.
287     type: boolean
288   EnableGalera:
289     default: true
290     description: Whether to use Galera instead of regular MariaDB.
291     type: boolean
292   ControllerEnableCephStorage:
293     default: false
294     description: Whether to deploy Ceph Storage (OSD) on the Controller
295     type: boolean
296   ControllerEnableSwiftStorage:
297     default: true
298     description: Whether to enable Swift Storage on the Controller
299     type: boolean
300   ExtraConfig:
301     default: {}
302     description: |
303       Additional configuration to inject into the cluster. The JSON should have
304       the following structure:
305         {"FILEKEY":
306           {"config":
307             [{"section": "SECTIONNAME",
308               "values":
309                 [{"option": "OPTIONNAME",
310                   "value": "VALUENAME"
311                  }
312                 ]
313              }
314             ]
315           }
316         }
317       For instance:
318         {"nova":
319           {"config":
320             [{"section": "default",
321               "values":
322                 [{"option": "force_config_drive",
323                   "value": "always"
324                  }
325                 ]
326              },
327              {"section": "cells",
328               "values":
329                 [{"option": "driver",
330                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
331                  }
332                 ]
333              }
334             ]
335           }
336         }
337     type: json
338   FencingConfig:
339     default: {}
340     description: |
341       Pacemaker fencing configuration. The JSON should have
342       the following structure:
343         {
344           "devices": [
345             {
346               "agent": "AGENT_NAME",
347               "host_mac": "HOST_MAC_ADDRESS",
348               "params": {"PARAM_NAME": "PARAM_VALUE"}
349             }
350           ]
351         }
352       For instance:
353         {
354           "devices": [
355             {
356               "agent": "fence_xvm",
357               "host_mac": "52:54:00:aa:bb:cc",
358               "params": {
359                 "multicast_address": "225.0.0.12",
360                 "port": "baremetal_0",
361                 "manage_fw": true,
362                 "manage_key_file": true,
363                 "key_file": "/etc/fence_xvm.key",
364                 "key_file_password": "abcdef"
365               }
366             }
367           ]
368         }
369     type: json
370   GlanceLogFile:
371     description: The filepath of the file to use for logging messages from Glance.
372     type: string
373     default: ''
374   GlanceNotifierStrategy:
375     description: Strategy to use for Glance notification queue
376     type: string
377     default: noop
378   GlancePassword:
379     default: unset
380     description: The password for the glance service account, used by the glance services.
381     type: string
382     hidden: true
383   GlanceBackend:
384     default: swift
385     description: The short name of the Glance backend to use. Should be one
386       of swift, rbd or file
387     type: string
388     constraints:
389     - allowed_values: ['swift', 'file', 'rbd']
390   HeatPassword:
391     default: unset
392     description: The password for the Heat service account, used by the Heat services.
393     type: string
394     hidden: true
395   HeatStackDomainAdminPassword:
396     description: Password for heat_domain_admin user.
397     type: string
398     default: ''
399     hidden: true
400   KeystoneCACertificate:
401     default: ''
402     description: Keystone self-signed certificate authority certificate.
403     type: string
404   KeystoneSigningCertificate:
405     default: ''
406     description: Keystone certificate for verifying token validity.
407     type: string
408   KeystoneSigningKey:
409     default: ''
410     description: Keystone key for signing tokens.
411     type: string
412     hidden: true
413   KeystoneSSLCertificate:
414     default: ''
415     description: Keystone certificate for verifying token validity.
416     type: string
417   KeystoneSSLCertificateKey:
418     default: ''
419     description: Keystone key for signing tokens.
420     type: string
421     hidden: true
422   MysqlInnodbBufferPoolSize:
423     description: >
424         Specifies the size of the buffer pool in megabytes. Setting to
425         zero should be interpreted as "no value" and will defer to the
426         lower level default.
427     type: number
428     default: 0
429   MysqlMaxConnections:
430     description: Configures MySQL max_connections config setting
431     type: number
432     default: 1024
433   NeutronDnsmasqOptions:
434     default: 'dhcp-option-force=26,1400'
435     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
436     type: string
437   NeutronPublicInterfaceDefaultRoute:
438     default: ''
439     description: A custom default route for the NeutronPublicInterface.
440     type: string
441   NeutronPublicInterfaceIP:
442     default: ''
443     description: A custom IP address to put onto the NeutronPublicInterface.
444     type: string
445   NeutronPublicInterfaceRawDevice:
446     default: ''
447     description: If set, the public interface is a vlan with this device as the raw device.
448     type: string
449   PublicVirtualInterface:
450     default: 'br-ex'
451     description: >
452         Specifies the interface where the public-facing virtual ip will be assigned.
453         This should be int_public when a VLAN is being used.
454     type: string
455   SSLCertificate:
456     default: ''
457     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
458     type: string
459     hidden: true
460   SSLKey:
461     default: ''
462     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
463     type: string
464     hidden: true
465   SSLCACertificate:
466     default: ''
467     description: If set, the contents of an SSL certificate authority file.
468     type: string
469   SwiftHashSuffix:
470     default: unset
471     description: A random string to be used as a salt when hashing to determine mappings in the ring.
472     type: string
473     hidden: true
474   SwiftPassword:
475     default: unset
476     description: The password for the swift service account, used by the swift proxy services.
477     type: string
478     hidden: true
479   SwiftMountCheck:
480     default: 'false'
481     description: Value of mount_check in Swift account/container/object -server.conf
482     type: boolean
483   SwiftMinPartHours:
484     type: number
485     default: 1
486     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
487   SwiftPartPower:
488     default: 10
489     description: Partition Power to use when building Swift rings
490     type: number
491   SwiftReplicas:
492     type: number
493     default: 3
494     description: How many replicas to use in the swift rings.
495
496 # Compute-specific params
497   CeilometerComputeAgent:
498     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
499     type: string
500     default: ''
501     constraints:
502     - allowed_values: ['', Present]
503   ComputeCount:
504     type: number
505     default: 1
506   HypervisorNeutronPhysicalBridge:
507     default: 'br-ex'
508     description: >
509       An OVS bridge to create on each hypervisor. This defaults to br-ex the
510       same as the control plane nodes, as we have a uniform configuration of
511       the openvswitch agent. Typically should not need to be changed.
512     type: string
513   HypervisorNeutronPublicInterface:
514     default: nic1
515     description: What interface to add to the HypervisorNeutronPhysicalBridge.
516     type: string
517   NeutronNetworkVLANRanges:
518     default: 'datacentre'
519     description: >
520       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
521       Neutron documentation for permitted values. Defaults to permitting any
522       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
523     type: comma_delimited_list
524   NovaComputeDriver:
525     type: string
526     default: libvirt.LibvirtDriver
527   NovaComputeExtraConfig:
528     default: {}
529     description: |
530       NovaCompute specific configuration to inject into the cluster. Same
531       structure as ExtraConfig.
532     type: json
533   NovaComputeLibvirtType:
534     default: ''
535     type: string
536   NovaEnableRbdBackend:
537     default: false
538     description: Whether to enable or not the Rbd backend for Nova
539     type: boolean
540   NovaImage:
541     type: string
542     default: overcloud-compute
543     constraints:
544       - custom_constraint: glance.image
545   OvercloudComputeFlavor:
546     description: Use this flavor
547     type: string
548     constraints:
549       - custom_constraint: nova.flavor
550   ServiceNetMap:
551     default:
552       NeutronTenantNetwork: tenant
553       CeilometerApiNetwork: internal_api
554       MongoDbNetwork: internal_api
555       CinderApiNetwork: internal_api
556       CinderIscsiNetwork: storage
557       GlanceApiNetwork: storage
558       GlanceRegistryNetwork: internal_api
559       KeystoneAdminApiNetwork: internal_api
560       KeystonePublicApiNetwork: internal_api
561       NeutronApiNetwork: internal_api
562       HeatApiNetwork: internal_api
563       NovaApiNetwork: internal_api
564       NovaMetadataNetwork: internal_api
565       NovaVncProxyNetwork: internal_api
566       SwiftMgmtNetwork: storage_mgmt
567       SwiftProxyNetwork: storage
568       HorizonNetwork: internal_api
569       MemcachedNetwork: internal_api
570       RabbitMqNetwork: internal_api
571       RedisNetwork: internal_api
572       MysqlNetwork: internal_api
573       CephClusterNetwork: storage_mgmt
574       CephPublicNetwork: storage
575       ControllerHostnameResolveNetwork: internal_api
576       ComputeHostnameResolveNetwork: internal_api
577       BlockStorageHostnameResolveNetwork: internal_api
578       ObjectStorageHostnameResolveNetwork: internal_api
579       CephStorageHostnameResolveNetwork: storage
580     description: Mapping of service_name -> network name. Typically set
581                  via parameter_defaults in the resource registry.
582     type: json
583
584 # Block storage specific parameters
585   BlockStorageCount:
586     type: number
587     default: 0
588   BlockStorageImage:
589     default: overcloud-cinder-volume
590     type: string
591   OvercloudBlockStorageFlavor:
592     description: Flavor for block storage nodes to request when deploying.
593     type: string
594     constraints:
595       - custom_constraint: nova.flavor
596
597 # Object storage specific parameters
598   ObjectStorageCount:
599     type: number
600     default: 0
601   OvercloudSwiftStorageFlavor:
602     description: Flavor for Swift storage nodes to request when deploying.
603     type: string
604     constraints:
605       - custom_constraint: nova.flavor
606   SwiftStorageImage:
607     default: overcloud-swift-storage
608     type: string
609
610 # Ceph storage specific parameters
611   CephStorageCount:
612     type: number
613     default: 0
614   CephStorageImage:
615     default: overcloud-ceph-storage
616     type: string
617   OvercloudCephStorageFlavor:
618     default: baremetal
619     description: Flavor for Ceph storage nodes to request when deploying.
620     type: string
621     constraints:
622       - custom_constraint: nova.flavor
623
624   # Hostname format for each role
625   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
626   # and %stackname% is replaced with OS::stack_name in the template below.
627   # If you want to use the heat generated names, pass '' (empty string).
628   ControllerHostnameFormat:
629     type: string
630     description: Format for Controller node hostnames
631     default: '%stackname%-controller-%index%'
632   ComputeHostnameFormat:
633     type: string
634     description: Format for Compute node hostnames
635     default: '%stackname%-novacompute-%index%'
636   BlockStorageHostnameFormat:
637     type: string
638     description: Format for BlockStorage node hostnames
639     default: '%stackname%-blockstorage-%index%'
640   ObjectStorageHostnameFormat:
641     type: string
642     description: Format for SwiftStorage node hostnames
643     default: '%stackname%-objectstorage-%index%'
644   CephStorageHostnameFormat:
645     type: string
646     description: Format for CephStorage node hostnames
647     default: '%stackname%-cephstorage-%index%'
648
649   # Identifiers to trigger tasks on nodes
650   UpdateIdentifier:
651     default: ''
652     type: string
653     description: >
654       Setting to a previously unused value during stack-update will trigger
655       package update on all nodes
656
657   # If you want to remove a specific node from a resource group, you can pass
658   # the node name or id as a <Group>RemovalPolicies parameter, for example:
659   # ComputeRemovalPolicies: [{'resource_list': ['0']}]
660   ControllerRemovalPolicies:
661     default: []
662     type: json
663     description: >
664       List of resources to be removed from ControllerResourceGroup when
665       doing an update which requires removal of specific resources.
666   ComputeRemovalPolicies:
667     default: []
668     type: json
669     description: >
670       List of resources to be removed from ComputeResourceGroup when
671       doing an update which requires removal of specific resources.
672   BlockStorageRemovalPolicies:
673     default: []
674     type: json
675     description: >
676       List of resources to be removed from BlockStorageResourceGroup when
677       doing an update which requires removal of specific resources.
678   ObjectStorageRemovalPolicies:
679     default: []
680     type: json
681     description: >
682       List of resources to be removed from ObjectStorageResourceGroup when
683       doing an update which requires removal of specific resources.
684   CephStorageRemovalPolicies:
685     default: []
686     type: json
687     description: >
688       List of resources to be removed from CephStorageResourceGroup when
689       doing an update which requires removal of specific resources.
690
691
692 resources:
693
694   HeatAuthEncryptionKey:
695     type: OS::Heat::RandomString
696
697   PcsdPassword:
698     type: OS::Heat::RandomString
699     properties:
700       length: 16
701
702   HorizonSecret:
703     type: OS::Heat::RandomString
704     properties:
705       length: 10
706
707   Controller:
708     type: OS::Heat::ResourceGroup
709     depends_on: Networks
710     properties:
711       count: {get_param: ControllerCount}
712       removal_policies: {get_param: ControllerRemovalPolicies}
713       resource_def:
714         type: OS::TripleO::Controller
715         properties:
716           AdminPassword: {get_param: AdminPassword}
717           AdminToken: {get_param: AdminToken}
718           CeilometerBackend: {get_param: CeilometerBackend}
719           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
720           CeilometerPassword: {get_param: CeilometerPassword}
721           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
722           CinderPassword: {get_param: CinderPassword}
723           CinderISCSIHelper: {get_param: CinderISCSIHelper}
724           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
725           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
726           CloudName: {get_param: CloudName}
727           ControlVirtualInterface: {get_param: ControlVirtualInterface}
728           ControllerExtraConfig: {get_param: controllerExtraConfig}
729           Debug: {get_param: Debug}
730           EnableFencing: {get_param: EnableFencing}
731           EnableGalera: {get_param: EnableGalera}
732           EnableCephStorage: {get_param: ControllerEnableCephStorage}
733           EnableSwiftStorage: {get_param: ControllerEnableSwiftStorage}
734           ExtraConfig: {get_param: ExtraConfig}
735           FencingConfig: {get_param: FencingConfig}
736           Flavor: {get_param: OvercloudControlFlavor}
737           GlancePort: {get_param: GlancePort}
738           GlanceProtocol: {get_param: GlanceProtocol}
739           GlancePassword: {get_param: GlancePassword}
740           GlanceBackend: {get_param: GlanceBackend}
741           GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
742           GlanceLogFile: {get_param: GlanceLogFile}
743           HeatPassword: {get_param: HeatPassword}
744           HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
745           HeatAuthEncryptionKey: {get_resource: HeatAuthEncryptionKey}
746           HorizonSecret: {get_resource: HorizonSecret}
747           Image: {get_param: controllerImage}
748           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
749           KeyName: {get_param: KeyName}
750           KeystoneCACertificate: {get_param: KeystoneCACertificate}
751           KeystoneSigningCertificate: {get_param: KeystoneSigningCertificate}
752           KeystoneSigningKey: {get_param: KeystoneSigningKey}
753           KeystoneSSLCertificate: {get_param: KeystoneSSLCertificate}
754           KeystoneSSLCertificateKey: {get_param: KeystoneSSLCertificateKey}
755           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
756           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
757           MysqlMaxConnections: {get_param: MysqlMaxConnections}
758           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
759           NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
760           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
761           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
762           NeutronExternalNetworkBridge: {get_param: NeutronExternalNetworkBridge}
763           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
764           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
765           NeutronPublicInterface: {get_param: NeutronPublicInterface}
766           NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
767           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
768           NeutronPassword: {get_param: NeutronPassword}
769           NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
770           NeutronDVR: {get_param: NeutronDVR}
771           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
772           NeutronAgentMode: {get_param: NeutronAgentMode}
773           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
774           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
775           NeutronL3HA: {get_param: NeutronL3HA}
776           NeutronDhcpAgentsPerNetwork: {get_param: NeutronDhcpAgentsPerNetwork}
777           NeutronNetworkType: {get_param: NeutronNetworkType}
778           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
779           NovaPassword: {get_param: NovaPassword}
780           NtpServer: {get_param: NtpServer}
781           MongoDbNoJournal: {get_param: MongoDbNoJournal}
782           PcsdPassword: {get_resource: PcsdPassword}
783           PublicVirtualInterface: {get_param: PublicVirtualInterface}
784           RabbitPassword: {get_param: RabbitPassword}
785           RabbitUserName: {get_param: RabbitUserName}
786           RabbitCookie: {get_attr: [RabbitCookie, value]}
787           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
788           RabbitClientPort: {get_param: RabbitClientPort}
789           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
790           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
791           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
792           SSLCertificate: {get_param: SSLCertificate}
793           SSLKey: {get_param: SSLKey}
794           SSLCACertificate: {get_param: SSLCACertificate}
795           SwiftHashSuffix: {get_param: SwiftHashSuffix}
796           SwiftMountCheck: {get_param: SwiftMountCheck}
797           SwiftMinPartHours: {get_param: SwiftMinPartHours}
798           SwiftPartPower: {get_param: SwiftPartPower}
799           SwiftPassword: {get_param: SwiftPassword}
800           SwiftReplicas: { get_param: SwiftReplicas}
801           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
802           PublicVirtualIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
803           ServiceNetMap: {get_param: ServiceNetMap}
804           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
805           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
806           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
807           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
808           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
809           UpdateIdentifier: {get_param: UpdateIdentifier}
810           Hostname:
811             str_replace:
812               template: {get_param: ControllerHostnameFormat}
813               params:
814                 '%stackname%': {get_param: 'OS::stack_name'}
815
816   Compute:
817     type: OS::Heat::ResourceGroup
818     depends_on: Networks
819     properties:
820       count: {get_param: ComputeCount}
821       removal_policies: {get_param: ComputeRemovalPolicies}
822       resource_def:
823         type: OS::TripleO::Compute
824         properties:
825           AdminPassword: {get_param: AdminPassword}
826           CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
827           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
828           CeilometerPassword: {get_param: CeilometerPassword}
829           Debug: {get_param: Debug}
830           ExtraConfig: {get_param: ExtraConfig}
831           Flavor: {get_param: OvercloudComputeFlavor}
832           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
833           GlancePort: {get_param: GlancePort}
834           GlanceProtocol: {get_param: GlanceProtocol}
835           Image: {get_param: NovaImage}
836           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
837           KeyName: {get_param: KeyName}
838           KeystoneHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
839           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
840           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
841           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
842           NeutronHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
843           NeutronNetworkType: {get_param: NeutronNetworkType}
844           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
845           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
846           NeutronPassword: {get_param: NeutronPassword}
847           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
848           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
849           NeutronDVR: {get_param: NeutronDVR}
850           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
851           NeutronAgentMode: {get_param: NeutronComputeAgentMode}
852           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
853           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
854           # L3 HA and Failover is not relevant for Computes, should be removed
855           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
856           NeutronL3HA: {get_param: NeutronL3HA}
857           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
858           NovaComputeDriver: {get_param: NovaComputeDriver}
859           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
860           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
861           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
862           NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
863           NovaPassword: {get_param: NovaPassword}
864           NtpServer: {get_param: NtpServer}
865           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
866           RabbitPassword: {get_param: RabbitPassword}
867           RabbitUserName: {get_param: RabbitUserName}
868           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
869           RabbitClientPort: {get_param: RabbitClientPort}
870           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
871           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
872           ServiceNetMap: {get_param: ServiceNetMap}
873           UpdateIdentifier: {get_param: UpdateIdentifier}
874           Hostname:
875             str_replace:
876               template: {get_param: ComputeHostnameFormat}
877               params:
878                 '%stackname%': {get_param: 'OS::stack_name'}
879
880   BlockStorage:
881     type: OS::Heat::ResourceGroup
882     depends_on: Networks
883     properties:
884       count: {get_param: BlockStorageCount}
885       removal_policies: {get_param: BlockStorageRemovalPolicies}
886       resource_def:
887         type: OS::TripleO::BlockStorage
888         properties:
889           Debug: {get_param: Debug}
890           Image: {get_param: BlockStorageImage}
891           CinderISCSIHelper: {get_param: CinderISCSIHelper}
892           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
893           # Purpose of the dedicated BlockStorage nodes should be to use their local LVM
894           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
895           CinderPassword: {get_param: CinderPassword}
896           KeyName: {get_param: KeyName}
897           Flavor: {get_param: OvercloudBlockStorageFlavor}
898           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
899           GlancePort: {get_param: GlancePort}
900           GlanceProtocol: {get_param: GlanceProtocol}
901           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
902           RabbitPassword: {get_param: RabbitPassword}
903           RabbitUserName: {get_param: RabbitUserName}
904           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
905           RabbitClientPort: {get_param: RabbitClientPort}
906           NtpServer: {get_param: NtpServer}
907           UpdateIdentifier: {get_param: UpdateIdentifier}
908           Hostname:
909             str_replace:
910               template: {get_param: BlockStorageHostnameFormat}
911               params:
912                 '%stackname%': {get_param: 'OS::stack_name'}
913           ServiceNetMap: {get_param: ServiceNetMap}
914           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
915
916   ObjectStorage:
917     type: OS::Heat::ResourceGroup
918     depends_on: Networks
919     properties:
920       count: {get_param: ObjectStorageCount}
921       removal_policies: {get_param: ObjectStorageRemovalPolicies}
922       resource_def:
923         type: OS::TripleO::ObjectStorage
924         properties:
925           KeyName: {get_param: KeyName}
926           Flavor: {get_param: OvercloudSwiftStorageFlavor}
927           HashSuffix: {get_param: SwiftHashSuffix}
928           MountCheck: {get_param: SwiftMountCheck}
929           MinPartHours: {get_param: SwiftMinPartHours}
930           PartPower: {get_param: SwiftPartPower}
931           Image: {get_param: SwiftStorageImage}
932           Replicas: { get_param: SwiftReplicas}
933           NtpServer: {get_param: NtpServer}
934           UpdateIdentifier: {get_param: UpdateIdentifier}
935           ServiceNetMap: {get_param: ServiceNetMap}
936           Hostname:
937             str_replace:
938               template: {get_param: ObjectStorageHostnameFormat}
939               params:
940                 '%stackname%': {get_param: 'OS::stack_name'}
941
942   CephStorage:
943     type: OS::Heat::ResourceGroup
944     depends_on: Networks
945     properties:
946       count: {get_param: CephStorageCount}
947       removal_policies: {get_param: CephStorageRemovalPolicies}
948       resource_def:
949         type: OS::TripleO::CephStorage
950         properties:
951           Image: {get_param: CephStorageImage}
952           KeyName: {get_param: KeyName}
953           Flavor: {get_param: OvercloudCephStorageFlavor}
954           NtpServer: {get_param: NtpServer}
955           ServiceNetMap: {get_param: ServiceNetMap}
956           UpdateIdentifier: {get_param: UpdateIdentifier}
957           Hostname:
958             str_replace:
959               template: {get_param: CephStorageHostnameFormat}
960               params:
961                 '%stackname%': {get_param: 'OS::stack_name'}
962
963   ControllerIpListMap:
964     type: OS::TripleO::Network::Ports::NetIpListMap
965     properties:
966       ExternalIpList: {get_attr: [Controller, external_ip_address]}
967       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
968       StorageIpList: {get_attr: [Controller, storage_ip_address]}
969       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
970       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
971
972   allNodesConfig:
973     type: OS::TripleO::AllNodes::SoftwareConfig
974     properties:
975       compute_hosts: {get_attr: [Compute, hosts_entry]}
976       controller_hosts: {get_attr: [Controller, hosts_entry]}
977       controller_ips: {get_attr: [Controller, ip_address]}
978       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
979       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
980       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
981       controller_names: {get_attr: [Controller, hostname]}
982       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
983       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
984       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
985       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
986       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
987       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
988       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
989       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
990       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
991       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
992       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
993       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
994       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
995       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
996       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
997       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
998       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
999
1000   MysqlRootPassword:
1001     type: OS::Heat::RandomString
1002     properties:
1003       length: 10
1004
1005   MysqlClusterUniquePart:
1006     type: OS::Heat::RandomString
1007     properties:
1008       length: 10
1009
1010   RabbitCookie:
1011     type: OS::Heat::RandomString
1012     properties:
1013       length: 20
1014       salt: {get_param: RabbitCookieSalt}
1015
1016   # creates the network architecture
1017   Networks:
1018     type: OS::TripleO::Network
1019
1020   ControlVirtualIP:
1021     type: OS::Neutron::Port
1022     depends_on: Networks
1023     properties:
1024       name: control_virtual_ip
1025       network_id: {get_param: NeutronControlPlaneID}
1026       fixed_ips: {get_param: ControlFixedIPs}
1027       replacement_policy: AUTO
1028
1029   RedisVirtualIP:
1030     depends_on: Networks
1031     type: OS::TripleO::Controller::Ports::RedisVipPort
1032     properties:
1033       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1034       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
1035       PortName: redis_virtual_ip
1036       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
1037
1038   # same as external
1039   PublicVirtualIP:
1040     type: OS::Neutron::Port
1041     depends_on: Networks
1042     properties:
1043       name: public_virtual_ip
1044       network: {get_param: PublicVirtualNetwork}
1045       fixed_ips: {get_param: PublicVirtualFixedIPs}
1046       replacement_policy: AUTO
1047
1048   InternalApiVirtualIP:
1049     depends_on: Networks
1050     type: OS::TripleO::Controller::Ports::InternalApiPort
1051     properties:
1052       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1053       PortName: internal_api_virtual_ip
1054
1055   StorageVirtualIP:
1056     depends_on: Networks
1057     type: OS::TripleO::Controller::Ports::StoragePort
1058     properties:
1059       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1060       PortName: storage_virtual_ip
1061
1062   StorageMgmtVirtualIP:
1063     depends_on: Networks
1064     type: OS::TripleO::Controller::Ports::StorageMgmtPort
1065     properties:
1066       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1067       PortName: storage_management_virtual_ip
1068
1069   VipMap:
1070     type: OS::TripleO::Network::Ports::NetIpMap
1071     properties:
1072       ExternalIp: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1073       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
1074       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1075       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1076       # No tenant VIP required
1077
1078   VipConfig:
1079     type: OS::TripleO::VipConfig
1080
1081   VipDeployment:
1082     type: OS::Heat::StructuredDeployments
1083     properties:
1084       config: {get_resource: VipConfig}
1085       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1086       input_values:
1087         # service VIP mappings
1088         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1089         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1090         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1091         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1092         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1093         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1094         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1095         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1096         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1097         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1098         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1099         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1100         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1101         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1102         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1103         # direct configuration of Virtual IPs for each network
1104         control_virtual_ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1105         public_virtual_ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1106         internal_api_virtual_ip: {get_attr: [InternalApiVirtualIP, ip_address]}
1107         storage_virtual_ip: {get_attr: [StorageVirtualIP, ip_address]}
1108         storage_mgmt_virtual_ip: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1109
1110   ControllerBootstrapNodeConfig:
1111     type: OS::TripleO::BootstrapNode::SoftwareConfig
1112     properties:
1113       bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1114       bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1115
1116   ControllerBootstrapNodeDeployment:
1117     type: OS::Heat::StructuredDeployments
1118     properties:
1119       config: {get_attr: [ControllerBootstrapNodeConfig, config_id]}
1120       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1121
1122   ControllerSwiftDeployment:
1123     type: OS::Heat::StructuredDeployments
1124     properties:
1125       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1126       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1127
1128   ObjectStorageSwiftDeployment:
1129     type: OS::Heat::StructuredDeployments
1130     properties:
1131       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1132       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1133
1134   SwiftDevicesAndProxyConfig:
1135     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1136     properties:
1137       controller_swift_devices: {get_attr: [Controller, swift_device]}
1138       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1139       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1140
1141   ComputeCephDeployment:
1142     type: OS::Heat::StructuredDeployments
1143     properties:
1144       config: {get_attr: [CephClusterConfig, config_id]}
1145       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1146
1147   ControllerCephDeployment:
1148     type: OS::Heat::StructuredDeployments
1149     properties:
1150       config: {get_attr: [CephClusterConfig, config_id]}
1151       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1152
1153   CephStorageCephDeployment:
1154     type: OS::Heat::StructuredDeployments
1155     properties:
1156       config: {get_attr: [CephClusterConfig, config_id]}
1157       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1158
1159   CephClusterConfig:
1160     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1161     properties:
1162       ceph_fsid: {get_param: CephClusterFSID}
1163       ceph_mon_key: {get_param: CephMonKey}
1164       ceph_admin_key: {get_param: CephAdminKey}
1165       ceph_mon_names: {get_attr: [Controller, hostname]}
1166       ceph_mon_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1167
1168   ControllerClusterConfig:
1169     type: OS::Heat::StructuredConfig
1170     properties:
1171       group: os-apply-config
1172       config:
1173         corosync:
1174           nodes: {get_attr: [Controller, corosync_node]}
1175         horizon:
1176           caches:
1177             memcached:
1178               nodes: {get_attr: [Controller, hostname]}
1179         mysql:
1180           nodes: {get_attr: [Controller, corosync_node]}
1181         haproxy:
1182           nodes: {get_attr: [Controller, corosync_node]}
1183
1184   ControllerClusterDeployment:
1185     type: OS::Heat::StructuredDeployments
1186     properties:
1187       config: {get_resource: ControllerClusterConfig}
1188       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1189
1190   ControllerAllNodesDeployment:
1191     type: OS::Heat::StructuredDeployments
1192     properties:
1193       config: {get_attr: [allNodesConfig, config_id]}
1194       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1195
1196   ComputeAllNodesDeployment:
1197     type: OS::Heat::StructuredDeployments
1198     properties:
1199       config: {get_attr: [allNodesConfig, config_id]}
1200       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1201
1202   BlockStorageAllNodesDeployment:
1203     type: OS::Heat::StructuredDeployments
1204     properties:
1205       config: {get_attr: [allNodesConfig, config_id]}
1206       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1207
1208   ObjectStorageAllNodesDeployment:
1209     type: OS::Heat::StructuredDeployments
1210     properties:
1211       config: {get_attr: [allNodesConfig, config_id]}
1212       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1213
1214   CephStorageAllNodesDeployment:
1215     type: OS::Heat::StructuredDeployments
1216     properties:
1217       config: {get_attr: [allNodesConfig, config_id]}
1218       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1219
1220   # Nested stack deployment runs after all other controller deployments
1221   ControllerNodesPostDeployment:
1222     type: OS::TripleO::ControllerPostDeployment
1223     depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1224     properties:
1225       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1226       NodeConfigIdentifiers: {get_attr: [Controller, attributes, config_identifier]}
1227
1228   ComputeNodesPostDeployment:
1229     type: OS::TripleO::ComputePostDeployment
1230     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1231     properties:
1232       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1233       NodeConfigIdentifiers: {get_attr: [Compute, attributes, config_identifier]}
1234
1235   ObjectStorageNodesPostDeployment:
1236     type: OS::TripleO::ObjectStoragePostDeployment
1237     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1238     properties:
1239       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1240       NodeConfigIdentifiers: {get_attr: [ObjectStorage, attributes, config_identifier]}
1241
1242
1243   BlockStorageNodesPostDeployment:
1244     type: OS::TripleO::BlockStoragePostDeployment
1245     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1246     properties:
1247       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1248       NodeConfigIdentifiers: {get_attr: [BlockStorage, attributes, config_identifier]}
1249
1250   CephStorageNodesPostDeployment:
1251     type: OS::TripleO::CephStoragePostDeployment
1252     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1253     properties:
1254       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1255       NodeConfigIdentifiers: {get_attr: [CephStorage, attributes, config_identifier]}
1256
1257 outputs:
1258   KeystoneURL:
1259     description: URL for the Overcloud Keystone service
1260     value:
1261       list_join:
1262       - ''
1263       - - http://
1264         - {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1265         - :5000/v2.0/
1266   PublicVip:
1267     description: Controller VIP for public API endpoints
1268     value: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1269   CeilometerInternalVip:
1270     description: VIP for Ceilometer API internal endpoint
1271     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1272   CinderInternalVip:
1273     description: VIP for Cinder API internal endpoint
1274     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1275   GlanceInternalVip:
1276     description: VIP for Glance API internal endpoint
1277     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1278   HeatInternalVip:
1279     description: VIP for Heat API internal endpoint
1280     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1281   KeystoneInternalVip:
1282     description: VIP for Keystone API internal endpoint
1283     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1284   NeutronInternalVip:
1285     description: VIP for Neutron API internal endpoint
1286     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1287   NovaInternalVip:
1288     description: VIP for Nova API internal endpoint
1289     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1290   SwiftInternalVip:
1291     description: VIP for Swift Proxy internal endpoint
1292     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}