Add 'service_name' to composable services
[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           ServiceNames: {get_attr: [ControllerServiceChain, role_data, service_names]}
735
736   ComputeServiceChain:
737
738     type: OS::TripleO::Services
739     properties:
740       Services: {get_param: ComputeServices}
741       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
742
743   Compute:
744     type: OS::Heat::ResourceGroup
745     depends_on: Networks
746     properties:
747       count: {get_param: ComputeCount}
748       removal_policies: {get_param: ComputeRemovalPolicies}
749       resource_def:
750         type: OS::TripleO::Compute
751         properties:
752           AdminPassword: {get_param: AdminPassword}
753           CinderEnableNfsBackend: {get_param: CinderEnableNfsBackend}
754           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
755           Debug: {get_param: Debug}
756           ExtraConfig: {get_param: ExtraConfig}
757           Flavor: {get_param: OvercloudComputeFlavor}
758           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
759           Image: {get_param: NovaImage}
760           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
761           KeyName: {get_param: KeyName}
762           KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
763           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
764           NeutronPassword: {get_param: NeutronPassword}
765           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
766           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
767           # L3 HA and Failover is not relevant for Computes, should be removed
768           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
769           NovaComputeDriver: {get_param: NovaComputeDriver}
770           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
771           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
772           NovaComputeLibvirtVifDriver: {get_param: NovaComputeLibvirtVifDriver}
773           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
774           NovaIPv6: {get_param: NovaIPv6}
775           NovaPublicIP: {get_attr: [VipMap, net_ip_map, external]}
776           NovaPassword: {get_param: NovaPassword}
777           NovaOVSBridge: {get_param: NovaOVSBridge}
778           NovaSecurityGroupAPI: {get_param: NovaSecurityGroupAPI}
779           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
780           RabbitPassword: {get_param: RabbitPassword}
781           RabbitUserName: {get_param: RabbitUserName}
782           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
783           RabbitClientPort: {get_param: RabbitClientPort}
784           ServiceNetMap: {get_param: ServiceNetMap}
785           EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
786           UpdateIdentifier: {get_param: UpdateIdentifier}
787           Hostname:
788             str_replace:
789               template: {get_param: ComputeHostnameFormat}
790               params:
791                 '%stackname%': {get_param: 'OS::stack_name'}
792           CloudDomain: {get_param: CloudDomain}
793           ServerMetadata: {get_param: ServerMetadata}
794           SchedulerHints: {get_param: NovaComputeSchedulerHints}
795           NodeIndex: '%index%'
796           ServiceConfigSettings: {get_attr: [ComputeServiceChain, role_data, config_settings]}
797           ServiceNames: {get_attr: [ComputeServiceChain, role_data, service_names]}
798
799   BlockStorageServiceChain:
800     type: OS::TripleO::Services
801     properties:
802       Services: {get_param: BlockStorageServices}
803       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
804
805   BlockStorage:
806     type: OS::Heat::ResourceGroup
807     depends_on: Networks
808     properties:
809       count: {get_param: BlockStorageCount}
810       removal_policies: {get_param: BlockStorageRemovalPolicies}
811       resource_def:
812         type: OS::TripleO::BlockStorage
813         properties:
814           Image: {get_param: BlockStorageImage}
815           KeyName: {get_param: KeyName}
816           Flavor: {get_param: OvercloudBlockStorageFlavor}
817           UpdateIdentifier: {get_param: UpdateIdentifier}
818           Hostname:
819             str_replace:
820               template: {get_param: BlockStorageHostnameFormat}
821               params:
822                 '%stackname%': {get_param: 'OS::stack_name'}
823           ServiceNetMap: {get_param: ServiceNetMap}
824           ExtraConfig: {get_param: ExtraConfig}
825           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
826           CloudDomain: {get_param: CloudDomain}
827           ServerMetadata: {get_param: ServerMetadata}
828           SchedulerHints: {get_param: BlockStorageSchedulerHints}
829           NodeIndex: '%index%'
830           ServiceConfigSettings: {get_attr: [BlockStorageServiceChain, role_data, config_settings]}
831           ServiceNames: {get_attr: [BlockStorageServiceChain, role_data, service_names]}
832
833   ObjectStorageServiceChain:
834     type: OS::TripleO::Services
835     properties:
836       Services: {get_param: ObjectStorageServices}
837       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
838
839   ObjectStorage:
840     type: OS::Heat::ResourceGroup
841     depends_on: Networks
842     properties:
843       count: {get_param: ObjectStorageCount}
844       removal_policies: {get_param: ObjectStorageRemovalPolicies}
845       resource_def:
846         type: OS::TripleO::ObjectStorage
847         properties:
848           KeyName: {get_param: KeyName}
849           Flavor: {get_param: OvercloudSwiftStorageFlavor}
850           HashSuffix: {get_param: SwiftHashSuffix}
851           MinPartHours: {get_param: SwiftMinPartHours}
852           PartPower: {get_param: SwiftPartPower}
853           Image: {get_param: SwiftStorageImage}
854           Replicas: { get_param: SwiftReplicas}
855           UpdateIdentifier: {get_param: UpdateIdentifier}
856           ServiceNetMap: {get_param: ServiceNetMap}
857           Hostname:
858             str_replace:
859               template: {get_param: ObjectStorageHostnameFormat}
860               params:
861                 '%stackname%': {get_param: 'OS::stack_name'}
862           ExtraConfig: {get_param: ExtraConfig}
863           ObjectStorageExtraConfig: {get_param: ObjectStorageExtraConfig}
864           CloudDomain: {get_param: CloudDomain}
865           ServerMetadata: {get_param: ServerMetadata}
866           SchedulerHints: {get_param: ObjectStorageSchedulerHints}
867           NodeIndex: '%index%'
868           ServiceConfigSettings: {get_attr: [ObjectStorageServiceChain, role_data, config_settings]}
869           ServiceNames: {get_attr: [ObjectStorageServiceChain, role_data, service_names]}
870
871   CephStorageServiceChain:
872     type: OS::TripleO::Services
873     properties:
874       Services: {get_param: CephStorageServices}
875       EndpointMap: {get_attr: [EndpointMap, endpoint_map]}
876
877   CephStorage:
878     type: OS::Heat::ResourceGroup
879     depends_on: Networks
880     properties:
881       count: {get_param: CephStorageCount}
882       removal_policies: {get_param: CephStorageRemovalPolicies}
883       resource_def:
884         type: OS::TripleO::CephStorage
885         properties:
886           Image: {get_param: CephStorageImage}
887           KeyName: {get_param: KeyName}
888           Flavor: {get_param: OvercloudCephStorageFlavor}
889           ServiceNetMap: {get_param: ServiceNetMap}
890           UpdateIdentifier: {get_param: UpdateIdentifier}
891           Hostname:
892             str_replace:
893               template: {get_param: CephStorageHostnameFormat}
894               params:
895                 '%stackname%': {get_param: 'OS::stack_name'}
896           ExtraConfig: {get_param: ExtraConfig}
897           CephStorageExtraConfig: {get_param: CephStorageExtraConfig}
898           CloudDomain: {get_param: CloudDomain}
899           ServerMetadata: {get_param: ServerMetadata}
900           SchedulerHints: {get_param: CephStorageSchedulerHints}
901           NodeIndex: '%index%'
902           ServiceConfigSettings: {get_attr: [CephStorageServiceChain, role_data, config_settings]}
903           ServiceNames: {get_attr: [CephStorageServiceChain, role_data, service_names]}
904
905   ControllerIpListMap:
906     type: OS::TripleO::Network::Ports::NetIpListMap
907     properties:
908       ControlPlaneIpList: {get_attr: [Controller, ip_address]}
909       ExternalIpList: {get_attr: [Controller, external_ip_address]}
910       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
911       StorageIpList: {get_attr: [Controller, storage_ip_address]}
912       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
913       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
914       ManagementIpList: {get_attr: [Controller, management_ip_address]}
915
916   allNodesConfig:
917     type: OS::TripleO::AllNodes::SoftwareConfig
918     properties:
919       compute_hosts: {get_attr: [Compute, hosts_entry]}
920       controller_hosts: {get_attr: [Controller, hosts_entry]}
921       controller_ips: {get_attr: [Controller, ip_address]}
922       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
923       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
924       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
925       controller_names: {get_attr: [Controller, hostname]}
926       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
927       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
928       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
929       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
930       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
931       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
932       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
933       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
934       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
935       aodh_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
936       gnocchi_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
937       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
938       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
939       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
940       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
941       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
942       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
943       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
944       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
945       sahara_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
946       ironic_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
947       ceph_mon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
948       ceph_mon_node_names: {get_attr: [Controller, hostname]}
949       DeployIdentifier: {get_param: DeployIdentifier}
950       UpdateIdentifier: {get_param: UpdateIdentifier}
951
952   MysqlRootPassword:
953     type: OS::Heat::RandomString
954     properties:
955       length: 10
956
957   MysqlClusterUniquePart:
958     type: OS::Heat::RandomString
959     properties:
960       length: 10
961
962   RabbitCookie:
963     type: OS::Heat::RandomString
964     properties:
965       length: 20
966       salt: {get_param: RabbitCookieSalt}
967
968   # creates the network architecture
969   Networks:
970     type: OS::TripleO::Network
971
972   ControlVirtualIP:
973     type: OS::Neutron::Port
974     depends_on: Networks
975     properties:
976       name: control_virtual_ip
977       network: {get_param: NeutronControlPlaneID}
978       fixed_ips: {get_param: ControlFixedIPs}
979       replacement_policy: AUTO
980
981   RedisVirtualIP:
982     depends_on: Networks
983     type: OS::TripleO::Network::Ports::RedisVipPort
984     properties:
985       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
986       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
987       PortName: redis_virtual_ip
988       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
989       ServiceName: redis
990
991   # The public VIP is on the External net, falls back to ctlplane
992   PublicVirtualIP:
993     depends_on: Networks
994     type: OS::TripleO::Network::Ports::ExternalVipPort
995     properties:
996       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
997       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
998       PortName: public_virtual_ip
999       FixedIPs: {get_param: PublicVirtualFixedIPs}
1000
1001   InternalApiVirtualIP:
1002     depends_on: Networks
1003     type: OS::TripleO::Network::Ports::InternalApiVipPort
1004     properties:
1005       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1006       PortName: internal_api_virtual_ip
1007       FixedIPs: {get_param: InternalApiVirtualFixedIPs}
1008
1009   StorageVirtualIP:
1010     depends_on: Networks
1011     type: OS::TripleO::Network::Ports::StorageVipPort
1012     properties:
1013       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1014       PortName: storage_virtual_ip
1015       FixedIPs: {get_param: StorageVirtualFixedIPs}
1016
1017   StorageMgmtVirtualIP:
1018     depends_on: Networks
1019     type: OS::TripleO::Network::Ports::StorageMgmtVipPort
1020     properties:
1021       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1022       PortName: storage_management_virtual_ip
1023       FixedIPs: {get_param: StorageMgmtVirtualFixedIPs}
1024
1025   VipMap:
1026     type: OS::TripleO::Network::Ports::NetVipMap
1027     properties:
1028       ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1029       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
1030       ExternalIpUri: {get_attr: [PublicVirtualIP, ip_address_uri]}
1031       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
1032       InternalApiIpUri: {get_attr: [InternalApiVirtualIP, ip_address_uri]}
1033       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1034       StorageIpUri: {get_attr: [StorageVirtualIP, ip_address_uri]}
1035       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1036       StorageMgmtIpUri: {get_attr: [StorageMgmtVirtualIP, ip_address_uri]}
1037       # No tenant or management VIP required
1038
1039   VipConfig:
1040     type: OS::TripleO::VipConfig
1041
1042   VipDeployment:
1043     type: OS::Heat::StructuredDeployments
1044     properties:
1045       name: VipDeployment
1046       config: {get_resource: VipConfig}
1047       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1048       input_values:
1049         # service VIP mappings
1050         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1051         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1052         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1053         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1054         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1055         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1056         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1057         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1058         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1059         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1060         aodh_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
1061         gnocchi_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
1062         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1063         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1064         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1065         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1066         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1067         # direct configuration of Virtual IPs for each network
1068         control_virtual_ip: {get_attr: [VipMap, net_ip_map, ctlplane]}
1069         public_virtual_ip: {get_attr: [VipMap, net_ip_map, external]}
1070         internal_api_virtual_ip: {get_attr: [VipMap, net_ip_map, internal_api]}
1071         sahara_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
1072         ironic_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
1073         storage_virtual_ip: {get_attr: [VipMap, net_ip_map, storage]}
1074         storage_mgmt_virtual_ip: {get_attr: [VipMap, net_ip_map, storage_mgmt]}
1075
1076   ControllerSwiftDeployment:
1077     type: OS::Heat::StructuredDeployments
1078     properties:
1079       name: ControllerSwiftDeployment
1080       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1081       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1082
1083   ObjectStorageSwiftDeployment:
1084     type: OS::Heat::StructuredDeployments
1085     properties:
1086       name: ObjectStorageSwiftDeployment
1087       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1088       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1089
1090   SwiftDevicesAndProxyConfig:
1091     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1092     properties:
1093       controller_swift_devices: {get_attr: [Controller, swift_device]}
1094       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1095       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1096
1097   ComputeCephDeployment:
1098     type: OS::Heat::StructuredDeployments
1099     properties:
1100       name: ComputeCephDeployment
1101       config: {get_attr: [CephClusterConfig, config_id]}
1102       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1103
1104   ControllerCephDeployment:
1105     type: OS::Heat::StructuredDeployments
1106     properties:
1107       name: ControllerCephDeployment
1108       config: {get_attr: [CephClusterConfig, config_id]}
1109       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1110
1111   CephStorageCephDeployment:
1112     type: OS::Heat::StructuredDeployments
1113     properties:
1114       name: CephStorageCephDeployment
1115       config: {get_attr: [CephClusterConfig, config_id]}
1116       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1117
1118   CephClusterConfig:
1119     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1120
1121   ControllerAllNodesDeployment:
1122     type: OS::Heat::StructuredDeployments
1123     properties:
1124       name: ControllerAllNodesDeployment
1125       config: {get_attr: [allNodesConfig, config_id]}
1126       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1127       input_values:
1128         bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1129         bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1130
1131   ComputeAllNodesDeployment:
1132     type: OS::Heat::StructuredDeployments
1133     properties:
1134       name: ComputeAllNodesDeployment
1135       config: {get_attr: [allNodesConfig, config_id]}
1136       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1137       input_values:
1138         bootstrap_nodeid: {get_attr: [Compute, resource.0.hostname]}
1139         bootstrap_nodeid_ip: {get_attr: [Compute, resource.0.ip_address]}
1140
1141   BlockStorageAllNodesDeployment:
1142     type: OS::Heat::StructuredDeployments
1143     properties:
1144       name: BlockStorageAllNodesDeployment
1145       config: {get_attr: [allNodesConfig, config_id]}
1146       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1147       input_values:
1148         bootstrap_nodeid: {get_attr: [BlockStorage, resource.0.hostname]}
1149         bootstrap_nodeid_ip: {get_attr: [BlockStorage, resource.0.ip_address]}
1150
1151   ObjectStorageAllNodesDeployment:
1152     type: OS::Heat::StructuredDeployments
1153     properties:
1154       name: ObjectStorageAllNodesDeployment
1155       config: {get_attr: [allNodesConfig, config_id]}
1156       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1157       input_values:
1158         bootstrap_nodeid: {get_attr: [ObjectStorage, resource.0.hostname]}
1159         bootstrap_nodeid_ip: {get_attr: [ObjectStorage, resource.0.ip_address]}
1160
1161   CephStorageAllNodesDeployment:
1162     type: OS::Heat::StructuredDeployments
1163     properties:
1164       name: CephStorageAllNodesDeployment
1165       config: {get_attr: [allNodesConfig, config_id]}
1166       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1167       input_values:
1168         bootstrap_nodeid: {get_attr: [CephStorage, resource.0.hostname]}
1169         bootstrap_nodeid_ip: {get_attr: [CephStorage, resource.0.ip_address]}
1170
1171   # All Nodes Validations
1172   AllNodesValidationConfig:
1173     type: OS::TripleO::AllNodes::Validation
1174     properties:
1175       PingTestIps:
1176         list_join:
1177         - ' '
1178         - - {get_attr: [Controller, resource.0.external_ip_address]}
1179           - {get_attr: [Controller, resource.0.internal_api_ip_address]}
1180           - {get_attr: [Controller, resource.0.storage_ip_address]}
1181           - {get_attr: [Controller, resource.0.storage_mgmt_ip_address]}
1182           - {get_attr: [Controller, resource.0.tenant_ip_address]}
1183
1184   ControllerAllNodesValidationDeployment:
1185     type: OS::Heat::StructuredDeployments
1186     depends_on: ControllerAllNodesDeployment
1187     properties:
1188       name: ControllerAllNodesValidationDeployment
1189       config: {get_resource: AllNodesValidationConfig}
1190       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1191
1192   ComputeAllNodesValidationDeployment:
1193     type: OS::Heat::StructuredDeployments
1194     depends_on: ComputeAllNodesDeployment
1195     properties:
1196       name: ComputeAllNodesValidationDeployment
1197       config: {get_resource: AllNodesValidationConfig}
1198       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1199
1200   BlockStorageAllNodesValidationDeployment:
1201     type: OS::Heat::StructuredDeployments
1202     depends_on: BlockStorageAllNodesDeployment
1203     properties:
1204       name: BlockStorageAllNodesValidationDeployment
1205       config: {get_resource: AllNodesValidationConfig}
1206       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1207
1208   ObjectStorageAllNodesValidationDeployment:
1209     type: OS::Heat::StructuredDeployments
1210     depends_on: ObjectStorageAllNodesDeployment
1211     properties:
1212       name: ObjectStorageAllNodesValidationDeployment
1213       config: {get_resource: AllNodesValidationConfig}
1214       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1215
1216   CephStorageAllNodesValidationDeployment:
1217     type: OS::Heat::StructuredDeployments
1218     depends_on: CephStorageAllNodesDeployment
1219     properties:
1220       name: CephStorageAllNodesValidationDeployment
1221       config: {get_resource: AllNodesValidationConfig}
1222       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1223
1224   UpdateWorkflow:
1225     type: OS::TripleO::Tasks::UpdateWorkflow
1226     properties:
1227       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
1228       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
1229       blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1230       objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1231       cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1232       input_values:
1233         deploy_identifier: {get_param: DeployIdentifier}
1234         update_identifier: {get_param: UpdateIdentifier}
1235
1236   # Optional ExtraConfig for all nodes - all roles are passed in here, but
1237   # the nested template may configure each role differently (or not at all)
1238   AllNodesExtraConfig:
1239     type: OS::TripleO::AllNodesExtraConfig
1240     depends_on:
1241       - UpdateWorkflow
1242       - ComputeAllNodesValidationDeployment
1243       - BlockStorageAllNodesValidationDeployment
1244       - ObjectStorageAllNodesValidationDeployment
1245       - CephStorageAllNodesValidationDeployment
1246       - ControllerAllNodesValidationDeployment
1247     properties:
1248       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
1249       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
1250       blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1251       objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1252       cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1253
1254   # Nested stack deployment runs after all other controller deployments
1255   ControllerNodesPostDeployment:
1256     type: OS::TripleO::ControllerPostDeployment
1257     depends_on: [ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1258     properties:
1259       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1260       RoleData: {get_attr: [ControllerServiceChain, role_data]}
1261
1262   ComputeNodesPostDeployment:
1263     type: OS::TripleO::ComputePostDeployment
1264     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1265     properties:
1266       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1267       RoleData: {get_attr: [ComputeServiceChain, role_data]}
1268
1269   ObjectStorageNodesPostDeployment:
1270     type: OS::TripleO::ObjectStoragePostDeployment
1271     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1272     properties:
1273       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1274       RoleData: {get_attr: [ObjectStorageServiceChain, role_data]}
1275
1276   BlockStorageNodesPostDeployment:
1277     type: OS::TripleO::BlockStoragePostDeployment
1278     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1279     properties:
1280       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1281       RoleData: {get_attr: [BlockStorageServiceChain, role_data]}
1282
1283   CephStorageNodesPostDeployment:
1284     type: OS::TripleO::CephStoragePostDeployment
1285     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1286     properties:
1287       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1288       RoleData: {get_attr: [CephStorageServiceChain, role_data]}
1289
1290 outputs:
1291   KeystoneURL:
1292     description: URL for the Overcloud Keystone service
1293     value: {get_attr: [EndpointMap, endpoint_map, KeystonePublic, uri]}
1294   KeystoneAdminVip:
1295     description: Keystone Admin VIP endpoint
1296     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1297   PublicVip:
1298     description: Controller VIP for public API endpoints
1299     value: {get_attr: [VipMap, net_ip_map, external]}
1300   AodhInternalVip:
1301     description: VIP for Aodh API internal endpoint
1302     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, AodhApiNetwork]}]}
1303   CeilometerInternalVip:
1304     description: VIP for Ceilometer API internal endpoint
1305     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1306   CinderInternalVip:
1307     description: VIP for Cinder API internal endpoint
1308     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1309   GlanceInternalVip:
1310     description: VIP for Glance API internal endpoint
1311     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1312   GnocchiInternalVip:
1313     description: VIP for Gnocchi API internal endpoint
1314     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GnocchiApiNetwork]}]}
1315   HeatInternalVip:
1316     description: VIP for Heat API internal endpoint
1317     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1318   IronicInternalVip:
1319     description: VIP for Ironic API internal endpoint
1320     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, IronicApiNetwork]}]}
1321   KeystoneInternalVip:
1322     description: VIP for Keystone API internal endpoint
1323     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1324   NeutronInternalVip:
1325     description: VIP for Neutron API internal endpoint
1326     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1327   NovaInternalVip:
1328     description: VIP for Nova API internal endpoint
1329     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1330   SaharaInternalVip:
1331     description: VIP for Sahara API internal endpoint
1332     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SaharaApiNetwork]}]}
1333   SwiftInternalVip:
1334     description: VIP for Swift Proxy internal endpoint
1335     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1336   EndpointMap:
1337     description: |
1338       Mapping of the resources with the needed info for their endpoints.
1339       This includes the protocol used, the IP, port and also a full
1340       representation of the URI.
1341     value: {get_attr: [EndpointMap, endpoint_map]}
1342   HostsEntry:
1343     description: |
1344       The content that should be appended to your /etc/hosts if you want to get
1345       hostname-based access to the deployed nodes (useful for testing without
1346       setting up a DNS).
1347     value: {get_attr: [allNodesConfig, hosts_entries]}