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