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   MysqlInnodbBufferPoolSize:
411     description: >
412         Specifies the size of the buffer pool in megabytes. Setting to
413         zero should be interpreted as "no value" and will defer to the
414         lower level default.
415     type: number
416     default: 0
417   MysqlMaxConnections:
418     description: Configures MySQL max_connections config setting
419     type: number
420     default: 4096
421   NeutronDnsmasqOptions:
422     default: 'dhcp-option-force=26,1400'
423     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
424     type: string
425   NeutronPublicInterfaceDefaultRoute:
426     default: ''
427     description: A custom default route for the NeutronPublicInterface.
428     type: string
429   NeutronPublicInterfaceIP:
430     default: ''
431     description: A custom IP address to put onto the NeutronPublicInterface.
432     type: string
433   NeutronPublicInterfaceRawDevice:
434     default: ''
435     description: If set, the public interface is a vlan with this device as the raw device.
436     type: string
437   PublicVirtualInterface:
438     default: 'br-ex'
439     description: >
440         Specifies the interface where the public-facing virtual ip will be assigned.
441         This should be int_public when a VLAN is being used.
442     type: string
443   SSLCertificate:
444     default: ''
445     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
446     type: string
447     hidden: true
448   SSLKey:
449     default: ''
450     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
451     type: string
452     hidden: true
453   SSLCACertificate:
454     default: ''
455     description: If set, the contents of an SSL certificate authority file.
456     type: string
457   SwiftHashSuffix:
458     default: unset
459     description: A random string to be used as a salt when hashing to determine mappings in the ring.
460     type: string
461     hidden: true
462   SwiftPassword:
463     default: unset
464     description: The password for the swift service account, used by the swift proxy services.
465     type: string
466     hidden: true
467   SwiftMountCheck:
468     default: 'false'
469     description: Value of mount_check in Swift account/container/object -server.conf
470     type: boolean
471   SwiftMinPartHours:
472     type: number
473     default: 1
474     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
475   SwiftPartPower:
476     default: 10
477     description: Partition Power to use when building Swift rings
478     type: number
479   SwiftReplicas:
480     type: number
481     default: 3
482     description: How many replicas to use in the swift rings.
483
484 # Compute-specific params
485   CeilometerComputeAgent:
486     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
487     type: string
488     default: ''
489     constraints:
490     - allowed_values: ['', Present]
491   ComputeCount:
492     type: number
493     default: 1
494   HypervisorNeutronPhysicalBridge:
495     default: 'br-ex'
496     description: >
497       An OVS bridge to create on each hypervisor. This defaults to br-ex the
498       same as the control plane nodes, as we have a uniform configuration of
499       the openvswitch agent. Typically should not need to be changed.
500     type: string
501   HypervisorNeutronPublicInterface:
502     default: nic1
503     description: What interface to add to the HypervisorNeutronPhysicalBridge.
504     type: string
505   NeutronNetworkVLANRanges:
506     default: 'datacentre'
507     description: >
508       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
509       Neutron documentation for permitted values. Defaults to permitting any
510       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
511     type: comma_delimited_list
512   NovaComputeDriver:
513     type: string
514     default: libvirt.LibvirtDriver
515   NovaComputeExtraConfig:
516     default: {}
517     description: |
518       NovaCompute specific configuration to inject into the cluster. Same
519       structure as ExtraConfig.
520     type: json
521   NovaComputeLibvirtType:
522     default: ''
523     type: string
524   NovaEnableRbdBackend:
525     default: false
526     description: Whether to enable or not the Rbd backend for Nova
527     type: boolean
528   NovaImage:
529     type: string
530     default: overcloud-compute
531     constraints:
532       - custom_constraint: glance.image
533   OvercloudComputeFlavor:
534     description: Use this flavor
535     type: string
536     constraints:
537       - custom_constraint: nova.flavor
538   ServiceNetMap:
539     default:
540       NeutronTenantNetwork: tenant
541       CeilometerApiNetwork: internal_api
542       MongoDbNetwork: internal_api
543       CinderApiNetwork: internal_api
544       CinderIscsiNetwork: storage
545       GlanceApiNetwork: storage
546       GlanceRegistryNetwork: internal_api
547       KeystoneAdminApiNetwork: internal_api
548       KeystonePublicApiNetwork: internal_api
549       NeutronApiNetwork: internal_api
550       HeatApiNetwork: internal_api
551       NovaApiNetwork: internal_api
552       NovaMetadataNetwork: internal_api
553       NovaVncProxyNetwork: internal_api
554       SwiftMgmtNetwork: storage_mgmt
555       SwiftProxyNetwork: storage
556       HorizonNetwork: internal_api
557       MemcachedNetwork: internal_api
558       RabbitMqNetwork: internal_api
559       RedisNetwork: internal_api
560       MysqlNetwork: internal_api
561       CephClusterNetwork: storage_mgmt
562       CephPublicNetwork: storage
563       ControllerHostnameResolveNetwork: internal_api
564       ComputeHostnameResolveNetwork: internal_api
565       BlockStorageHostnameResolveNetwork: internal_api
566       ObjectStorageHostnameResolveNetwork: internal_api
567       CephStorageHostnameResolveNetwork: storage
568     description: Mapping of service_name -> network name. Typically set
569                  via parameter_defaults in the resource registry.
570     type: json
571
572 # Block storage specific parameters
573   BlockStorageCount:
574     type: number
575     default: 0
576   BlockStorageImage:
577     default: overcloud-cinder-volume
578     type: string
579   OvercloudBlockStorageFlavor:
580     description: Flavor for block storage nodes to request when deploying.
581     type: string
582     constraints:
583       - custom_constraint: nova.flavor
584   BlockStorageExtraConfig:
585     default: {}
586     description: |
587       BlockStorage specific configuration to inject into the cluster. Same
588       structure as ExtraConfig.
589     type: json
590
591 # Object storage specific parameters
592   ObjectStorageCount:
593     type: number
594     default: 0
595   OvercloudSwiftStorageFlavor:
596     description: Flavor for Swift storage nodes to request when deploying.
597     type: string
598     constraints:
599       - custom_constraint: nova.flavor
600   SwiftStorageImage:
601     default: overcloud-swift-storage
602     type: string
603   ObjectStorageExtraConfig:
604     default: {}
605     description: |
606       ObjectStorage specific configuration to inject into the cluster. Same
607       structure as ExtraConfig.
608     type: json
609
610
611 # Ceph storage specific parameters
612   CephStorageCount:
613     type: number
614     default: 0
615   CephStorageImage:
616     default: overcloud-ceph-storage
617     type: string
618   OvercloudCephStorageFlavor:
619     default: baremetal
620     description: Flavor for Ceph storage nodes to request when deploying.
621     type: string
622     constraints:
623       - custom_constraint: nova.flavor
624   CephStorageExtraConfig:
625     default: {}
626     description: |
627       CephStorage specific configuration to inject into the cluster. Same
628       structure as ExtraConfig.
629     type: json
630
631   # Hostname format for each role
632   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
633   # and %stackname% is replaced with OS::stack_name in the template below.
634   # If you want to use the heat generated names, pass '' (empty string).
635   ControllerHostnameFormat:
636     type: string
637     description: Format for Controller node hostnames
638     default: '%stackname%-controller-%index%'
639   ComputeHostnameFormat:
640     type: string
641     description: Format for Compute node hostnames
642     default: '%stackname%-novacompute-%index%'
643   BlockStorageHostnameFormat:
644     type: string
645     description: Format for BlockStorage node hostnames
646     default: '%stackname%-blockstorage-%index%'
647   ObjectStorageHostnameFormat:
648     type: string
649     description: Format for SwiftStorage node hostnames
650     default: '%stackname%-objectstorage-%index%'
651   CephStorageHostnameFormat:
652     type: string
653     description: Format for CephStorage node hostnames
654     default: '%stackname%-cephstorage-%index%'
655
656   # Identifiers to trigger tasks on nodes
657   UpdateIdentifier:
658     default: ''
659     type: string
660     description: >
661       Setting to a previously unused value during stack-update will trigger
662       package update on all nodes
663
664   # If you want to remove a specific node from a resource group, you can pass
665   # the node name or id as a <Group>RemovalPolicies parameter, for example:
666   # ComputeRemovalPolicies: [{'resource_list': ['0']}]
667   ControllerRemovalPolicies:
668     default: []
669     type: json
670     description: >
671       List of resources to be removed from ControllerResourceGroup when
672       doing an update which requires removal of specific resources.
673   ComputeRemovalPolicies:
674     default: []
675     type: json
676     description: >
677       List of resources to be removed from ComputeResourceGroup when
678       doing an update which requires removal of specific resources.
679   BlockStorageRemovalPolicies:
680     default: []
681     type: json
682     description: >
683       List of resources to be removed from BlockStorageResourceGroup when
684       doing an update which requires removal of specific resources.
685   ObjectStorageRemovalPolicies:
686     default: []
687     type: json
688     description: >
689       List of resources to be removed from ObjectStorageResourceGroup when
690       doing an update which requires removal of specific resources.
691   CephStorageRemovalPolicies:
692     default: []
693     type: json
694     description: >
695       List of resources to be removed from CephStorageResourceGroup when
696       doing an update which requires removal of specific resources.
697
698
699 resources:
700
701   HeatAuthEncryptionKey:
702     type: OS::Heat::RandomString
703
704   PcsdPassword:
705     type: OS::Heat::RandomString
706     properties:
707       length: 16
708
709   HorizonSecret:
710     type: OS::Heat::RandomString
711     properties:
712       length: 10
713
714   Controller:
715     type: OS::Heat::ResourceGroup
716     depends_on: Networks
717     properties:
718       count: {get_param: ControllerCount}
719       removal_policies: {get_param: ControllerRemovalPolicies}
720       resource_def:
721         type: OS::TripleO::Controller
722         properties:
723           AdminPassword: {get_param: AdminPassword}
724           AdminToken: {get_param: AdminToken}
725           CeilometerBackend: {get_param: CeilometerBackend}
726           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
727           CeilometerPassword: {get_param: CeilometerPassword}
728           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
729           CinderNfsMountOptions: {get_param: CinderNfsMountOptions}
730           CinderNfsServers: {get_param: CinderNfsServers}
731           CinderPassword: {get_param: CinderPassword}
732           CinderISCSIHelper: {get_param: CinderISCSIHelper}
733           CinderEnableNfsBackend: {get_param: CinderEnableNfsBackend}
734           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
735           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
736           CloudName: {get_param: CloudName}
737           ControlVirtualInterface: {get_param: ControlVirtualInterface}
738           ControllerExtraConfig: {get_param: controllerExtraConfig}
739           Debug: {get_param: Debug}
740           EnableFencing: {get_param: EnableFencing}
741           EnableGalera: {get_param: EnableGalera}
742           EnableCephStorage: {get_param: ControllerEnableCephStorage}
743           EnableSwiftStorage: {get_param: ControllerEnableSwiftStorage}
744           ExtraConfig: {get_param: ExtraConfig}
745           FencingConfig: {get_param: FencingConfig}
746           Flavor: {get_param: OvercloudControlFlavor}
747           GlancePort: {get_param: GlancePort}
748           GlanceProtocol: {get_param: GlanceProtocol}
749           GlancePassword: {get_param: GlancePassword}
750           GlanceBackend: {get_param: GlanceBackend}
751           GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
752           GlanceLogFile: {get_param: GlanceLogFile}
753           HeatPassword: {get_param: HeatPassword}
754           HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
755           HeatAuthEncryptionKey: {get_resource: HeatAuthEncryptionKey}
756           HorizonSecret: {get_resource: HorizonSecret}
757           Image: {get_param: controllerImage}
758           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
759           KeyName: {get_param: KeyName}
760           KeystoneCACertificate: {get_param: KeystoneCACertificate}
761           KeystoneSigningCertificate: {get_param: KeystoneSigningCertificate}
762           KeystoneSigningKey: {get_param: KeystoneSigningKey}
763           KeystoneSSLCertificate: {get_param: KeystoneSSLCertificate}
764           KeystoneSSLCertificateKey: {get_param: KeystoneSSLCertificateKey}
765           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
766           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
767           MysqlMaxConnections: {get_param: MysqlMaxConnections}
768           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
769           NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
770           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
771           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
772           NeutronExternalNetworkBridge: {get_param: NeutronExternalNetworkBridge}
773           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
774           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
775           NeutronPublicInterface: {get_param: NeutronPublicInterface}
776           NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
777           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
778           NeutronPassword: {get_param: NeutronPassword}
779           NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
780           NeutronDVR: {get_param: NeutronDVR}
781           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
782           NeutronAgentMode: {get_param: NeutronAgentMode}
783           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
784           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
785           NeutronL3HA: {get_param: NeutronL3HA}
786           NeutronDhcpAgentsPerNetwork: {get_param: NeutronDhcpAgentsPerNetwork}
787           NeutronNetworkType: {get_param: NeutronNetworkType}
788           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
789           NovaPassword: {get_param: NovaPassword}
790           NtpServer: {get_param: NtpServer}
791           MongoDbNoJournal: {get_param: MongoDbNoJournal}
792           PcsdPassword: {get_resource: PcsdPassword}
793           PublicVirtualInterface: {get_param: PublicVirtualInterface}
794           RabbitPassword: {get_param: RabbitPassword}
795           RabbitUserName: {get_param: RabbitUserName}
796           RabbitCookie: {get_attr: [RabbitCookie, value]}
797           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
798           RabbitClientPort: {get_param: RabbitClientPort}
799           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
800           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
801           RedisVirtualIP: {get_attr: [RedisVirtualIP, ip_address]}
802           SSLCertificate: {get_param: SSLCertificate}
803           SSLKey: {get_param: SSLKey}
804           SSLCACertificate: {get_param: SSLCACertificate}
805           SwiftHashSuffix: {get_param: SwiftHashSuffix}
806           SwiftMountCheck: {get_param: SwiftMountCheck}
807           SwiftMinPartHours: {get_param: SwiftMinPartHours}
808           SwiftPartPower: {get_param: SwiftPartPower}
809           SwiftPassword: {get_param: SwiftPassword}
810           SwiftReplicas: { get_param: SwiftReplicas}
811           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
812           PublicVirtualIP: {get_attr: [PublicVirtualIP, ip_address]}
813           ServiceNetMap: {get_param: ServiceNetMap}
814           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
815           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
816           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
817           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
818           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
819           UpdateIdentifier: {get_param: UpdateIdentifier}
820           Hostname:
821             str_replace:
822               template: {get_param: ControllerHostnameFormat}
823               params:
824                 '%stackname%': {get_param: 'OS::stack_name'}
825
826   Compute:
827     type: OS::Heat::ResourceGroup
828     depends_on: Networks
829     properties:
830       count: {get_param: ComputeCount}
831       removal_policies: {get_param: ComputeRemovalPolicies}
832       resource_def:
833         type: OS::TripleO::Compute
834         properties:
835           AdminPassword: {get_param: AdminPassword}
836           CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
837           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
838           CeilometerPassword: {get_param: CeilometerPassword}
839           CinderEnableNfsBackend: {get_param: CinderEnableNfsBackend}
840           Debug: {get_param: Debug}
841           ExtraConfig: {get_param: ExtraConfig}
842           Flavor: {get_param: OvercloudComputeFlavor}
843           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
844           GlancePort: {get_param: GlancePort}
845           GlanceProtocol: {get_param: GlanceProtocol}
846           Image: {get_param: NovaImage}
847           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
848           KeyName: {get_param: KeyName}
849           KeystoneHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
850           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
851           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
852           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
853           NeutronHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
854           NeutronNetworkType: {get_param: NeutronNetworkType}
855           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
856           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
857           NeutronPassword: {get_param: NeutronPassword}
858           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
859           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
860           NeutronDVR: {get_param: NeutronDVR}
861           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
862           NeutronAgentMode: {get_param: NeutronComputeAgentMode}
863           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
864           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
865           # L3 HA and Failover is not relevant for Computes, should be removed
866           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
867           NeutronL3HA: {get_param: NeutronL3HA}
868           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
869           NovaComputeDriver: {get_param: NovaComputeDriver}
870           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
871           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
872           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
873           NovaPublicIP: {get_attr: [PublicVirtualIP, ip_address]}
874           NovaPassword: {get_param: NovaPassword}
875           NtpServer: {get_param: NtpServer}
876           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
877           RabbitPassword: {get_param: RabbitPassword}
878           RabbitUserName: {get_param: RabbitUserName}
879           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
880           RabbitClientPort: {get_param: RabbitClientPort}
881           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
882           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
883           ServiceNetMap: {get_param: ServiceNetMap}
884           UpdateIdentifier: {get_param: UpdateIdentifier}
885           Hostname:
886             str_replace:
887               template: {get_param: ComputeHostnameFormat}
888               params:
889                 '%stackname%': {get_param: 'OS::stack_name'}
890
891   BlockStorage:
892     type: OS::Heat::ResourceGroup
893     depends_on: Networks
894     properties:
895       count: {get_param: BlockStorageCount}
896       removal_policies: {get_param: BlockStorageRemovalPolicies}
897       resource_def:
898         type: OS::TripleO::BlockStorage
899         properties:
900           Debug: {get_param: Debug}
901           Image: {get_param: BlockStorageImage}
902           CinderISCSIHelper: {get_param: CinderISCSIHelper}
903           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
904           # Purpose of the dedicated BlockStorage nodes should be to use their local LVM
905           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
906           CinderPassword: {get_param: CinderPassword}
907           KeyName: {get_param: KeyName}
908           Flavor: {get_param: OvercloudBlockStorageFlavor}
909           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
910           GlancePort: {get_param: GlancePort}
911           GlanceProtocol: {get_param: GlanceProtocol}
912           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
913           RabbitPassword: {get_param: RabbitPassword}
914           RabbitUserName: {get_param: RabbitUserName}
915           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
916           RabbitClientPort: {get_param: RabbitClientPort}
917           NtpServer: {get_param: NtpServer}
918           UpdateIdentifier: {get_param: UpdateIdentifier}
919           Hostname:
920             str_replace:
921               template: {get_param: BlockStorageHostnameFormat}
922               params:
923                 '%stackname%': {get_param: 'OS::stack_name'}
924           ServiceNetMap: {get_param: ServiceNetMap}
925           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
926           ExtraConfig: {get_param: ExtraConfig}
927           BlockStorageExtraConfig: {get_param: BlockStorageExtraConfig}
928
929   ObjectStorage:
930     type: OS::Heat::ResourceGroup
931     depends_on: Networks
932     properties:
933       count: {get_param: ObjectStorageCount}
934       removal_policies: {get_param: ObjectStorageRemovalPolicies}
935       resource_def:
936         type: OS::TripleO::ObjectStorage
937         properties:
938           KeyName: {get_param: KeyName}
939           Flavor: {get_param: OvercloudSwiftStorageFlavor}
940           HashSuffix: {get_param: SwiftHashSuffix}
941           MountCheck: {get_param: SwiftMountCheck}
942           MinPartHours: {get_param: SwiftMinPartHours}
943           PartPower: {get_param: SwiftPartPower}
944           Image: {get_param: SwiftStorageImage}
945           Replicas: { get_param: SwiftReplicas}
946           NtpServer: {get_param: NtpServer}
947           UpdateIdentifier: {get_param: UpdateIdentifier}
948           ServiceNetMap: {get_param: ServiceNetMap}
949           Hostname:
950             str_replace:
951               template: {get_param: ObjectStorageHostnameFormat}
952               params:
953                 '%stackname%': {get_param: 'OS::stack_name'}
954           ExtraConfig: {get_param: ExtraConfig}
955           ObjectStorageExtraConfig: {get_param: ObjectStorageExtraConfig}
956
957   CephStorage:
958     type: OS::Heat::ResourceGroup
959     depends_on: Networks
960     properties:
961       count: {get_param: CephStorageCount}
962       removal_policies: {get_param: CephStorageRemovalPolicies}
963       resource_def:
964         type: OS::TripleO::CephStorage
965         properties:
966           Image: {get_param: CephStorageImage}
967           KeyName: {get_param: KeyName}
968           Flavor: {get_param: OvercloudCephStorageFlavor}
969           NtpServer: {get_param: NtpServer}
970           ServiceNetMap: {get_param: ServiceNetMap}
971           UpdateIdentifier: {get_param: UpdateIdentifier}
972           Hostname:
973             str_replace:
974               template: {get_param: CephStorageHostnameFormat}
975               params:
976                 '%stackname%': {get_param: 'OS::stack_name'}
977           ExtraConfig: {get_param: ExtraConfig}
978           CephStorageExtraConfig: {get_param: CephStorageExtraConfig}
979
980   ControllerIpListMap:
981     type: OS::TripleO::Network::Ports::NetIpListMap
982     properties:
983       ExternalIpList: {get_attr: [Controller, external_ip_address]}
984       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
985       StorageIpList: {get_attr: [Controller, storage_ip_address]}
986       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
987       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
988
989   allNodesConfig:
990     type: OS::TripleO::AllNodes::SoftwareConfig
991     properties:
992       compute_hosts: {get_attr: [Compute, hosts_entry]}
993       controller_hosts: {get_attr: [Controller, hosts_entry]}
994       controller_ips: {get_attr: [Controller, ip_address]}
995       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
996       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
997       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
998       controller_names: {get_attr: [Controller, hostname]}
999       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1000       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
1001       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
1002       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
1003       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1004       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1005       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1006       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1007       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1008       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1009       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1010       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1011       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1012       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1013       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1014       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1015       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1016
1017   MysqlRootPassword:
1018     type: OS::Heat::RandomString
1019     properties:
1020       length: 10
1021
1022   MysqlClusterUniquePart:
1023     type: OS::Heat::RandomString
1024     properties:
1025       length: 10
1026
1027   RabbitCookie:
1028     type: OS::Heat::RandomString
1029     properties:
1030       length: 20
1031       salt: {get_param: RabbitCookieSalt}
1032
1033   # creates the network architecture
1034   Networks:
1035     type: OS::TripleO::Network
1036
1037   ControlVirtualIP:
1038     type: OS::Neutron::Port
1039     depends_on: Networks
1040     properties:
1041       name: control_virtual_ip
1042       network_id: {get_param: NeutronControlPlaneID}
1043       fixed_ips: {get_param: ControlFixedIPs}
1044       replacement_policy: AUTO
1045
1046   RedisVirtualIP:
1047     depends_on: Networks
1048     type: OS::TripleO::Controller::Ports::RedisVipPort
1049     properties:
1050       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1051       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
1052       PortName: redis_virtual_ip
1053       NetworkName: {get_param: [ServiceNetMap, RedisNetwork]}
1054
1055   # The public VIP is on the External net, falls back to ctlplane
1056   PublicVirtualIP:
1057     depends_on: Networks
1058     type: OS::TripleO::Controller::Ports::ExternalPort
1059     properties:
1060       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1061       ControlPlaneNetwork: {get_param: NeutronControlPlaneID}
1062       PortName: public_virtual_ip
1063       FixedIPs: {get_param: PublicVirtualFixedIPs}
1064
1065   InternalApiVirtualIP:
1066     depends_on: Networks
1067     type: OS::TripleO::Controller::Ports::InternalApiPort
1068     properties:
1069       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1070       PortName: internal_api_virtual_ip
1071
1072   StorageVirtualIP:
1073     depends_on: Networks
1074     type: OS::TripleO::Controller::Ports::StoragePort
1075     properties:
1076       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1077       PortName: storage_virtual_ip
1078
1079   StorageMgmtVirtualIP:
1080     depends_on: Networks
1081     type: OS::TripleO::Controller::Ports::StorageMgmtPort
1082     properties:
1083       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1084       PortName: storage_management_virtual_ip
1085
1086   VipMap:
1087     type: OS::TripleO::Network::Ports::NetIpMap
1088     properties:
1089       ExternalIp: {get_attr: [PublicVirtualIP, ip_address]}
1090       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
1091       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
1092       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1093       # No tenant VIP required
1094
1095   VipConfig:
1096     type: OS::TripleO::VipConfig
1097
1098   VipDeployment:
1099     type: OS::Heat::StructuredDeployments
1100     properties:
1101       config: {get_resource: VipConfig}
1102       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1103       input_values:
1104         # service VIP mappings
1105         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
1106         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1107         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1108         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1109         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1110         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
1111         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
1112         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1113         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
1114         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1115         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1116         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
1117         redis_vip: {get_attr: [RedisVirtualIP, ip_address]}
1118         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
1119         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
1120         # direct configuration of Virtual IPs for each network
1121         control_virtual_ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
1122         public_virtual_ip: {get_attr: [PublicVirtualIP, ip_address]}
1123         internal_api_virtual_ip: {get_attr: [InternalApiVirtualIP, ip_address]}
1124         storage_virtual_ip: {get_attr: [StorageVirtualIP, ip_address]}
1125         storage_mgmt_virtual_ip: {get_attr: [StorageMgmtVirtualIP, ip_address]}
1126
1127   ControllerBootstrapNodeConfig:
1128     type: OS::TripleO::BootstrapNode::SoftwareConfig
1129     properties:
1130       bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
1131       bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
1132
1133   ControllerBootstrapNodeDeployment:
1134     type: OS::Heat::StructuredDeployments
1135     properties:
1136       config: {get_attr: [ControllerBootstrapNodeConfig, config_id]}
1137       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1138
1139   ControllerSwiftDeployment:
1140     type: OS::Heat::StructuredDeployments
1141     properties:
1142       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1143       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1144
1145   ObjectStorageSwiftDeployment:
1146     type: OS::Heat::StructuredDeployments
1147     properties:
1148       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1149       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1150
1151   SwiftDevicesAndProxyConfig:
1152     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1153     properties:
1154       controller_swift_devices: {get_attr: [Controller, swift_device]}
1155       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1156       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1157
1158   ComputeCephDeployment:
1159     type: OS::Heat::StructuredDeployments
1160     properties:
1161       config: {get_attr: [CephClusterConfig, config_id]}
1162       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1163
1164   ControllerCephDeployment:
1165     type: OS::Heat::StructuredDeployments
1166     properties:
1167       config: {get_attr: [CephClusterConfig, config_id]}
1168       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1169
1170   CephStorageCephDeployment:
1171     type: OS::Heat::StructuredDeployments
1172     properties:
1173       config: {get_attr: [CephClusterConfig, config_id]}
1174       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1175
1176   CephClusterConfig:
1177     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1178     properties:
1179       ceph_storage_count: {get_param: CephStorageCount}
1180       ceph_fsid: {get_param: CephClusterFSID}
1181       ceph_mon_key: {get_param: CephMonKey}
1182       ceph_admin_key: {get_param: CephAdminKey}
1183       ceph_client_key: {get_param: CephClientKey}
1184       ceph_external_mon_ips: {get_param: CephExternalMonHost}
1185       ceph_mon_names: {get_attr: [Controller, hostname]}
1186       ceph_mon_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1187
1188   ControllerClusterConfig:
1189     type: OS::Heat::StructuredConfig
1190     properties:
1191       group: os-apply-config
1192       config:
1193         corosync:
1194           nodes: {get_attr: [Controller, corosync_node]}
1195         horizon:
1196           caches:
1197             memcached:
1198               nodes: {get_attr: [Controller, hostname]}
1199         mysql:
1200           nodes: {get_attr: [Controller, corosync_node]}
1201         haproxy:
1202           nodes: {get_attr: [Controller, corosync_node]}
1203
1204   ControllerClusterDeployment:
1205     type: OS::Heat::StructuredDeployments
1206     properties:
1207       config: {get_resource: ControllerClusterConfig}
1208       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1209
1210   ControllerAllNodesDeployment:
1211     type: OS::Heat::StructuredDeployments
1212     properties:
1213       config: {get_attr: [allNodesConfig, config_id]}
1214       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1215
1216   ComputeAllNodesDeployment:
1217     type: OS::Heat::StructuredDeployments
1218     properties:
1219       config: {get_attr: [allNodesConfig, config_id]}
1220       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1221
1222   BlockStorageAllNodesDeployment:
1223     type: OS::Heat::StructuredDeployments
1224     properties:
1225       config: {get_attr: [allNodesConfig, config_id]}
1226       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1227
1228   ObjectStorageAllNodesDeployment:
1229     type: OS::Heat::StructuredDeployments
1230     properties:
1231       config: {get_attr: [allNodesConfig, config_id]}
1232       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1233
1234   CephStorageAllNodesDeployment:
1235     type: OS::Heat::StructuredDeployments
1236     properties:
1237       config: {get_attr: [allNodesConfig, config_id]}
1238       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1239
1240   # Nested stack deployment runs after all other controller deployments
1241   ControllerNodesPostDeployment:
1242     type: OS::TripleO::ControllerPostDeployment
1243     depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1244     properties:
1245       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1246       NodeConfigIdentifiers: {get_attr: [Controller, attributes, config_identifier]}
1247
1248   ComputeNodesPostDeployment:
1249     type: OS::TripleO::ComputePostDeployment
1250     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1251     properties:
1252       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1253       NodeConfigIdentifiers: {get_attr: [Compute, attributes, config_identifier]}
1254
1255   ObjectStorageNodesPostDeployment:
1256     type: OS::TripleO::ObjectStoragePostDeployment
1257     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1258     properties:
1259       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1260       NodeConfigIdentifiers: {get_attr: [ObjectStorage, attributes, config_identifier]}
1261
1262
1263   BlockStorageNodesPostDeployment:
1264     type: OS::TripleO::BlockStoragePostDeployment
1265     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1266     properties:
1267       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1268       NodeConfigIdentifiers: {get_attr: [BlockStorage, attributes, config_identifier]}
1269
1270   CephStorageNodesPostDeployment:
1271     type: OS::TripleO::CephStoragePostDeployment
1272     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1273     properties:
1274       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1275       NodeConfigIdentifiers: {get_attr: [CephStorage, attributes, config_identifier]}
1276
1277 outputs:
1278   KeystoneURL:
1279     description: URL for the Overcloud Keystone service
1280     value:
1281       list_join:
1282       - ''
1283       - - http://
1284         - {get_attr: [PublicVirtualIP, ip_address]}
1285         - :5000/v2.0/
1286   PublicVip:
1287     description: Controller VIP for public API endpoints
1288     value: {get_attr: [PublicVirtualIP, ip_address]}
1289   CeilometerInternalVip:
1290     description: VIP for Ceilometer API internal endpoint
1291     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
1292   CinderInternalVip:
1293     description: VIP for Cinder API internal endpoint
1294     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
1295   GlanceInternalVip:
1296     description: VIP for Glance API internal endpoint
1297     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
1298   HeatInternalVip:
1299     description: VIP for Heat API internal endpoint
1300     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
1301   KeystoneInternalVip:
1302     description: VIP for Keystone API internal endpoint
1303     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
1304   NeutronInternalVip:
1305     description: VIP for Neutron API internal endpoint
1306     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
1307   NovaInternalVip:
1308     description: VIP for Nova API internal endpoint
1309     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
1310   SwiftInternalVip:
1311     description: VIP for Swift Proxy internal endpoint
1312     value: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}