Merge "Support for using external Ceph clusters"
[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: 'gre'
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: 'gre'
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: internal_api
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           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
830           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
831           UpdateIdentifier: {get_param: UpdateIdentifier}
832           Hostname:
833             str_replace:
834               template: {get_param: ControllerHostnameFormat}
835               params:
836                 '%stackname%': {get_param: 'OS::stack_name'}
837
838   Compute:
839     type: OS::Heat::ResourceGroup
840     depends_on: Networks
841     properties:
842       count: {get_param: ComputeCount}
843       removal_policies: {get_param: ComputeRemovalPolicies}
844       resource_def:
845         type: OS::TripleO::Compute
846         properties:
847           AdminPassword: {get_param: AdminPassword}
848           CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
849           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
850           CeilometerPassword: {get_param: CeilometerPassword}
851           CinderEnableNfsBackend: {get_param: CinderEnableNfsBackend}
852           Debug: {get_param: Debug}
853           ExtraConfig: {get_param: ExtraConfig}
854           Flavor: {get_param: OvercloudComputeFlavor}
855           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
856           GlancePort: {get_param: GlancePort}
857           GlanceProtocol: {get_param: GlanceProtocol}
858           Image: {get_param: NovaImage}
859           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
860           KeyName: {get_param: KeyName}
861           KeystoneHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
862           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
863           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
864           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
865           NeutronHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
866           NeutronNetworkType: {get_param: NeutronNetworkType}
867           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
868           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
869           NeutronPassword: {get_param: NeutronPassword}
870           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
871           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
872           NeutronDVR: {get_param: NeutronDVR}
873           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
874           NeutronAgentMode: {get_param: NeutronComputeAgentMode}
875           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
876           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
877           # L3 HA and Failover is not relevant for Computes, should be removed
878           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
879           NeutronL3HA: {get_param: NeutronL3HA}
880           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
881           NovaComputeDriver: {get_param: NovaComputeDriver}
882           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
883           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
884           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
885           NovaPublicIP: {get_attr: [PublicVirtualIP, ip_address]}
886           NovaPassword: {get_param: NovaPassword}
887           NtpServer: {get_param: NtpServer}
888           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
889           RabbitPassword: {get_param: RabbitPassword}
890           RabbitUserName: {get_param: RabbitUserName}
891           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
892           RabbitClientPort: {get_param: RabbitClientPort}
893           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
894           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
895           ServiceNetMap: {get_param: ServiceNetMap}
896           UpdateIdentifier: {get_param: UpdateIdentifier}
897           Hostname:
898             str_replace:
899               template: {get_param: ComputeHostnameFormat}
900               params:
901                 '%stackname%': {get_param: 'OS::stack_name'}
902
903   BlockStorage:
904     type: OS::Heat::ResourceGroup
905     depends_on: Networks
906     properties:
907       count: {get_param: BlockStorageCount}
908       removal_policies: {get_param: BlockStorageRemovalPolicies}
909       resource_def:
910         type: OS::TripleO::BlockStorage
911         properties:
912           Debug: {get_param: Debug}
913           Image: {get_param: BlockStorageImage}
914           CinderISCSIHelper: {get_param: CinderISCSIHelper}
915           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
916           # Purpose of the dedicated BlockStorage nodes should be to use their local LVM
917           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
918           CinderPassword: {get_param: CinderPassword}
919           KeyName: {get_param: KeyName}
920           Flavor: {get_param: OvercloudBlockStorageFlavor}
921           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
922           GlancePort: {get_param: GlancePort}
923           GlanceProtocol: {get_param: GlanceProtocol}
924           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
925           RabbitPassword: {get_param: RabbitPassword}
926           RabbitUserName: {get_param: RabbitUserName}
927           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
928           RabbitClientPort: {get_param: RabbitClientPort}
929           NtpServer: {get_param: NtpServer}
930           UpdateIdentifier: {get_param: UpdateIdentifier}
931           Hostname:
932             str_replace:
933               template: {get_param: BlockStorageHostnameFormat}
934               params:
935                 '%stackname%': {get_param: 'OS::stack_name'}
936           ServiceNetMap: {get_param: ServiceNetMap}
937           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
938           ExtraConfig: {get_param: ExtraConfig}
939           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
940
941   ObjectStorage:
942     type: OS::Heat::ResourceGroup
943     depends_on: Networks
944     properties:
945       count: {get_param: ObjectStorageCount}
946       removal_policies: {get_param: ObjectStorageRemovalPolicies}
947       resource_def:
948         type: OS::TripleO::ObjectStorage
949         properties:
950           KeyName: {get_param: KeyName}
951           Flavor: {get_param: OvercloudSwiftStorageFlavor}
952           HashSuffix: {get_param: SwiftHashSuffix}
953           MountCheck: {get_param: SwiftMountCheck}
954           MinPartHours: {get_param: SwiftMinPartHours}
955           PartPower: {get_param: SwiftPartPower}
956           Image: {get_param: SwiftStorageImage}
957           Replicas: { get_param: SwiftReplicas}
958           NtpServer: {get_param: NtpServer}
959           UpdateIdentifier: {get_param: UpdateIdentifier}
960           ServiceNetMap: {get_param: ServiceNetMap}
961           Hostname:
962             str_replace:
963               template: {get_param: ObjectStorageHostnameFormat}
964               params:
965                 '%stackname%': {get_param: 'OS::stack_name'}
966           ExtraConfig: {get_param: ExtraConfig}
967           ObjectStorageExtraConfig: {get_param: ObjectStorageExtraConfig}
968
969   CephStorage:
970     type: OS::Heat::ResourceGroup
971     depends_on: Networks
972     properties:
973       count: {get_param: CephStorageCount}
974       removal_policies: {get_param: CephStorageRemovalPolicies}
975       resource_def:
976         type: OS::TripleO::CephStorage
977         properties:
978           Image: {get_param: CephStorageImage}
979           KeyName: {get_param: KeyName}
980           Flavor: {get_param: OvercloudCephStorageFlavor}
981           NtpServer: {get_param: NtpServer}
982           ServiceNetMap: {get_param: ServiceNetMap}
983           UpdateIdentifier: {get_param: UpdateIdentifier}
984           Hostname:
985             str_replace:
986               template: {get_param: CephStorageHostnameFormat}
987               params:
988                 '%stackname%': {get_param: 'OS::stack_name'}
989           ExtraConfig: {get_param: ExtraConfig}
990           CephStorageExtraConfig: {get_param: CephStorageExtraConfig}
991
992   ControllerIpListMap:
993     type: OS::TripleO::Network::Ports::NetIpListMap
994     properties:
995       ControlPlaneIpList: {get_attr: [Controller, ip_address]}
996       ExternalIpList: {get_attr: [Controller, external_ip_address]}
997       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
998       StorageIpList: {get_attr: [Controller, storage_ip_address]}
999       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
1000       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
1001
1002   allNodesConfig:
1003     type: OS::TripleO::AllNodes::SoftwareConfig
1004     properties:
1005       compute_hosts: {get_attr: [Compute, hosts_entry]}
1006       controller_hosts: {get_attr: [Controller, hosts_entry]}
1007       controller_ips: {get_attr: [Controller, ip_address]}
1008       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
1009       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
1010       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
1011       controller_names: {get_attr: [Controller, hostname]}
1012       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1013       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
1014       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
1015       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
1016       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1017       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1018       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1019       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1020       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1021       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1022       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1023       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1024       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1025       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1026       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1027       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1028       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1029
1030   MysqlRootPassword:
1031     type: OS::Heat::RandomString
1032     properties:
1033       length: 10
1034
1035   MysqlClusterUniquePart:
1036     type: OS::Heat::RandomString
1037     properties:
1038       length: 10
1039
1040   RabbitCookie:
1041     type: OS::Heat::RandomString
1042     properties:
1043       length: 20
1044       salt: {get_param: RabbitCookieSalt}
1045
1046   # creates the network architecture
1047   Networks:
1048     type: OS::TripleO::Network
1049
1050   ControlVirtualIP:
1051     type: OS::Neutron::Port
1052     depends_on: Networks
1053     properties:
1054       name: control_virtual_ip
1055       network_id: {get_param: NeutronControlPlaneID}
1056       fixed_ips: {get_param: ControlFixedIPs}
1057       replacement_policy: AUTO
1058
1059   RedisVirtualIP:
1060     depends_on: Networks
1061     type: OS::TripleO::Controller::Ports::RedisVipPort
1062     properties:
1063       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1064       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
1065       PortName: redis_virtual_ip
1066       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
1067
1068   # The public VIP is on the External net, falls back to ctlplane
1069   PublicVirtualIP:
1070     depends_on: Networks
1071     type: OS::TripleO::Controller::Ports::ExternalPort
1072     properties:
1073       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1074       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
1075       PortName: public_virtual_ip
1076       FixedIPs: {get_param: PublicVirtualFixedIPs}
1077
1078   InternalApiVirtualIP:
1079     depends_on: Networks
1080     type: OS::TripleO::Controller::Ports::InternalApiPort
1081     properties:
1082       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1083       PortName: internal_api_virtual_ip
1084
1085   StorageVirtualIP:
1086     depends_on: Networks
1087     type: OS::TripleO::Controller::Ports::StoragePort
1088     properties:
1089       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1090       PortName: storage_virtual_ip
1091
1092   StorageMgmtVirtualIP:
1093     depends_on: Networks
1094     type: OS::TripleO::Controller::Ports::StorageMgmtPort
1095     properties:
1096       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1097       PortName: storage_management_virtual_ip
1098
1099   VipMap:
1100     type: OS::TripleO::Network::Ports::NetIpMap
1101     properties:
1102       ControlPlaneIp: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1103       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
1104       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
1105       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1106       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1107       # No tenant VIP required
1108
1109   VipConfig:
1110     type: OS::TripleO::VipConfig
1111
1112   VipDeployment:
1113     type: OS::Heat::StructuredDeployments
1114     properties:
1115       config: {get_resource: VipConfig}
1116       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1117       input_values:
1118         # service VIP mappings
1119         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1120         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1121         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1122         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1123         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1124         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1125         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1126         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1127         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1128         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1129         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1130         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1131         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1132         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1133         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1134         # direct configuration of Virtual IPs for each network
1135         control_virtual_ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1136         public_virtual_ip: {get_attr: [PublicVirtualIP, ip_address]}
1137         internal_api_virtual_ip: {get_attr: [InternalApiVirtualIP, ip_address]}
1138         storage_virtual_ip: {get_attr: [StorageVirtualIP, ip_address]}
1139         storage_mgmt_virtual_ip: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1140
1141   ControllerBootstrapNodeConfig:
1142     type: OS::TripleO::BootstrapNode::SoftwareConfig
1143     properties:
1144       bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1145       bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1146
1147   ControllerBootstrapNodeDeployment:
1148     type: OS::Heat::StructuredDeployments
1149     properties:
1150       config: {get_attr: [ControllerBootstrapNodeConfig, config_id]}
1151       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1152
1153   ControllerSwiftDeployment:
1154     type: OS::Heat::StructuredDeployments
1155     properties:
1156       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1157       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1158
1159   ObjectStorageSwiftDeployment:
1160     type: OS::Heat::StructuredDeployments
1161     properties:
1162       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1163       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1164
1165   SwiftDevicesAndProxyConfig:
1166     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1167     properties:
1168       controller_swift_devices: {get_attr: [Controller, swift_device]}
1169       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1170       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1171
1172   ComputeCephDeployment:
1173     type: OS::Heat::StructuredDeployments
1174     properties:
1175       config: {get_attr: [CephClusterConfig, config_id]}
1176       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1177
1178   ControllerCephDeployment:
1179     type: OS::Heat::StructuredDeployments
1180     properties:
1181       config: {get_attr: [CephClusterConfig, config_id]}
1182       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1183
1184   CephStorageCephDeployment:
1185     type: OS::Heat::StructuredDeployments
1186     properties:
1187       config: {get_attr: [CephClusterConfig, config_id]}
1188       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1189
1190   CephClusterConfig:
1191     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1192     properties:
1193       ceph_storage_count: {get_param: CephStorageCount}
1194       ceph_fsid: {get_param: CephClusterFSID}
1195       ceph_mon_key: {get_param: CephMonKey}
1196       ceph_admin_key: {get_param: CephAdminKey}
1197       ceph_client_key: {get_param: CephClientKey}
1198       ceph_external_mon_ips: {get_param: CephExternalMonHost}
1199       ceph_mon_names: {get_attr: [Controller, hostname]}
1200       ceph_mon_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1201
1202   ControllerClusterConfig:
1203     type: OS::Heat::StructuredConfig
1204     properties:
1205       group: os-apply-config
1206       config:
1207         corosync:
1208           nodes: {get_attr: [Controller, corosync_node]}
1209         horizon:
1210           caches:
1211             memcached:
1212               nodes: {get_attr: [Controller, hostname]}
1213         mysql:
1214           nodes: {get_attr: [Controller, corosync_node]}
1215         haproxy:
1216           nodes: {get_attr: [Controller, corosync_node]}
1217
1218   ControllerClusterDeployment:
1219     type: OS::Heat::StructuredDeployments
1220     properties:
1221       config: {get_resource: ControllerClusterConfig}
1222       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1223
1224   ControllerAllNodesDeployment:
1225     type: OS::Heat::StructuredDeployments
1226     properties:
1227       config: {get_attr: [allNodesConfig, config_id]}
1228       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1229
1230   ComputeAllNodesDeployment:
1231     type: OS::Heat::StructuredDeployments
1232     properties:
1233       config: {get_attr: [allNodesConfig, config_id]}
1234       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1235
1236   BlockStorageAllNodesDeployment:
1237     type: OS::Heat::StructuredDeployments
1238     properties:
1239       config: {get_attr: [allNodesConfig, config_id]}
1240       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1241
1242   ObjectStorageAllNodesDeployment:
1243     type: OS::Heat::StructuredDeployments
1244     properties:
1245       config: {get_attr: [allNodesConfig, config_id]}
1246       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1247
1248   CephStorageAllNodesDeployment:
1249     type: OS::Heat::StructuredDeployments
1250     properties:
1251       config: {get_attr: [allNodesConfig, config_id]}
1252       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1253
1254   # Nested stack deployment runs after all other controller deployments
1255   ControllerNodesPostDeployment:
1256     type: OS::TripleO::ControllerPostDeployment
1257     depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1258     properties:
1259       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1260       NodeConfigIdentifiers: {get_attr: [Controller, attributes, config_identifier]}
1261
1262   ComputeNodesPostDeployment:
1263     type: OS::TripleO::ComputePostDeployment
1264     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1265     properties:
1266       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1267       NodeConfigIdentifiers: {get_attr: [Compute, attributes, config_identifier]}
1268
1269   ObjectStorageNodesPostDeployment:
1270     type: OS::TripleO::ObjectStoragePostDeployment
1271     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1272     properties:
1273       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1274       NodeConfigIdentifiers: {get_attr: [ObjectStorage, attributes, config_identifier]}
1275
1276
1277   BlockStorageNodesPostDeployment:
1278     type: OS::TripleO::BlockStoragePostDeployment
1279     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1280     properties:
1281       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1282       NodeConfigIdentifiers: {get_attr: [BlockStorage, attributes, config_identifier]}
1283
1284   CephStorageNodesPostDeployment:
1285     type: OS::TripleO::CephStoragePostDeployment
1286     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1287     properties:
1288       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1289       NodeConfigIdentifiers: {get_attr: [CephStorage, attributes, config_identifier]}
1290
1291 outputs:
1292   KeystoneURL:
1293     description: URL for the Overcloud Keystone service
1294     value:
1295       list_join:
1296       - ''
1297       - - http://
1298         - {get_attr: [PublicVirtualIP, ip_address]}
1299         - :5000/v2.0/
1300   PublicVip:
1301     description: Controller VIP for public API endpoints
1302     value: {get_attr: [PublicVirtualIP, ip_address]}
1303   CeilometerInternalVip:
1304     description: VIP for Ceilometer API internal endpoint
1305     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1306   CinderInternalVip:
1307     description: VIP for Cinder API internal endpoint
1308     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1309   GlanceInternalVip:
1310     description: VIP for Glance API internal endpoint
1311     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1312   HeatInternalVip:
1313     description: VIP for Heat API internal endpoint
1314     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1315   KeystoneInternalVip:
1316     description: VIP for Keystone API internal endpoint
1317     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1318   NeutronInternalVip:
1319     description: VIP for Neutron API internal endpoint
1320     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1321   NovaInternalVip:
1322     description: VIP for Nova API internal endpoint
1323     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1324   SwiftInternalVip:
1325     description: VIP for Swift Proxy internal endpoint
1326     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}