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