4e00b971c9df4df6d781445a6672054c6967704f
[apex-tripleo-heat-templates.git] / overcloud.yaml
1 heat_template_version: 2016-04-08
2
3 description: >
4   Deploy an OpenStack environment, consisting of several node types (roles),
5   Controller, Compute, BlockStorage, SwiftStorage and CephStorage.  The Storage
6   roles enable independent scaling of the storage components, but the minimal
7   deployment is one Controller and one Compute node.
8
9
10 # TODO(shadower): we should probably use the parameter groups to put
11 # some order in here.
12 parameters:
13
14   # Common parameters (not specific to a role)
15   AdminPassword:
16     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
17     type: string
18     hidden: true
19   AodhPassword:
20     description: The password for the aodh services.
21     type: string
22     hidden: true
23   CinderEnableNfsBackend:
24     default: false
25     description: Whether to enable or not the NFS backend for Cinder
26     type: boolean
27   CinderEnableRbdBackend:
28     default: false
29     description: Whether to enable or not the Rbd backend for Cinder
30     type: boolean
31   CloudName:
32     default: overcloud
33     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
34     type: string
35   ControlFixedIPs:
36     default: []
37     description: Should be used for arbitrary ips.
38     type: json
39   CorosyncIPv6:
40     default: false
41     description: Enable IPv6 in Corosync
42     type: boolean
43   Debug:
44     default: ''
45     description: Set to True to enable debugging on all services.
46     type: string
47   HAProxySyslogAddress:
48     default: /dev/log
49     description: Syslog address where HAproxy will send its log
50     type: string
51   ImageUpdatePolicy:
52     default: 'REBUILD_PRESERVE_EPHEMERAL'
53     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
54     type: string
55   InternalApiVirtualFixedIPs:
56     default: []
57     description: >
58         Control the IP allocation for the InternalApiVirtualInterface port. E.g.
59         [{'ip_address':'1.2.3.4'}]
60     type: json
61   KeyName:
62     default: default
63     description: Name of an existing Nova key pair to enable SSH access to the instances
64     type: string
65     constraints:
66       - custom_constraint: nova.keypair
67   MemcachedIPv6:
68     default: false
69     description: Enable IPv6 features in Memcached.
70     type: boolean
71   NeutronControlPlaneID:
72     default: 'ctlplane'
73     type: string
74     description: Neutron ID or name for ctlplane network.
75   NeutronPassword:
76     description: The password for the neutron service account, used by neutron agents.
77     type: string
78     hidden: true
79   NeutronPublicInterface:
80     default: nic1
81     description: What interface to bridge onto br-ex for network nodes.
82     type: string
83   NovaIPv6:
84     default: false
85     description: Enable IPv6 features in Nova
86     type: boolean
87   NovaPassword:
88     description: The password for the nova service account, used by nova-api.
89     type: string
90     hidden: true
91   PublicVirtualFixedIPs:
92     default: []
93     description: >
94         Control the IP allocation for the PublicVirtualInterface port. E.g.
95         [{'ip_address':'1.2.3.4'}]
96     type: json
97   RabbitCookieSalt:
98     type: string
99     default: unset
100     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
101   RabbitUserName:
102     default: guest
103     description: The username for RabbitMQ
104     type: string
105   RabbitPassword:
106     description: The password for RabbitMQ
107     type: string
108     hidden: true
109   RabbitClientUseSSL:
110     default: false
111     description: >
112         Rabbit client subscriber parameter to specify
113         an SSL connection to the RabbitMQ host.
114     type: string
115   RabbitClientPort:
116     default: 5672
117     description: Set rabbit subscriber port, change this if using SSL
118     type: number
119   RedisPassword:
120     description: The password for Redis
121     type: string
122     hidden: true
123   StorageVirtualFixedIPs:
124     default: []
125     description: >
126         Control the IP allocation for the StorageVirtualInterface port. E.g.
127         [{'ip_address':'1.2.3.4'}]
128     type: json
129   StorageMgmtVirtualFixedIPs:
130     default: []
131     description: >
132         Control the IP allocation for the StorageMgmgVirtualInterface port. E.g.
133         [{'ip_address':'1.2.3.4'}]
134     type: json
135   CloudDomain:
136     default: 'localdomain'
137     type: string
138     description: >
139       The DNS domain used for the hosts. This should match the dhcp_domain
140       configured in the Undercloud neutron. Defaults to localdomain.
141   ServerMetadata:
142     default: {}
143     description: >
144       Extra properties or metadata passed to Nova for the created nodes in
145       the overcloud. It's accessible via the Nova metadata API.
146     type: json
147
148   # Controller-specific params
149   ControllerCount:
150     type: number
151     default: 1
152   controllerExtraConfig:
153     default: {}
154     description: |
155       Deprecated. Use ControllerExtraConfig via parameter_defaults instead.
156     type: json
157   controllerImage:
158     type: string
159     default: overcloud-full
160     constraints:
161       - custom_constraint: glance.image
162   OvercloudControlFlavor:
163     description: Flavor for control nodes to request when deploying.
164     default: baremetal
165     type: string
166     constraints:
167       - custom_constraint: nova.flavor
168   ControlVirtualInterface:
169     default: 'br-ex'
170     description: Interface where virtual ip will be assigned.
171     type: string
172   EnableFencing:
173     default: false
174     description: Whether to enable fencing in Pacemaker or not.
175     type: boolean
176   EnableGalera:
177     default: true
178     description: Whether to use Galera instead of regular MariaDB.
179     type: boolean
180   ControllerSchedulerHints:
181     type: json
182     description: Optional scheduler hints to pass to nova
183     default: {}
184   ExtraConfig:
185     default: {}
186     description: |
187       Additional configuration to inject into the cluster. The format required
188       may be implementation specific, e.g puppet hieradata.  Any role specific
189       ExtraConfig, e.g controllerExtraConfig takes precedence over ExtraConfig.
190     type: json
191   FencingConfig:
192     default: {}
193     description: |
194       Pacemaker fencing configuration. The JSON should have
195       the following structure:
196         {
197           "devices": [
198             {
199               "agent": "AGENT_NAME",
200               "host_mac": "HOST_MAC_ADDRESS",
201               "params": {"PARAM_NAME": "PARAM_VALUE"}
202             }
203           ]
204         }
205       For instance:
206         {
207           "devices": [
208             {
209               "agent": "fence_xvm",
210               "host_mac": "52:54:00:aa:bb:cc",
211               "params": {
212                 "multicast_address": "225.0.0.12",
213                 "port": "baremetal_0",
214                 "manage_fw": true,
215                 "manage_key_file": true,
216                 "key_file": "/etc/fence_xvm.key",
217                 "key_file_password": "abcdef"
218               }
219             }
220           ]
221         }
222     type: json
223     type: string
224     hidden: true
225   InstanceNameTemplate:
226     default: 'instance-%08x'
227     description: Template string to be used to generate instance names
228     type: string
229   ManageFirewall:
230     default: true
231     description: Whether to manage IPtables rules.
232     type: boolean
233   PurgeFirewallRules:
234     default: false
235     description: Whether IPtables rules should be purged before setting up the ones.
236     type: boolean
237   MysqlInnodbBufferPoolSize:
238     description: >
239         Specifies the size of the buffer pool in megabytes. Setting to
240         zero should be interpreted as "no value" and will defer to the
241         lower level default.
242     type: number
243     default: 0
244   MysqlMaxConnections:
245     description: Configures MySQL max_connections config setting
246     type: number
247     default: 4096
248   PublicVirtualInterface:
249     default: 'br-ex'
250     description: >
251         Specifies the interface where the public-facing virtual ip will be assigned.
252         This should be int_public when a VLAN is being used.
253     type: string
254   SwiftHashSuffix:
255     description: A random string to be used as a salt when hashing to determine mappings in the ring.
256     type: string
257     hidden: true
258   SwiftMinPartHours:
259     type: number
260     default: 1
261     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
262   SwiftPartPower:
263     default: 10
264     description: Partition Power to use when building Swift rings
265     type: number
266   SwiftReplicas:
267     type: number
268     default: 3
269     description: How many replicas to use in the swift rings.
270
271 # Compute-specific params
272   ComputeCount:
273     type: number
274     default: 1
275   HypervisorNeutronPhysicalBridge:
276     default: 'br-ex'
277     description: >
278       An OVS bridge to create on each hypervisor. This defaults to br-ex the
279       same as the control plane nodes, as we have a uniform configuration of
280       the openvswitch agent. Typically should not need to be changed.
281     type: string
282   HypervisorNeutronPublicInterface:
283     default: nic1
284     description: What interface to add to the HypervisorNeutronPhysicalBridge.
285     type: string
286   NovaComputeDriver:
287     type: string
288     default: libvirt.LibvirtDriver
289   NovaComputeExtraConfig:
290     default: {}
291     description: |
292       NovaCompute specific configuration to inject into the cluster. Same
293       structure as ExtraConfig.
294     type: json
295   NovaComputeLibvirtType:
296     default: kvm
297     type: string
298   NovaComputeLibvirtVifDriver:
299     default: ''
300     description: Libvirt VIF driver configuration for the network
301     type: string
302   NovaComputeSchedulerHints:
303     type: json
304     description: Optional scheduler hints to pass to nova
305     default: {}
306   NovaEnableRbdBackend:
307     default: false
308     description: Whether to enable or not the Rbd backend for Nova
309     type: boolean
310   NovaImage:
311     type: string
312     default: overcloud-full
313     constraints:
314       - custom_constraint: glance.image
315   NovaOVSBridge:
316     default: 'br-int'
317     description: Name of integration bridge used by Open vSwitch
318     type: string
319   NovaSecurityGroupAPI:
320     default: 'neutron'
321     description: The full class name of the security API class
322     type: string
323   OvercloudComputeFlavor:
324     description: Use this flavor
325     default: baremetal
326     type: string
327     constraints:
328       - custom_constraint: nova.flavor
329   ServiceNetMap:
330     default:
331       NeutronTenantNetwork: tenant
332       CeilometerApiNetwork: internal_api
333       AodhApiNetwork: internal_api
334       GnocchiApiNetwork: internal_api
335       MongoDbNetwork: internal_api
336       CinderApiNetwork: internal_api
337       CinderIscsiNetwork: storage
338       GlanceApiNetwork: storage
339       GlanceRegistryNetwork: internal_api
340       IronicApiNetwork: internal_api
341       KeystoneAdminApiNetwork: ctlplane # allows undercloud to config endpoints
342       KeystonePublicApiNetwork: internal_api
343       NeutronApiNetwork: internal_api
344       HeatApiNetwork: internal_api
345       NovaApiNetwork: internal_api
346       NovaMetadataNetwork: internal_api
347       NovaVncProxyNetwork: internal_api
348       SwiftMgmtNetwork: storage_mgmt
349       SwiftProxyNetwork: storage
350       SaharaApiNetwork: internal_api
351       HorizonNetwork: internal_api
352       MemcachedNetwork: internal_api
353       RabbitMqNetwork: internal_api
354       RedisNetwork: internal_api
355       MysqlNetwork: internal_api
356       CephClusterNetwork: storage_mgmt
357       CephPublicNetwork: storage
358       ControllerHostnameResolveNetwork: internal_api
359       ComputeHostnameResolveNetwork: internal_api
360       BlockStorageHostnameResolveNetwork: internal_api
361       ObjectStorageHostnameResolveNetwork: internal_api
362       CephStorageHostnameResolveNetwork: storage
363     description: Mapping of service_name -> network name. Typically set
364                  via parameter_defaults in the resource registry.
365     type: json
366
367   ControllerServices:
368     default:
369       - OS::TripleO::Services::CephMon
370       - OS::TripleO::Services::CephExternal
371       - OS::TripleO::Services::CinderApi
372       - OS::TripleO::Services::CinderScheduler
373       - OS::TripleO::Services::CinderVolume
374       - OS::TripleO::Services::Kernel
375       - OS::TripleO::Services::Keystone
376       - OS::TripleO::Services::GlanceApi
377       - OS::TripleO::Services::GlanceRegistry
378       - OS::TripleO::Services::HeatApi
379       - OS::TripleO::Services::HeatApiCfn
380       - OS::TripleO::Services::HeatApiCloudwatch
381       - OS::TripleO::Services::HeatEngine
382       - OS::TripleO::Services::MySQL
383       - OS::TripleO::Services::NeutronDhcpAgent
384       - OS::TripleO::Services::NeutronL3Agent
385       - OS::TripleO::Services::NeutronMetadataAgent
386       - OS::TripleO::Services::NeutronServer
387       - OS::TripleO::Services::NeutronCorePlugin
388       - OS::TripleO::Services::NeutronOvsAgent
389       - OS::TripleO::Services::RabbitMQ
390       - OS::TripleO::Services::HAproxy
391       - OS::TripleO::Services::Keepalived
392       - OS::TripleO::Services::Memcached
393       - OS::TripleO::Services::Pacemaker
394       - OS::TripleO::Services::Redis
395       - OS::TripleO::Services::NovaConductor
396       - OS::TripleO::Services::MongoDb
397       - OS::TripleO::Services::NovaApi
398       - OS::TripleO::Services::NovaScheduler
399       - OS::TripleO::Services::NovaConsoleauth
400       - OS::TripleO::Services::NovaVncproxy
401       - OS::TripleO::Services::Ntp
402       - OS::TripleO::Services::SwiftProxy
403       - OS::TripleO::Services::SwiftStorage
404       - OS::TripleO::Services::Snmp
405       - OS::TripleO::Services::Timezone
406       - OS::TripleO::Services::CeilometerApi
407       - OS::TripleO::Services::CeilometerCollector
408       - OS::TripleO::Services::CeilometerExpirer
409       - OS::TripleO::Services::CeilometerAgentCentral
410       - OS::TripleO::Services::CeilometerAgentNotification
411       - OS::TripleO::Services::Horizon
412       - OS::TripleO::Services::GnocchiApi
413       - OS::TripleO::Services::GnocchiMetricd
414       - OS::TripleO::Services::GnocchiStatsd
415
416     description: A list of service resources (configured in the Heat
417                  resource_registry) which represent nested stacks
418                  for each service that should get installed on the Controllers.
419     type: comma_delimited_list
420
421   ComputeServices:
422     default:
423       - OS::TripleO::Services::CephClient
424       - OS::TripleO::Services::CephExternal
425       - OS::TripleO::Services::Timezone
426       - OS::TripleO::Services::Ntp
427       - OS::TripleO::Services::Snmp
428       - OS::TripleO::Services::NovaCompute
429       - OS::TripleO::Services::NovaLibvirt
430       - OS::TripleO::Services::Kernel
431       - OS::TripleO::Services::ComputeNeutronCorePlugin
432       - OS::TripleO::Services::ComputeNeutronOvsAgent
433       - OS::TripleO::Services::ComputeCeilometerAgent
434     description: A list of service resources (configured in the Heat
435                  resource_registry) which represent nested stacks
436                  for each service that should get installed on the Compute Nodes.
437     type: comma_delimited_list
438
439 # Block storage specific parameters
440   BlockStorageCount:
441     type: number
442     default: 0
443   BlockStorageImage:
444     default: overcloud-full
445     type: string
446   OvercloudBlockStorageFlavor:
447     description: Flavor for block storage nodes to request when deploying.
448     default: baremetal
449     type: string
450     constraints:
451       - custom_constraint: nova.flavor
452   BlockStorageExtraConfig:
453     default: {}
454     description: |
455       BlockStorage specific configuration to inject into the cluster. Same
456       structure as ExtraConfig.
457     type: json
458   BlockStorageSchedulerHints:
459     type: json
460     description: Optional scheduler hints to pass to nova
461     default: {}
462   BlockStorageServices:
463     default:
464       - OS::TripleO::Services::CinderVolume
465       - OS::TripleO::Services::Kernel
466       - OS::TripleO::Services::Ntp
467       - OS::TripleO::Services::Timezone
468       - OS::TripleO::Services::Snmp
469     description: A list of service resources (configured in the Heat
470                  resource_registry) which represent nested stacks
471                  for each service that should get installed on the BlockStorage nodes.
472     type: comma_delimited_list
473
474 # Object storage specific parameters
475   ObjectStorageCount:
476     type: number
477     default: 0
478   OvercloudSwiftStorageFlavor:
479     description: Flavor for Swift storage nodes to request when deploying.
480     default: baremetal
481     type: string
482     constraints:
483       - custom_constraint: nova.flavor
484   SwiftStorageImage:
485     default: overcloud-full
486     type: string
487   ObjectStorageExtraConfig:
488     default: {}
489     description: |
490       ObjectStorage specific configuration to inject into the cluster. Same
491       structure as ExtraConfig.
492     type: json
493   ObjectStorageSchedulerHints:
494     type: json
495     description: Optional scheduler hints to pass to nova
496     default: {}
497   ObjectStorageServices:
498     default:
499       - OS::TripleO::Services::Kernel
500       - OS::TripleO::Services::Ntp
501       - OS::TripleO::Services::SwiftStorage
502       - OS::TripleO::Services::Snmp
503       - OS::TripleO::Services::Timezone
504     description: A list of service resources (configured in the Heat
505                  resource_registry) which represent nested stacks
506                  for each service that should get installed on the ObjectStorage nodes.
507                  Note this role currently only supports steps 2, 3 and 4 configuration.
508     type: comma_delimited_list
509
510
511 # Ceph storage specific parameters
512   CephStorageCount:
513     type: number
514     default: 0
515   CephStorageImage:
516     default: overcloud-full
517     type: string
518   OvercloudCephStorageFlavor:
519     default: baremetal
520     description: Flavor for Ceph storage nodes to request when deploying.
521     type: string
522     constraints:
523       - custom_constraint: nova.flavor
524   CephStorageExtraConfig:
525     default: {}
526     description: |
527       CephStorage specific configuration to inject into the cluster. Same
528       structure as ExtraConfig.
529     type: json
530   CephStorageSchedulerHints:
531     type: json
532     description: Optional scheduler hints to pass to nova
533     default: {}
534   CephStorageServices:
535     default:
536       - OS::TripleO::Services::CephOSD
537       - OS::TripleO::Services::Kernel
538       - OS::TripleO::Services::Ntp
539       - OS::TripleO::Services::Timezone
540     description: A list of service resources (configured in the Heat
541                  resource_registry) which represent nested stacks
542                  for each service that should get installed on the CephStorage nodes.
543     type: comma_delimited_list
544
545   # Hostname format for each role
546   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
547   # and %stackname% is replaced with OS::stack_name in the template below.
548   # If you want to use the heat generated names, pass '' (empty string).
549   ControllerHostnameFormat:
550     type: string
551     description: Format for Controller node hostnames
552     default: '%stackname%-controller-%index%'
553   ComputeHostnameFormat:
554     type: string
555     description: Format for Compute node hostnames
556     default: '%stackname%-novacompute-%index%'
557   BlockStorageHostnameFormat:
558     type: string
559     description: Format for BlockStorage node hostnames
560     default: '%stackname%-blockstorage-%index%'
561   ObjectStorageHostnameFormat:
562     type: string
563     description: Format for SwiftStorage node hostnames
564     default: '%stackname%-objectstorage-%index%'
565   CephStorageHostnameFormat:
566     type: string
567     description: Format for CephStorage node hostnames
568     default: '%stackname%-cephstorage-%index%'
569
570   # Identifiers to trigger tasks on nodes
571   UpdateIdentifier:
572     default: ''
573     type: string
574     description: >
575       Setting to a previously unused value during stack-update will trigger
576       package update on all nodes
577   DeployIdentifier:
578     default: ''
579     type: string
580     description: >
581       Setting this to a unique value will re-run any deployment tasks which
582       perform configuration on a Heat stack-update.
583
584   # If you want to remove a specific node from a resource group, you can pass
585   # the node name or id as a <Group>RemovalPolicies parameter, for example:
586   # ComputeRemovalPolicies: [{'resource_list': ['0']}]
587   ControllerRemovalPolicies:
588     default: []
589     type: json
590     description: >
591       List of resources to be removed from ControllerResourceGroup when
592       doing an update which requires removal of specific resources.
593   ComputeRemovalPolicies:
594     default: []
595     type: json
596     description: >
597       List of resources to be removed from ComputeResourceGroup when
598       doing an update which requires removal of specific resources.
599   BlockStorageRemovalPolicies:
600     default: []
601     type: json
602     description: >
603       List of resources to be removed from BlockStorageResourceGroup when
604       doing an update which requires removal of specific resources.
605   ObjectStorageRemovalPolicies:
606     default: []
607     type: json
608     description: >
609       List of resources to be removed from ObjectStorageResourceGroup when
610       doing an update which requires removal of specific resources.
611   CephStorageRemovalPolicies:
612     default: []
613     type: json
614     description: >
615       List of resources to be removed from CephStorageResourceGroup when
616       doing an update which requires removal of specific resources.
617
618 parameter_groups:
619 - label: deprecated
620   description: Do not use deprecated params, they will be removed.
621   parameters:
622   - controllerExtraConfig
623
624
625 resources:
626
627   HeatAuthEncryptionKey:
628     type: OS::Heat::RandomString
629
630   PcsdPassword:
631     type: OS::Heat::RandomString
632     properties:
633       length: 16
634
635   HorizonSecret:
636     type: OS::Heat::RandomString
637     properties:
638       length: 10
639
640   EndpointMap:
641     type: OS::TripleO::EndpointMap
642     properties:
643       CloudName: {get_param: CloudName}
644       CeilometerApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
645       AodhApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
646       CinderApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
647       GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
648       GlanceRegistryVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
649       GnocchiApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
650       HeatApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
651       IronicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
652       KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
653       KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
654       MysqlVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
655       MysqlNoBracketsVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
656       NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
657       NovaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
658       SaharaApiVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
659       SwiftProxyVirtualIP: {get_attr: [VipMap, net_ip_uri_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
660       PublicVirtualIP: {get_attr: [VipMap, net_ip_uri_map, external]}
661
662   ControllerServiceChain:
663     type: OS::TripleO::Services
664     properties:
665       Services: {get_param: ControllerServices}
666       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
667
668   Controller:
669     type: OS::Heat::ResourceGroup
670     depends_on: Networks
671     properties:
672       count: {get_param: ControllerCount}
673       removal_policies: {get_param: ControllerRemovalPolicies}
674       resource_def:
675         type: OS::TripleO::Controller
676         properties:
677           AdminPassword: {get_param: AdminPassword}
678           AodhPassword: {get_param: AodhPassword}
679           CloudDomain: {get_param: CloudDomain}
680           ControlVirtualInterface: {get_param: ControlVirtualInterface}
681           controllerExtraConfig: {get_param: controllerExtraConfig}
682           CorosyncIPv6: {get_param: CorosyncIPv6}
683           Debug: {get_param: Debug}
684           EnableFencing: {get_param: EnableFencing}
685           ManageFirewall: {get_param: ManageFirewall}
686           PurgeFirewallRules: {get_param: PurgeFirewallRules}
687           EnableGalera: {get_param: EnableGalera}
688           ExtraConfig: {get_param: ExtraConfig}
689           FencingConfig: {get_param: FencingConfig}
690           Flavor: {get_param: OvercloudControlFlavor}
691           HAProxySyslogAddress: {get_param: HAProxySyslogAddress}
692           HeatAuthEncryptionKey: {get_resource: HeatAuthEncryptionKey}
693           HorizonSecret: {get_resource: HorizonSecret}
694           Image: {get_param: controllerImage}
695           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
696           InstanceNameTemplate: {get_param: InstanceNameTemplate}
697           KeyName: {get_param: KeyName}
698           MemcachedIPv6: {get_param: MemcachedIPv6}
699           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
700           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
701           MysqlMaxConnections: {get_param: MysqlMaxConnections}
702           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
703           NeutronPublicInterface: {get_param: NeutronPublicInterface}
704           NeutronPassword: {get_param: NeutronPassword}
705           NovaIPv6: {get_param: NovaIPv6}
706           NovaPassword: {get_param: NovaPassword}
707           PcsdPassword: {get_resource: PcsdPassword}
708           PublicVirtualInterface: {get_param: PublicVirtualInterface}
709           RabbitPassword: {get_param: RabbitPassword}
710           RabbitUserName: {get_param: RabbitUserName}
711           RabbitCookie: {get_attr: [RabbitCookie, value]}
712           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
713           RabbitClientPort: {get_param: RabbitClientPort}
714           RedisPassword: {get_param: RedisPassword}
715           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
716           RedisVirtualIPUri: {get_attr: [RedisVirtualIP, ip_address_uri]}
717           SwiftHashSuffix: {get_param: SwiftHashSuffix}
718           SwiftMinPartHours: {get_param: SwiftMinPartHours}
719           SwiftPartPower: {get_param: SwiftPartPower}
720           SwiftReplicas: { get_param: SwiftReplicas}
721           ServiceNetMap: {get_param: ServiceNetMap}
722           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
723           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
724           UpdateIdentifier: {get_param: UpdateIdentifier}
725           Hostname:
726             str_replace:
727               template: {get_param: ControllerHostnameFormat}
728               params:
729                 '%stackname%': {get_param: 'OS::stack_name'}
730           NodeIndex: '%index%'
731           ServerMetadata: {get_param: ServerMetadata}
732           SchedulerHints: {get_param: ControllerSchedulerHints}
733           ServiceConfigSettings: {get_attr: [ControllerServiceChain, role_data, config_settings]}
734
735   ComputeServiceChain:
736
737     type: OS::TripleO::Services
738     properties:
739       Services: {get_param: ComputeServices}
740       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
741
742   Compute:
743     type: OS::Heat::ResourceGroup
744     depends_on: Networks
745     properties:
746       count: {get_param: ComputeCount}
747       removal_policies: {get_param: ComputeRemovalPolicies}
748       resource_def:
749         type: OS::TripleO::Compute
750         properties:
751           AdminPassword: {get_param: AdminPassword}
752           CinderEnableNfsBackend: {get_param: CinderEnableNfsBackend}
753           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
754           Debug: {get_param: Debug}
755           ExtraConfig: {get_param: ExtraConfig}
756           Flavor: {get_param: OvercloudComputeFlavor}
757           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
758           Image: {get_param: NovaImage}
759           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
760           KeyName: {get_param: KeyName}
761           KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
762           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
763           NeutronPassword: {get_param: NeutronPassword}
764           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
765           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
766           # L3 HA and Failover is not relevant for Computes, should be removed
767           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
768           NovaComputeDriver: {get_param: NovaComputeDriver}
769           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
770           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
771           NovaComputeLibvirtVifDriver: {get_param: NovaComputeLibvirtVifDriver}
772           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
773           NovaIPv6: {get_param: NovaIPv6}
774           NovaPublicIP: {get_attr: [VipMap, net_ip_map, external]}
775           NovaPassword: {get_param: NovaPassword}
776           NovaOVSBridge: {get_param: NovaOVSBridge}
777           NovaSecurityGroupAPI: {get_param: NovaSecurityGroupAPI}
778           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
779           RabbitPassword: {get_param: RabbitPassword}
780           RabbitUserName: {get_param: RabbitUserName}
781           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
782           RabbitClientPort: {get_param: RabbitClientPort}
783           ServiceNetMap: {get_param: ServiceNetMap}
784           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
785           UpdateIdentifier: {get_param: UpdateIdentifier}
786           Hostname:
787             str_replace:
788               template: {get_param: ComputeHostnameFormat}
789               params:
790                 '%stackname%': {get_param: 'OS::stack_name'}
791           CloudDomain: {get_param: CloudDomain}
792           ServerMetadata: {get_param: ServerMetadata}
793           SchedulerHints: {get_param: NovaComputeSchedulerHints}
794           NodeIndex: '%index%'
795           ServiceConfigSettings: {get_attr: [ComputeServiceChain, role_data, config_settings]}
796
797   BlockStorageServiceChain:
798     type: OS::TripleO::Services
799     properties:
800       Services: {get_param: BlockStorageServices}
801       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
802
803   BlockStorage:
804     type: OS::Heat::ResourceGroup
805     depends_on: Networks
806     properties:
807       count: {get_param: BlockStorageCount}
808       removal_policies: {get_param: BlockStorageRemovalPolicies}
809       resource_def:
810         type: OS::TripleO::BlockStorage
811         properties:
812           Image: {get_param: BlockStorageImage}
813           KeyName: {get_param: KeyName}
814           Flavor: {get_param: OvercloudBlockStorageFlavor}
815           UpdateIdentifier: {get_param: UpdateIdentifier}
816           Hostname:
817             str_replace:
818               template: {get_param: BlockStorageHostnameFormat}
819               params:
820                 '%stackname%': {get_param: 'OS::stack_name'}
821           ServiceNetMap: {get_param: ServiceNetMap}
822           ExtraConfig: {get_param: ExtraConfig}
823           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
824           CloudDomain: {get_param: CloudDomain}
825           ServerMetadata: {get_param: ServerMetadata}
826           SchedulerHints: {get_param: BlockStorageSchedulerHints}
827           NodeIndex: '%index%'
828           ServiceConfigSettings: {get_attr: [BlockStorageServiceChain, role_data, config_settings]}
829
830   ObjectStorageServiceChain:
831     type: OS::TripleO::Services
832     properties:
833       Services: {get_param: ObjectStorageServices}
834       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
835
836   ObjectStorage:
837     type: OS::Heat::ResourceGroup
838     depends_on: Networks
839     properties:
840       count: {get_param: ObjectStorageCount}
841       removal_policies: {get_param: ObjectStorageRemovalPolicies}
842       resource_def:
843         type: OS::TripleO::ObjectStorage
844         properties:
845           KeyName: {get_param: KeyName}
846           Flavor: {get_param: OvercloudSwiftStorageFlavor}
847           HashSuffix: {get_param: SwiftHashSuffix}
848           MinPartHours: {get_param: SwiftMinPartHours}
849           PartPower: {get_param: SwiftPartPower}
850           Image: {get_param: SwiftStorageImage}
851           Replicas: { get_param: SwiftReplicas}
852           UpdateIdentifier: {get_param: UpdateIdentifier}
853           ServiceNetMap: {get_param: ServiceNetMap}
854           Hostname:
855             str_replace:
856               template: {get_param: ObjectStorageHostnameFormat}
857               params:
858                 '%stackname%': {get_param: 'OS::stack_name'}
859           ExtraConfig: {get_param: ExtraConfig}
860           ObjectStorageExtraConfig: {get_param: ObjectStorageExtraConfig}
861           CloudDomain: {get_param: CloudDomain}
862           ServerMetadata: {get_param: ServerMetadata}
863           SchedulerHints: {get_param: ObjectStorageSchedulerHints}
864           NodeIndex: '%index%'
865           ServiceConfigSettings: {get_attr: [ObjectStorageServiceChain, role_data, config_settings]}
866
867   CephStorageServiceChain:
868     type: OS::TripleO::Services
869     properties:
870       Services: {get_param: CephStorageServices}
871       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
872
873   CephStorage:
874     type: OS::Heat::ResourceGroup
875     depends_on: Networks
876     properties:
877       count: {get_param: CephStorageCount}
878       removal_policies: {get_param: CephStorageRemovalPolicies}
879       resource_def:
880         type: OS::TripleO::CephStorage
881         properties:
882           Image: {get_param: CephStorageImage}
883           KeyName: {get_param: KeyName}
884           Flavor: {get_param: OvercloudCephStorageFlavor}
885           ServiceNetMap: {get_param: ServiceNetMap}
886           UpdateIdentifier: {get_param: UpdateIdentifier}
887           Hostname:
888             str_replace:
889               template: {get_param: CephStorageHostnameFormat}
890               params:
891                 '%stackname%': {get_param: 'OS::stack_name'}
892           ExtraConfig: {get_param: ExtraConfig}
893           CephStorageExtraConfig: {get_param: CephStorageExtraConfig}
894           CloudDomain: {get_param: CloudDomain}
895           ServerMetadata: {get_param: ServerMetadata}
896           SchedulerHints: {get_param: CephStorageSchedulerHints}
897           NodeIndex: '%index%'
898           ServiceConfigSettings: {get_attr: [CephStorageServiceChain, role_data, config_settings]}
899
900   ControllerIpListMap:
901     type: OS::TripleO::Network::Ports::NetIpListMap
902     properties:
903       ControlPlaneIpList: {get_attr: [Controller, ip_address]}
904       ExternalIpList: {get_attr: [Controller, external_ip_address]}
905       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
906       StorageIpList: {get_attr: [Controller, storage_ip_address]}
907       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
908       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
909       ManagementIpList: {get_attr: [Controller, management_ip_address]}
910
911   allNodesConfig:
912     type: OS::TripleO::AllNodes::SoftwareConfig
913     properties:
914       compute_hosts: {get_attr: [Compute, hosts_entry]}
915       controller_hosts: {get_attr: [Controller, hosts_entry]}
916       controller_ips: {get_attr: [Controller, ip_address]}
917       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
918       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
919       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
920       controller_names: {get_attr: [Controller, hostname]}
921       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
922       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
923       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
924       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
925       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
926       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
927       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
928       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
929       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
930       aodh_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
931       gnocchi_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
932       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
933       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
934       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
935       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
936       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
937       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
938       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
939       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
940       sahara_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
941       ironic_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
942       ceph_mon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
943       ceph_mon_node_names: {get_attr: [Controller, hostname]}
944       DeployIdentifier: {get_param: DeployIdentifier}
945       UpdateIdentifier: {get_param: UpdateIdentifier}
946
947   MysqlRootPassword:
948     type: OS::Heat::RandomString
949     properties:
950       length: 10
951
952   MysqlClusterUniquePart:
953     type: OS::Heat::RandomString
954     properties:
955       length: 10
956
957   RabbitCookie:
958     type: OS::Heat::RandomString
959     properties:
960       length: 20
961       salt: {get_param: RabbitCookieSalt}
962
963   # creates the network architecture
964   Networks:
965     type: OS::TripleO::Network
966
967   ControlVirtualIP:
968     type: OS::Neutron::Port
969     depends_on: Networks
970     properties:
971       name: control_virtual_ip
972       network: {get_param: NeutronControlPlaneID}
973       fixed_ips: {get_param: ControlFixedIPs}
974       replacement_policy: AUTO
975
976   RedisVirtualIP:
977     depends_on: Networks
978     type: OS::TripleO::Network::Ports::RedisVipPort
979     properties:
980       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
981       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
982       PortName: redis_virtual_ip
983       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
984       ServiceName: redis
985
986   # The public VIP is on the External net, falls back to ctlplane
987   PublicVirtualIP:
988     depends_on: Networks
989     type: OS::TripleO::Network::Ports::ExternalVipPort
990     properties:
991       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
992       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
993       PortName: public_virtual_ip
994       FixedIPs: {get_param: PublicVirtualFixedIPs}
995
996   InternalApiVirtualIP:
997     depends_on: Networks
998     type: OS::TripleO::Network::Ports::InternalApiVipPort
999     properties:
1000       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1001       PortName: internal_api_virtual_ip
1002       FixedIPs: {get_param: InternalApiVirtualFixedIPs}
1003
1004   StorageVirtualIP:
1005     depends_on: Networks
1006     type: OS::TripleO::Network::Ports::StorageVipPort
1007     properties:
1008       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1009       PortName: storage_virtual_ip
1010       FixedIPs: {get_param: StorageVirtualFixedIPs}
1011
1012   StorageMgmtVirtualIP:
1013     depends_on: Networks
1014     type: OS::TripleO::Network::Ports::StorageMgmtVipPort
1015     properties:
1016       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1017       PortName: storage_management_virtual_ip
1018       FixedIPs: {get_param: StorageMgmtVirtualFixedIPs}
1019
1020   VipMap:
1021     type: OS::TripleO::Network::Ports::NetVipMap
1022     properties:
1023       ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1024       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
1025       ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
1026       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
1027       InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
1028       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1029       StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
1030       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1031       StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
1032       # No tenant or management VIP required
1033
1034   VipConfig:
1035     type: OS::TripleO::VipConfig
1036
1037   VipDeployment:
1038     type: OS::Heat::StructuredDeployments
1039     properties:
1040       name: VipDeployment
1041       config: {get_resource: VipConfig}
1042       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1043       input_values:
1044         # service VIP mappings
1045         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1046         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1047         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1048         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1049         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1050         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1051         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1052         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1053         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1054         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1055         aodh_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
1056         gnocchi_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
1057         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1058         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1059         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1060         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1061         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1062         # direct configuration of Virtual IPs for each network
1063         control_virtual_ip: {get_attr: [VipMap, net_ip_map, ctlplane]}
1064         public_virtual_ip: {get_attr: [VipMap, net_ip_map, external]}
1065         internal_api_virtual_ip: {get_attr: [VipMap, net_ip_map, internal_api]}
1066         sahara_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
1067         ironic_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
1068         storage_virtual_ip: {get_attr: [VipMap, net_ip_map, storage]}
1069         storage_mgmt_virtual_ip: {get_attr: [VipMap, net_ip_map, storage_mgmt]}
1070
1071   ControllerSwiftDeployment:
1072     type: OS::Heat::StructuredDeployments
1073     properties:
1074       name: ControllerSwiftDeployment
1075       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1076       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1077
1078   ObjectStorageSwiftDeployment:
1079     type: OS::Heat::StructuredDeployments
1080     properties:
1081       name: ObjectStorageSwiftDeployment
1082       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1083       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1084
1085   SwiftDevicesAndProxyConfig:
1086     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1087     properties:
1088       controller_swift_devices: {get_attr: [Controller, swift_device]}
1089       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1090       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1091
1092   ComputeCephDeployment:
1093     type: OS::Heat::StructuredDeployments
1094     properties:
1095       name: ComputeCephDeployment
1096       config: {get_attr: [CephClusterConfig, config_id]}
1097       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1098
1099   ControllerCephDeployment:
1100     type: OS::Heat::StructuredDeployments
1101     properties:
1102       name: ControllerCephDeployment
1103       config: {get_attr: [CephClusterConfig, config_id]}
1104       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1105
1106   CephStorageCephDeployment:
1107     type: OS::Heat::StructuredDeployments
1108     properties:
1109       name: CephStorageCephDeployment
1110       config: {get_attr: [CephClusterConfig, config_id]}
1111       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1112
1113   CephClusterConfig:
1114     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1115
1116   ControllerAllNodesDeployment:
1117     type: OS::Heat::StructuredDeployments
1118     properties:
1119       name: ControllerAllNodesDeployment
1120       config: {get_attr: [allNodesConfig, config_id]}
1121       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1122       input_values:
1123         bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1124         bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1125
1126   ComputeAllNodesDeployment:
1127     type: OS::Heat::StructuredDeployments
1128     properties:
1129       name: ComputeAllNodesDeployment
1130       config: {get_attr: [allNodesConfig, config_id]}
1131       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1132       input_values:
1133         bootstrap_nodeid: {get_attr: [Compute, resource.0.hostname]}
1134         bootstrap_nodeid_ip: {get_attr: [Compute, resource.0.ip_address]}
1135
1136   BlockStorageAllNodesDeployment:
1137     type: OS::Heat::StructuredDeployments
1138     properties:
1139       name: BlockStorageAllNodesDeployment
1140       config: {get_attr: [allNodesConfig, config_id]}
1141       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1142       input_values:
1143         bootstrap_nodeid: {get_attr: [BlockStorage, resource.0.hostname]}
1144         bootstrap_nodeid_ip: {get_attr: [BlockStorage, resource.0.ip_address]}
1145
1146   ObjectStorageAllNodesDeployment:
1147     type: OS::Heat::StructuredDeployments
1148     properties:
1149       name: ObjectStorageAllNodesDeployment
1150       config: {get_attr: [allNodesConfig, config_id]}
1151       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1152       input_values:
1153         bootstrap_nodeid: {get_attr: [ObjectStorage, resource.0.hostname]}
1154         bootstrap_nodeid_ip: {get_attr: [ObjectStorage, resource.0.ip_address]}
1155
1156   CephStorageAllNodesDeployment:
1157     type: OS::Heat::StructuredDeployments
1158     properties:
1159       name: CephStorageAllNodesDeployment
1160       config: {get_attr: [allNodesConfig, config_id]}
1161       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1162       input_values:
1163         bootstrap_nodeid: {get_attr: [CephStorage, resource.0.hostname]}
1164         bootstrap_nodeid_ip: {get_attr: [CephStorage, resource.0.ip_address]}
1165
1166   # All Nodes Validations
1167   AllNodesValidationConfig:
1168     type: OS::TripleO::AllNodes::Validation
1169     properties:
1170       PingTestIps:
1171         list_join:
1172         - ' '
1173         - - {get_attr: [Controller, resource.0.external_ip_address]}
1174           - {get_attr: [Controller, resource.0.internal_api_ip_address]}
1175           - {get_attr: [Controller, resource.0.storage_ip_address]}
1176           - {get_attr: [Controller, resource.0.storage_mgmt_ip_address]}
1177           - {get_attr: [Controller, resource.0.tenant_ip_address]}
1178
1179   ControllerAllNodesValidationDeployment:
1180     type: OS::Heat::StructuredDeployments
1181     depends_on: ControllerAllNodesDeployment
1182     properties:
1183       name: ControllerAllNodesValidationDeployment
1184       config: {get_resource: AllNodesValidationConfig}
1185       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1186
1187   ComputeAllNodesValidationDeployment:
1188     type: OS::Heat::StructuredDeployments
1189     depends_on: ComputeAllNodesDeployment
1190     properties:
1191       name: ComputeAllNodesValidationDeployment
1192       config: {get_resource: AllNodesValidationConfig}
1193       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1194
1195   BlockStorageAllNodesValidationDeployment:
1196     type: OS::Heat::StructuredDeployments
1197     depends_on: BlockStorageAllNodesDeployment
1198     properties:
1199       name: BlockStorageAllNodesValidationDeployment
1200       config: {get_resource: AllNodesValidationConfig}
1201       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1202
1203   ObjectStorageAllNodesValidationDeployment:
1204     type: OS::Heat::StructuredDeployments
1205     depends_on: ObjectStorageAllNodesDeployment
1206     properties:
1207       name: ObjectStorageAllNodesValidationDeployment
1208       config: {get_resource: AllNodesValidationConfig}
1209       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1210
1211   CephStorageAllNodesValidationDeployment:
1212     type: OS::Heat::StructuredDeployments
1213     depends_on: CephStorageAllNodesDeployment
1214     properties:
1215       name: CephStorageAllNodesValidationDeployment
1216       config: {get_resource: AllNodesValidationConfig}
1217       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1218
1219   UpdateWorkflow:
1220     type: OS::TripleO::Tasks::UpdateWorkflow
1221     properties:
1222       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
1223       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
1224       blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1225       objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1226       cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1227       input_values:
1228         deploy_identifier: {get_param: DeployIdentifier}
1229         update_identifier: {get_param: UpdateIdentifier}
1230
1231   # Optional ExtraConfig for all nodes - all roles are passed in here, but
1232   # the nested template may configure each role differently (or not at all)
1233   AllNodesExtraConfig:
1234     type: OS::TripleO::AllNodesExtraConfig
1235     depends_on:
1236       - UpdateWorkflow
1237       - ComputeAllNodesValidationDeployment
1238       - BlockStorageAllNodesValidationDeployment
1239       - ObjectStorageAllNodesValidationDeployment
1240       - CephStorageAllNodesValidationDeployment
1241       - ControllerAllNodesValidationDeployment
1242     properties:
1243       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
1244       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
1245       blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1246       objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1247       cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1248
1249   # Nested stack deployment runs after all other controller deployments
1250   ControllerNodesPostDeployment:
1251     type: OS::TripleO::ControllerPostDeployment
1252     depends_on: [ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1253     properties:
1254       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1255       RoleData: {get_attr: [ControllerServiceChain, role_data]}
1256
1257   ComputeNodesPostDeployment:
1258     type: OS::TripleO::ComputePostDeployment
1259     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1260     properties:
1261       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1262       RoleData: {get_attr: [ComputeServiceChain, role_data]}
1263
1264   ObjectStorageNodesPostDeployment:
1265     type: OS::TripleO::ObjectStoragePostDeployment
1266     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1267     properties:
1268       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1269       RoleData: {get_attr: [ObjectStorageServiceChain, role_data]}
1270
1271   BlockStorageNodesPostDeployment:
1272     type: OS::TripleO::BlockStoragePostDeployment
1273     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1274     properties:
1275       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1276       RoleData: {get_attr: [BlockStorageServiceChain, role_data]}
1277
1278   CephStorageNodesPostDeployment:
1279     type: OS::TripleO::CephStoragePostDeployment
1280     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1281     properties:
1282       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1283       RoleData: {get_attr: [CephStorageServiceChain, role_data]}
1284
1285 outputs:
1286   KeystoneURL:
1287     description: URL for the Overcloud Keystone service
1288     value: {get_attr: [EndpointMap, endpoint_map, KeystonePublic, uri]}
1289   KeystoneAdminVip:
1290     description: Keystone Admin VIP endpoint
1291     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1292   PublicVip:
1293     description: Controller VIP for public API endpoints
1294     value: {get_attr: [VipMap, net_ip_map, external]}
1295   AodhInternalVip:
1296     description: VIP for Aodh API internal endpoint
1297     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
1298   CeilometerInternalVip:
1299     description: VIP for Ceilometer API internal endpoint
1300     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1301   CinderInternalVip:
1302     description: VIP for Cinder API internal endpoint
1303     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1304   GlanceInternalVip:
1305     description: VIP for Glance API internal endpoint
1306     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1307   GnocchiInternalVip:
1308     description: VIP for Gnocchi API internal endpoint
1309     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
1310   HeatInternalVip:
1311     description: VIP for Heat API internal endpoint
1312     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1313   IronicInternalVip:
1314     description: VIP for Ironic API internal endpoint
1315     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
1316   KeystoneInternalVip:
1317     description: VIP for Keystone API internal endpoint
1318     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1319   NeutronInternalVip:
1320     description: VIP for Neutron API internal endpoint
1321     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1322   NovaInternalVip:
1323     description: VIP for Nova API internal endpoint
1324     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1325   SaharaInternalVip:
1326     description: VIP for Sahara API internal endpoint
1327     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
1328   SwiftInternalVip:
1329     description: VIP for Swift Proxy internal endpoint
1330     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1331   EndpointMap:
1332     description: |
1333       Mapping of the resources with the needed info for their endpoints.
1334       This includes the protocol used, the IP, port and also a full
1335       representation of the URI.
1336     value: {get_attr: [EndpointMap, endpoint_map]}
1337   HostsEntry:
1338     description: |
1339       The content that should be appended to your /etc/hosts if you want to get
1340       hostname-based access to the deployed nodes (useful for testing without
1341       setting up a DNS).
1342     value: {get_attr: [allNodesConfig, hosts_entries]}