Merge "Puppet / Compute: allow to run Ephemeral only storage with RBD"
[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   CinderEnableRbdBackend:
65     default: false
66     description: Whether to enable or not the Rbd backend for Cinder
67     type: boolean
68   CloudName:
69     default: ''
70     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
71     type: string
72   ControlFixedIPs:
73     default: []
74     description: Should be used for arbitrary ips.
75     type: json
76   Debug:
77     default: ''
78     description: Set to True to enable debugging on all services.
79     type: string
80   GlancePort:
81     default: "9292"
82     description: Glance port.
83     type: string
84   GlanceProtocol:
85     default: http
86     description: Protocol to use when connecting to glance, set to https for SSL.
87     type: string
88   HAProxySyslogAddress:
89     default: /dev/log
90     description: Syslog address where HAproxy will send its log
91     type: string
92   HorizonAllowedHosts:
93     default: '*'
94     description: A list of IP/Hostname allowed to connect to horizon
95     type: comma_delimited_list
96   ImageUpdatePolicy:
97     default: 'REBUILD_PRESERVE_EPHEMERAL'
98     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
99     type: string
100   KeyName:
101     default: default
102     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
103     type: string
104     constraints:
105       - custom_constraint: nova.keypair
106   NeutronExternalNetworkBridge:
107     description: Name of bridge used for external network traffic.
108     type: string
109     default: 'br-ex'
110   NeutronBridgeMappings:
111     description: >
112       The OVS logical->physical bridge mappings to use. See the Neutron
113       documentation for details. Defaults to mapping br-ex - the external
114       bridge on hosts - to a physical name 'datacentre' which can be used
115       to create provider networks (and we use this for the default floating
116       network) - if changing this either use different post-install network
117       scripts or be sure to keep 'datacentre' as a mapping network name.
118     type: string
119     default: "datacentre:br-ex"
120   NeutronControlPlaneID:
121     default: ''
122     type: string
123     description: Neutron ID for ctlplane network.
124   NeutronEnableTunnelling:
125     type: string
126     default: "True"
127   NeutronFlatNetworks:
128     type: string
129     default: 'datacentre'
130     description: >
131       If set, flat networks to configure in neutron plugins. Defaults to
132       'datacentre' to permit external network creation.
133   NeutronNetworkType:
134     default: 'vxlan'
135     description: The tenant network type for Neutron, either gre or vxlan.
136     type: string
137   NeutronPassword:
138     default: unset
139     description: The password for the neutron service account, used by neutron agents.
140     type: string
141     hidden: true
142   NeutronPublicInterface:
143     default: nic1
144     description: What interface to bridge onto br-ex for network nodes.
145     type: string
146   NeutronPublicInterfaceTag:
147     default: ''
148     description: >
149       VLAN tag for creating a public VLAN. The tag will be used to
150       create an access port on the exterior bridge for each control plane node,
151       and that port will be given the IP address returned by neutron from the
152       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
153       overcloud.yaml to include the deployment of VLAN ports to the control
154       plane.
155     type: string
156   NeutronComputeAgentMode:
157     default: 'dvr'
158     description: Agent mode for the neutron-l3-agent on the compute hosts
159     type: string
160   NeutronAgentMode:
161     default: 'dvr_snat'
162     description: Agent mode for the neutron-l3-agent on the controller hosts
163     type: string
164   NeutronDVR:
165     default: 'False'
166     description: Whether to configure Neutron Distributed Virtual Routers
167     type: string
168   NeutronMetadataProxySharedSecret:
169     default: 'unset'
170     description: Shared secret to prevent spoofing
171     type: string
172     hidden: true
173   NeutronTunnelTypes:
174     default: 'vxlan'
175     description: |
176         The tunnel types for the Neutron tenant network. To specify multiple
177         values, use a comma separated string, like so: 'gre,vxlan'
178     type: string
179   NeutronTunnelIdRanges:
180     description: |
181         Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
182         of GRE tunnel IDs that are available for tenant network allocation
183     default: ["1:1000", ]
184     type: comma_delimited_list
185   NeutronVniRanges:
186     description: |
187         Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
188         of VXLAN VNI IDs that are available for tenant network allocation
189     default: ["1:1000", ]
190     type: comma_delimited_list
191   NeutronCorePlugin:
192     default: 'ml2'
193     description: |
194         The core plugin for Neutron. The value should be the entrypoint to be loaded
195         from neutron.core_plugins namespace.
196     type: string
197   NeutronServicePlugins:
198     default: "router"
199     description: |
200         Comma-separated list of service plugin entrypoints to be loaded from the
201         neutron.service_plugins namespace.
202     type: comma_delimited_list
203   NeutronTypeDrivers:
204     default: "vxlan,vlan,flat,gre"
205     description: |
206         Comma-separated list of network type driver entrypoints to be loaded.
207     type: comma_delimited_list
208   NeutronMechanismDrivers:
209     default: 'openvswitch'
210     description: |
211         The mechanism drivers for the Neutron tenant network. To specify multiple
212         values, use a comma separated string, like so: 'openvswitch,l2_population'
213     type: string
214   NeutronAllowL3AgentFailover:
215     default: 'True'
216     description: Allow automatic l3-agent failover
217     type: string
218   NeutronL3HA:
219     default: 'False'
220     description: Whether to enable l3-agent HA
221     type: string
222   NeutronDhcpAgentsPerNetwork:
223     type: number
224     default: 3
225     description: The number of neutron dhcp agents to schedule per network
226   NovaPassword:
227     default: unset
228     description: The password for the nova service account, used by nova-api.
229     type: string
230     hidden: true
231   NtpServer:
232     type: string
233     default: ''
234   MongoDbNoJournal:
235     default: false
236     description: Should MongoDb journaling be disabled
237     type: boolean
238   PublicVirtualFixedIPs:
239     default: []
240     description: >
241         Control the IP allocation for the PublicVirtualInterface port. E.g.
242         [{'ip_address':'1.2.3.4'}]
243     type: json
244   RabbitCookieSalt:
245     type: string
246     default: unset
247     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
248   # FIXME: 'guest' is provisioned in RabbitMQ by default, we should create a user if these are changed
249   RabbitUserName:
250     default: guest
251     description: The username for RabbitMQ
252     type: string
253   RabbitPassword:
254     default: guest
255     description: The password for RabbitMQ
256     type: string
257     hidden: true
258   RabbitClientUseSSL:
259     default: false
260     description: >
261         Rabbit client subscriber parameter to specify
262         an SSL connection to the RabbitMQ host.
263     type: string
264   RabbitClientPort:
265     default: 5672
266     description: Set rabbit subscriber port, change this if using SSL
267     type: number
268   # We need to set this as string because 'unlimited' is a valid setting
269   RabbitFDLimit:
270     default: 16384
271     description: Configures RabbitMQ FD limit
272     type: string
273   SnmpdReadonlyUserName:
274     default: ro_snmp_user
275     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
276     type: string
277   SnmpdReadonlyUserPassword:
278     default: unset
279     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
280     type: string
281     hidden: true
282
283   # Controller-specific params
284   AdminToken:
285     default: unset
286     description: The keystone auth secret.
287     type: string
288     hidden: true
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           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
899           Debug: {get_param: Debug}
900           ExtraConfig: {get_param: ExtraConfig}
901           Flavor: {get_param: OvercloudComputeFlavor}
902           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
903           GlancePort: {get_param: GlancePort}
904           GlanceProtocol: {get_param: GlanceProtocol}
905           Image: {get_param: NovaImage}
906           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
907           KeyName: {get_param: KeyName}
908           KeystoneAdminApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
909           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
910           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
911           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
912           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
913           NeutronHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
914           NeutronNetworkType: {get_param: NeutronNetworkType}
915           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
916           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
917           NeutronPassword: {get_param: NeutronPassword}
918           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
919           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
920           NeutronDVR: {get_param: NeutronDVR}
921           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
922           NeutronAgentMode: {get_param: NeutronComputeAgentMode}
923           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
924           NeutronCorePlugin: {get_param: NeutronCorePlugin}
925           NeutronServicePlugins: {get_param: NeutronServicePlugins}
926           NeutronTypeDrivers: {get_param: NeutronTypeDrivers}
927           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
928           # L3 HA and Failover is not relevant for Computes, should be removed
929           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
930           NeutronL3HA: {get_param: NeutronL3HA}
931           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
932           NovaComputeDriver: {get_param: NovaComputeDriver}
933           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
934           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
935           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
936           NovaPublicIP: {get_attr: [PublicVirtualIP, ip_address]}
937           NovaPassword: {get_param: NovaPassword}
938           NtpServer: {get_param: NtpServer}
939           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
940           RabbitPassword: {get_param: RabbitPassword}
941           RabbitUserName: {get_param: RabbitUserName}
942           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
943           RabbitClientPort: {get_param: RabbitClientPort}
944           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
945           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
946           ServiceNetMap: {get_param: ServiceNetMap}
947           UpdateIdentifier: {get_param: UpdateIdentifier}
948           Hostname:
949             str_replace:
950               template: {get_param: ComputeHostnameFormat}
951               params:
952                 '%stackname%': {get_param: 'OS::stack_name'}
953
954   BlockStorage:
955     type: OS::Heat::ResourceGroup
956     depends_on: Networks
957     properties:
958       count: {get_param: BlockStorageCount}
959       removal_policies: {get_param: BlockStorageRemovalPolicies}
960       resource_def:
961         type: OS::TripleO::BlockStorage
962         properties:
963           Debug: {get_param: Debug}
964           Image: {get_param: BlockStorageImage}
965           CinderISCSIHelper: {get_param: CinderISCSIHelper}
966           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
967           # Purpose of the dedicated BlockStorage nodes should be to use their local LVM
968           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
969           CinderPassword: {get_param: CinderPassword}
970           KeyName: {get_param: KeyName}
971           Flavor: {get_param: OvercloudBlockStorageFlavor}
972           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
973           GlancePort: {get_param: GlancePort}
974           GlanceProtocol: {get_param: GlanceProtocol}
975           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
976           RabbitPassword: {get_param: RabbitPassword}
977           RabbitUserName: {get_param: RabbitUserName}
978           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
979           RabbitClientPort: {get_param: RabbitClientPort}
980           NtpServer: {get_param: NtpServer}
981           UpdateIdentifier: {get_param: UpdateIdentifier}
982           Hostname:
983             str_replace:
984               template: {get_param: BlockStorageHostnameFormat}
985               params:
986                 '%stackname%': {get_param: 'OS::stack_name'}
987           ServiceNetMap: {get_param: ServiceNetMap}
988           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
989           ExtraConfig: {get_param: ExtraConfig}
990           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
991
992   ObjectStorage:
993     type: OS::Heat::ResourceGroup
994     depends_on: Networks
995     properties:
996       count: {get_param: ObjectStorageCount}
997       removal_policies: {get_param: ObjectStorageRemovalPolicies}
998       resource_def:
999         type: OS::TripleO::ObjectStorage
1000         properties:
1001           KeyName: {get_param: KeyName}
1002           Flavor: {get_param: OvercloudSwiftStorageFlavor}
1003           HashSuffix: {get_param: SwiftHashSuffix}
1004           MountCheck: {get_param: SwiftMountCheck}
1005           MinPartHours: {get_param: SwiftMinPartHours}
1006           PartPower: {get_param: SwiftPartPower}
1007           Image: {get_param: SwiftStorageImage}
1008           Replicas: { get_param: SwiftReplicas}
1009           NtpServer: {get_param: NtpServer}
1010           UpdateIdentifier: {get_param: UpdateIdentifier}
1011           ServiceNetMap: {get_param: ServiceNetMap}
1012           Hostname:
1013             str_replace:
1014               template: {get_param: ObjectStorageHostnameFormat}
1015               params:
1016                 '%stackname%': {get_param: 'OS::stack_name'}
1017           ExtraConfig: {get_param: ExtraConfig}
1018           ObjectStorageExtraConfig: {get_param: ObjectStorageExtraConfig}
1019
1020   CephStorage:
1021     type: OS::Heat::ResourceGroup
1022     depends_on: Networks
1023     properties:
1024       count: {get_param: CephStorageCount}
1025       removal_policies: {get_param: CephStorageRemovalPolicies}
1026       resource_def:
1027         type: OS::TripleO::CephStorage
1028         properties:
1029           Image: {get_param: CephStorageImage}
1030           KeyName: {get_param: KeyName}
1031           Flavor: {get_param: OvercloudCephStorageFlavor}
1032           NtpServer: {get_param: NtpServer}
1033           ServiceNetMap: {get_param: ServiceNetMap}
1034           UpdateIdentifier: {get_param: UpdateIdentifier}
1035           Hostname:
1036             str_replace:
1037               template: {get_param: CephStorageHostnameFormat}
1038               params:
1039                 '%stackname%': {get_param: 'OS::stack_name'}
1040           ExtraConfig: {get_param: ExtraConfig}
1041           CephStorageExtraConfig: {get_param: CephStorageExtraConfig}
1042
1043   ControllerIpListMap:
1044     type: OS::TripleO::Network::Ports::NetIpListMap
1045     properties:
1046       ControlPlaneIpList: {get_attr: [Controller, ip_address]}
1047       ExternalIpList: {get_attr: [Controller, external_ip_address]}
1048       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
1049       StorageIpList: {get_attr: [Controller, storage_ip_address]}
1050       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
1051       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
1052
1053   allNodesConfig:
1054     type: OS::TripleO::AllNodes::SoftwareConfig
1055     properties:
1056       compute_hosts: {get_attr: [Compute, hosts_entry]}
1057       controller_hosts: {get_attr: [Controller, hosts_entry]}
1058       controller_ips: {get_attr: [Controller, ip_address]}
1059       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
1060       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
1061       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
1062       controller_names: {get_attr: [Controller, hostname]}
1063       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1064       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
1065       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
1066       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
1067       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1068       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1069       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1070       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1071       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1072       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1073       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1074       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1075       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1076       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1077       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1078       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1079       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1080
1081   MysqlRootPassword:
1082     type: OS::Heat::RandomString
1083     properties:
1084       length: 10
1085
1086   MysqlClusterUniquePart:
1087     type: OS::Heat::RandomString
1088     properties:
1089       length: 10
1090
1091   RabbitCookie:
1092     type: OS::Heat::RandomString
1093     properties:
1094       length: 20
1095       salt: {get_param: RabbitCookieSalt}
1096
1097   # creates the network architecture
1098   Networks:
1099     type: OS::TripleO::Network
1100
1101   ControlVirtualIP:
1102     type: OS::Neutron::Port
1103     depends_on: Networks
1104     properties:
1105       name: control_virtual_ip
1106       network_id: {get_param: NeutronControlPlaneID}
1107       fixed_ips: {get_param: ControlFixedIPs}
1108       replacement_policy: AUTO
1109
1110   RedisVirtualIP:
1111     depends_on: Networks
1112     type: OS::TripleO::Controller::Ports::RedisVipPort
1113     properties:
1114       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1115       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
1116       PortName: redis_virtual_ip
1117       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
1118
1119   # The public VIP is on the External net, falls back to ctlplane
1120   PublicVirtualIP:
1121     depends_on: Networks
1122     type: OS::TripleO::Controller::Ports::ExternalPort
1123     properties:
1124       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1125       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
1126       PortName: public_virtual_ip
1127       FixedIPs: {get_param: PublicVirtualFixedIPs}
1128
1129   InternalApiVirtualIP:
1130     depends_on: Networks
1131     type: OS::TripleO::Controller::Ports::InternalApiPort
1132     properties:
1133       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1134       PortName: internal_api_virtual_ip
1135
1136   StorageVirtualIP:
1137     depends_on: Networks
1138     type: OS::TripleO::Controller::Ports::StoragePort
1139     properties:
1140       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1141       PortName: storage_virtual_ip
1142
1143   StorageMgmtVirtualIP:
1144     depends_on: Networks
1145     type: OS::TripleO::Controller::Ports::StorageMgmtPort
1146     properties:
1147       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1148       PortName: storage_management_virtual_ip
1149
1150   VipMap:
1151     type: OS::TripleO::Network::Ports::NetIpMap
1152     properties:
1153       ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1154       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
1155       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
1156       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1157       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1158       # No tenant VIP required
1159
1160   VipConfig:
1161     type: OS::TripleO::VipConfig
1162
1163   VipDeployment:
1164     type: OS::Heat::StructuredDeployments
1165     properties:
1166       config: {get_resource: VipConfig}
1167       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1168       input_values:
1169         # service VIP mappings
1170         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1171         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1172         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1173         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1174         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1175         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1176         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1177         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1178         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1179         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1180         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1181         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1182         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1183         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1184         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1185         # direct configuration of Virtual IPs for each network
1186         control_virtual_ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1187         public_virtual_ip: {get_attr: [PublicVirtualIP, ip_address]}
1188         internal_api_virtual_ip: {get_attr: [InternalApiVirtualIP, ip_address]}
1189         storage_virtual_ip: {get_attr: [StorageVirtualIP, ip_address]}
1190         storage_mgmt_virtual_ip: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1191
1192   ControllerBootstrapNodeConfig:
1193     type: OS::TripleO::BootstrapNode::SoftwareConfig
1194     properties:
1195       bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1196       bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1197
1198   ControllerBootstrapNodeDeployment:
1199     type: OS::Heat::StructuredDeployments
1200     properties:
1201       config: {get_attr: [ControllerBootstrapNodeConfig, config_id]}
1202       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1203
1204   ControllerSwiftDeployment:
1205     type: OS::Heat::StructuredDeployments
1206     properties:
1207       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1208       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1209
1210   ObjectStorageSwiftDeployment:
1211     type: OS::Heat::StructuredDeployments
1212     properties:
1213       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1214       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1215
1216   SwiftDevicesAndProxyConfig:
1217     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1218     properties:
1219       controller_swift_devices: {get_attr: [Controller, swift_device]}
1220       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1221       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1222
1223   ComputeCephDeployment:
1224     type: OS::Heat::StructuredDeployments
1225     properties:
1226       config: {get_attr: [CephClusterConfig, config_id]}
1227       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1228
1229   ControllerCephDeployment:
1230     type: OS::Heat::StructuredDeployments
1231     properties:
1232       config: {get_attr: [CephClusterConfig, config_id]}
1233       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1234
1235   CephStorageCephDeployment:
1236     type: OS::Heat::StructuredDeployments
1237     properties:
1238       config: {get_attr: [CephClusterConfig, config_id]}
1239       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1240
1241   CephClusterConfig:
1242     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1243     properties:
1244       ceph_storage_count: {get_param: CephStorageCount}
1245       ceph_fsid: {get_param: CephClusterFSID}
1246       ceph_mon_key: {get_param: CephMonKey}
1247       ceph_admin_key: {get_param: CephAdminKey}
1248       ceph_client_key: {get_param: CephClientKey}
1249       ceph_external_mon_ips: {get_param: CephExternalMonHost}
1250       ceph_mon_names: {get_attr: [Controller, hostname]}
1251       ceph_mon_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1252
1253   ControllerClusterConfig:
1254     type: OS::Heat::StructuredConfig
1255     properties:
1256       group: os-apply-config
1257       config:
1258         corosync:
1259           nodes: {get_attr: [Controller, corosync_node]}
1260         horizon:
1261           caches:
1262             memcached:
1263               nodes: {get_attr: [Controller, hostname]}
1264         mysql:
1265           nodes: {get_attr: [Controller, corosync_node]}
1266         haproxy:
1267           nodes: {get_attr: [Controller, corosync_node]}
1268
1269   ControllerClusterDeployment:
1270     type: OS::Heat::StructuredDeployments
1271     properties:
1272       config: {get_resource: ControllerClusterConfig}
1273       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1274
1275   ControllerAllNodesDeployment:
1276     type: OS::Heat::StructuredDeployments
1277     properties:
1278       config: {get_attr: [allNodesConfig, config_id]}
1279       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1280
1281   ComputeAllNodesDeployment:
1282     type: OS::Heat::StructuredDeployments
1283     properties:
1284       config: {get_attr: [allNodesConfig, config_id]}
1285       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1286
1287   BlockStorageAllNodesDeployment:
1288     type: OS::Heat::StructuredDeployments
1289     properties:
1290       config: {get_attr: [allNodesConfig, config_id]}
1291       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1292
1293   ObjectStorageAllNodesDeployment:
1294     type: OS::Heat::StructuredDeployments
1295     properties:
1296       config: {get_attr: [allNodesConfig, config_id]}
1297       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1298
1299   CephStorageAllNodesDeployment:
1300     type: OS::Heat::StructuredDeployments
1301     properties:
1302       config: {get_attr: [allNodesConfig, config_id]}
1303       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1304
1305   # All Nodes Validations
1306   AllNodesValidationConfig:
1307     type: OS::TripleO::AllNodes::Validation
1308     properties:
1309       PingTestIps:
1310         list_join:
1311         - ' '
1312         - - {get_attr: [Controller, resource.0.external_ip_address]}
1313           - {get_attr: [Controller, resource.0.internal_api_ip_address]}
1314           - {get_attr: [Controller, resource.0.storage_ip_address]}
1315           - {get_attr: [Controller, resource.0.storage_mgmt_ip_address]}
1316           - {get_attr: [Controller, resource.0.tenant_ip_address]}
1317
1318   ControllerAllNodesValidationDeployment:
1319     type: OS::Heat::StructuredDeployments
1320     depends_on: ControllerAllNodesDeployment
1321     properties:
1322       config: {get_resource: AllNodesValidationConfig}
1323       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1324
1325   ComputeAllNodesValidationDeployment:
1326     type: OS::Heat::StructuredDeployments
1327     depends_on: ComputeAllNodesDeployment
1328     properties:
1329       config: {get_resource: AllNodesValidationConfig}
1330       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1331
1332   BlockStorageAllNodesValidationDeployment:
1333     type: OS::Heat::StructuredDeployments
1334     depends_on: BlockStorageAllNodesDeployment
1335     properties:
1336       config: {get_resource: AllNodesValidationConfig}
1337       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1338
1339   ObjectStorageAllNodesValidationDeployment:
1340     type: OS::Heat::StructuredDeployments
1341     depends_on: ObjectStorageAllNodesDeployment
1342     properties:
1343       config: {get_resource: AllNodesValidationConfig}
1344       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1345
1346   CephStorageAllNodesValidationDeployment:
1347     type: OS::Heat::StructuredDeployments
1348     depends_on: CephStorageAllNodesDeployment
1349     properties:
1350       config: {get_resource: AllNodesValidationConfig}
1351       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1352
1353   # Optional ExtraConfig for all nodes - all roles are passed in here, but
1354   # the nested template may configure each role differently (or not at all)
1355   AllNodesExtraConfig:
1356     type: OS::TripleO::AllNodesExtraConfig
1357     properties:
1358       controller_servers: {get_attr: [Controller, attributes, nova_server_resource]}
1359       compute_servers: {get_attr: [Compute, attributes, nova_server_resource]}
1360       blockstorage_servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1361       objectstorage_servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1362       cephstorage_servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1363
1364   # Nested stack deployment runs after all other controller deployments
1365   ControllerNodesPostDeployment:
1366     type: OS::TripleO::ControllerPostDeployment
1367     depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1368     properties:
1369       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1370       NodeConfigIdentifiers:
1371         allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
1372         controller_config: {get_attr: [Controller, attributes, config_identifier]}
1373
1374   ComputeNodesPostDeployment:
1375     type: OS::TripleO::ComputePostDeployment
1376     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1377     properties:
1378       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1379       NodeConfigIdentifiers:
1380         allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
1381         compute_config: {get_attr: [Compute, attributes, config_identifier]}
1382
1383   ObjectStorageNodesPostDeployment:
1384     type: OS::TripleO::ObjectStoragePostDeployment
1385     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1386     properties:
1387       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1388       NodeConfigIdentifiers:
1389         allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
1390         objectstorage_config: {get_attr: [ObjectStorage, attributes, config_identifier]}
1391
1392   BlockStorageNodesPostDeployment:
1393     type: OS::TripleO::BlockStoragePostDeployment
1394     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1395     properties:
1396       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1397       NodeConfigIdentifiers:
1398         allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
1399         blockstorage_config: {get_attr: [BlockStorage, attributes, config_identifier]}
1400
1401   CephStorageNodesPostDeployment:
1402     type: OS::TripleO::CephStoragePostDeployment
1403     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1404     properties:
1405       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1406       NodeConfigIdentifiers:
1407         allnodes_extra: {get_attr: [AllNodesExtraConfig, config_identifier]}
1408         cephstorage_config: {get_attr: [CephStorage, attributes, config_identifier]}
1409
1410 outputs:
1411   KeystoneURL:
1412     description: URL for the Overcloud Keystone service
1413     value:
1414       list_join:
1415       - ''
1416       - - http://
1417         - {get_attr: [PublicVirtualIP, ip_address]}
1418         - :5000/v2.0/
1419   KeystoneAdminVip:
1420     description: Keystone Admin VIP endpoint
1421     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1422   PublicVip:
1423     description: Controller VIP for public API endpoints
1424     value: {get_attr: [PublicVirtualIP, ip_address]}
1425   CeilometerInternalVip:
1426     description: VIP for Ceilometer API internal endpoint
1427     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1428   CinderInternalVip:
1429     description: VIP for Cinder API internal endpoint
1430     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1431   GlanceInternalVip:
1432     description: VIP for Glance API internal endpoint
1433     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1434   HeatInternalVip:
1435     description: VIP for Heat API internal endpoint
1436     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1437   KeystoneInternalVip:
1438     description: VIP for Keystone API internal endpoint
1439     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1440   NeutronInternalVip:
1441     description: VIP for Neutron API internal endpoint
1442     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1443   NovaInternalVip:
1444     description: VIP for Nova API internal endpoint
1445     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1446   SwiftInternalVip:
1447     description: VIP for Swift Proxy internal endpoint
1448     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}