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