Merge "Fix allocation pool in external.yaml"
[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   CinderEnableIscsiBackend:
46     default: true
47     description: Whether to enable or not the Iscsi backend for Cinder
48     type: boolean
49   CloudName:
50     default: ''
51     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
52     type: string
53   ControlFixedIPs:
54     default: []
55     description: Should be used for arbitrary ips.
56     type: json
57   Debug:
58     default: ''
59     description: Set to True to enable debugging on all services.
60     type: string
61   DefaultSignalTransport:
62     default: CFN_SIGNAL
63     description: Transport to use for software-config signals.
64     type: string
65     constraints:
66       - allowed_values: [ CFN_SIGNAL, HEAT_SIGNAL, NO_SIGNAL ]
67   GlancePort:
68     default: "9292"
69     description: Glance port.
70     type: string
71   GlanceProtocol:
72     default: http
73     description: Protocol to use when connecting to glance, set to https for SSL.
74     type: string
75   ImageUpdatePolicy:
76     default: 'REBUILD_PRESERVE_EPHEMERAL'
77     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
78     type: string
79   KeyName:
80     default: default
81     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
82     type: string
83     constraints:
84       - custom_constraint: nova.keypair
85   NeutronBridgeMappings:
86     description: >
87       The OVS logical->physical bridge mappings to use. See the Neutron
88       documentation for details. Defaults to mapping br-ex - the external
89       bridge on hosts - to a physical name 'datacentre' which can be used
90       to create provider networks (and we use this for the default floating
91       network) - if changing this either use different post-install network
92       scripts or be sure to keep 'datacentre' as a mapping network name.
93     type: string
94     default: "datacentre:br-ex"
95   NeutronControlPlaneID:
96     default: ''
97     type: string
98     description: Neutron ID for ctlplane network.
99   NeutronEnableTunnelling:
100     type: string
101     default: "True"
102   NeutronFlatNetworks:
103     type: string
104     default: 'datacentre'
105     description: >
106       If set, flat networks to configure in neutron plugins. Defaults to
107       'datacentre' to permit external network creation.
108   NeutronNetworkType:
109     default: 'gre'
110     description: The tenant network type for Neutron, either gre or vxlan.
111     type: string
112   NeutronPassword:
113     default: unset
114     description: The password for the neutron service account, used by neutron agents.
115     type: string
116     hidden: true
117   NeutronPublicInterface:
118     default: nic1
119     description: What interface to bridge onto br-ex for network nodes.
120     type: string
121   NeutronPublicInterfaceTag:
122     default: ''
123     description: >
124       VLAN tag for creating a public VLAN. The tag will be used to
125       create an access port on the exterior bridge for each control plane node,
126       and that port will be given the IP address returned by neutron from the
127       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
128       overcloud.yaml to include the deployment of VLAN ports to the control
129       plane.
130     type: string
131   NeutronComputeAgentMode:
132     default: 'dvr'
133     description: Agent mode for the neutron-l3-agent on the compute hosts
134     type: string
135   NeutronAgentMode:
136     default: 'dvr_snat'
137     description: Agent mode for the neutron-l3-agent on the controller hosts
138     type: string
139   NeutronDVR:
140     default: 'False'
141     description: Whether to configure Neutron Distributed Virtual Routers
142     type: string
143   NeutronMetadataProxySharedSecret:
144     default: 'unset'
145     description: Shared secret to prevent spoofing
146     type: string
147   NeutronTunnelTypes:
148     default: 'gre'
149     description: |
150         The tunnel types for the Neutron tenant network. To specify multiple
151         values, use a comma separated string, like so: 'gre,vxlan'
152     type: string
153   NeutronMechanismDrivers:
154     default: 'openvswitch'
155     description: |
156         The mechanism drivers for the Neutron tenant network. To specify multiple
157         values, use a comma separated string, like so: 'openvswitch,l2_population'
158     type: string
159   NeutronAllowL3AgentFailover:
160     default: 'True'
161     description: Allow automatic l3-agent failover
162     type: string
163   NeutronL3HA:
164     default: 'False'
165     description: Whether to enable l3-agent HA
166     type: string
167   NovaPassword:
168     default: unset
169     description: The password for the nova service account, used by nova-api.
170     type: string
171     hidden: true
172   NtpServer:
173     type: string
174     default: ''
175   PublicVirtualFixedIPs:
176     default: []
177     description: >
178         Control the IP allocation for the PublicVirtualInterface port. E.g.
179         [{'ip_address':'1.2.3.4'}]
180     type: json
181   PublicVirtualNetwork:
182     default: 'ctlplane'
183     type: string
184     description: >
185         Neutron network to allocate public virtual IP port on.
186   RabbitCookieSalt:
187     type: string
188     default: unset
189     description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
190   # FIXME: 'guest' is provisioned in RabbitMQ by default, we should create a user if these are changed
191   RabbitUserName:
192     default: guest
193     description: The username for RabbitMQ
194     type: string
195   RabbitPassword:
196     default: guest
197     description: The password for RabbitMQ
198     type: string
199     hidden: true
200   RabbitClientUseSSL:
201     default: false
202     description: >
203         Rabbit client subscriber parameter to specify
204         an SSL connection to the RabbitMQ host.
205     type: string
206   RabbitClientPort:
207     default: 5672
208     description: Set rabbit subscriber port, change this if using SSL
209     type: number
210   SnmpdReadonlyUserName:
211     default: ro_snmp_user
212     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
213     type: string
214   SnmpdReadonlyUserPassword:
215     default: unset
216     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
217     type: string
218     hidden: true
219
220   # Controller-specific params
221   AdminToken:
222     default: unset
223     description: The keystone auth secret.
224     type: string
225     hidden: true
226   CinderEnableRbdBackend:
227     default: false
228     description: Whether to enable or not the Rbd backend for Cinder
229     type: boolean
230   CinderLVMLoopDeviceSize:
231     default: 5000
232     description: The size of the loopback file used by the cinder LVM driver.
233     type: number
234   CinderPassword:
235     default: unset
236     description: The password for the cinder service account, used by cinder-api.
237     type: string
238     hidden: true
239   CinderISCSIHelper:
240     default: tgtadm
241     description: The iSCSI helper to use with cinder.
242     type: string
243   ControllerCount:
244     type: number
245     default: 1
246   controllerExtraConfig:
247     default: {}
248     description: |
249       Controller specific configuration to inject into the cluster. Same
250       structure as ExtraConfig.
251     type: json
252   controllerImage:
253     type: string
254     default: overcloud-control
255     constraints:
256       - custom_constraint: glance.image
257   OvercloudControlFlavor:
258     description: Flavor for control nodes to request when deploying.
259     type: string
260     constraints:
261       - custom_constraint: nova.flavor
262   ControlVirtualInterface:
263     default: 'br-ex'
264     description: Interface where virtual ip will be assigned.
265     type: string
266   EnableGalera:
267     default: true
268     description: Whether to use Galera instead of regular MariaDB.
269     type: boolean
270   ControllerEnableCephStorage:
271     default: false
272     description: Whether to deploy Ceph Storage (OSD) on the Controller
273     type: boolean
274   ControllerEnableSwiftStorage:
275     default: true
276     description: Whether to enable Swift Storage on the Controller
277     type: boolean
278   ExtraConfig:
279     default: {}
280     description: |
281       Additional configuration to inject into the cluster. The JSON should have
282       the following structure:
283         {"FILEKEY":
284           {"config":
285             [{"section": "SECTIONNAME",
286               "values":
287                 [{"option": "OPTIONNAME",
288                   "value": "VALUENAME"
289                  }
290                 ]
291              }
292             ]
293           }
294         }
295       For instance:
296         {"nova":
297           {"config":
298             [{"section": "default",
299               "values":
300                 [{"option": "force_config_drive",
301                   "value": "always"
302                  }
303                 ]
304              },
305              {"section": "cells",
306               "values":
307                 [{"option": "driver",
308                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
309                  }
310                 ]
311              }
312             ]
313           }
314         }
315     type: json
316   GlanceLogFile:
317     description: The filepath of the file to use for logging messages from Glance.
318     type: string
319     default: ''
320   GlanceNotifierStrategy:
321     description: Strategy to use for Glance notification queue
322     type: string
323     default: noop
324   GlancePassword:
325     default: unset
326     description: The password for the glance service account, used by the glance services.
327     type: string
328     hidden: true
329   GlanceBackend:
330     default: swift
331     description: The short name of the Glance backend to use. Should be one
332       of swift, rbd or file
333     type: string
334     constraints:
335     - allowed_values: ['swift', 'file', 'rbd']
336   HeatPassword:
337     default: unset
338     description: The password for the Heat service account, used by the Heat services.
339     type: string
340     hidden: true
341   HeatStackDomainAdminPassword:
342     description: Password for heat_domain_admin user.
343     type: string
344     default: ''
345     hidden: true
346   KeystoneCACertificate:
347     default: ''
348     description: Keystone self-signed certificate authority certificate.
349     type: string
350   KeystoneSigningCertificate:
351     default: ''
352     description: Keystone certificate for verifying token validity.
353     type: string
354   KeystoneSigningKey:
355     default: ''
356     description: Keystone key for signing tokens.
357     type: string
358     hidden: true
359   KeystoneSSLCertificate:
360     default: ''
361     description: Keystone certificate for verifying token validity.
362     type: string
363   KeystoneSSLCertificateKey:
364     default: ''
365     description: Keystone key for signing tokens.
366     type: string
367     hidden: true
368   MysqlInnodbBufferPoolSize:
369     description: >
370         Specifies the size of the buffer pool in megabytes. Setting to
371         zero should be interpreted as "no value" and will defer to the
372         lower level default.
373     type: number
374     default: 0
375   NeutronDnsmasqOptions:
376     default: 'dhcp-option-force=26,1400'
377     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
378     type: string
379   NeutronPublicInterfaceDefaultRoute:
380     default: ''
381     description: A custom default route for the NeutronPublicInterface.
382     type: string
383   NeutronPublicInterfaceIP:
384     default: ''
385     description: A custom IP address to put onto the NeutronPublicInterface.
386     type: string
387   NeutronPublicInterfaceRawDevice:
388     default: ''
389     description: If set, the public interface is a vlan with this device as the raw device.
390     type: string
391   PublicVirtualInterface:
392     default: 'br-ex'
393     description: >
394         Specifies the interface where the public-facing virtual ip will be assigned.
395         This should be int_public when a VLAN is being used.
396     type: string
397   RedisVirtualIP:
398     type: string
399     default: ''  # Has to be here because of the ignored empty value bug
400   SSLCertificate:
401     default: ''
402     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
403     type: string
404     hidden: true
405   SSLKey:
406     default: ''
407     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
408     type: string
409     hidden: true
410   SSLCACertificate:
411     default: ''
412     description: If set, the contents of an SSL certificate authority file.
413     type: string
414   SwiftHashSuffix:
415     default: unset
416     description: A random string to be used as a salt when hashing to determine mappings in the ring.
417     type: string
418     hidden: true
419   SwiftPassword:
420     default: unset
421     description: The password for the swift service account, used by the swift proxy services.
422     type: string
423     hidden: true
424   SwiftMountCheck:
425     default: 'false'
426     description: Value of mount_check in Swift account/container/object -server.conf
427     type: boolean
428   SwiftMinPartHours:
429     type: number
430     default: 1
431     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
432   SwiftPartPower:
433     default: 10
434     description: Partition Power to use when building Swift rings
435     type: number
436   SwiftReplicas:
437     type: number
438     default: 3
439     description: How many replicas to use in the swift rings.
440
441 # Compute-specific params
442   CeilometerComputeAgent:
443     description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
444     type: string
445     default: ''
446     constraints:
447     - allowed_values: ['', Present]
448   ComputeCount:
449     type: number
450     default: 1
451   HypervisorNeutronPhysicalBridge:
452     default: 'br-ex'
453     description: >
454       An OVS bridge to create on each hypervisor. This defaults to br-ex the
455       same as the control plane nodes, as we have a uniform configuration of
456       the openvswitch agent. Typically should not need to be changed.
457     type: string
458   HypervisorNeutronPublicInterface:
459     default: nic1
460     description: What interface to add to the HypervisorNeutronPhysicalBridge.
461     type: string
462   NeutronNetworkVLANRanges:
463     default: 'datacentre'
464     description: >
465       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
466       Neutron documentation for permitted values. Defaults to permitting any
467       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
468     type: comma_delimited_list
469   NovaComputeDriver:
470     type: string
471     default: libvirt.LibvirtDriver
472   NovaComputeExtraConfig:
473     default: {}
474     description: |
475       NovaCompute specific configuration to inject into the cluster. Same
476       structure as ExtraConfig.
477     type: json
478   NovaComputeLibvirtType:
479     default: ''
480     type: string
481   NovaEnableRbdBackend:
482     default: false
483     description: Whether to enable or not the Rbd backend for Nova
484     type: boolean
485   NovaImage:
486     type: string
487     default: overcloud-compute
488     constraints:
489       - custom_constraint: glance.image
490   OvercloudComputeFlavor:
491     description: Use this flavor
492     type: string
493     constraints:
494       - custom_constraint: nova.flavor
495   ServiceNetMap:
496     default:
497       NeutronLocalIp: tenant
498       CeilometerApiNetwork: internal_api
499       MongoDbNetwork: internal_api
500       CinderApiNetwork: internal_api
501       CinderIscsiNetwork: storage
502       GlanceApiNetwork: storage
503       GlanceRegistryNetwork: internal_api
504       KeystoneAdminApiNetwork: internal_api
505       KeystonePublicApiNetwork: internal_api
506       NeutronApiNetwork: internal_api
507       HeatApiNetwork: internal_api
508       NovaApiNetwork: internal_api
509       NovaMetadataNetwork: internal_api
510       NovaVncProxyNetwork: internal_api
511       SwiftMgmtNetwork: storage_mgmt
512       SwiftProxyNetwork: storage
513       HorizonNetwork: internal_api
514       MemcachedNetwork: internal_api
515       RabbitMqNetwork: internal_api
516       RedisNetwork: internal_api
517       MysqlNetwork: internal_api
518       CephClusterNetwork: storage_mgmt
519       CephPublicNetwork: storage
520     description: Mapping of service_name -> network name. Typically set
521                  via parameter_defaults in the resource registry.
522     type: json
523
524 # Block storage specific parameters
525   BlockStorageCount:
526     type: number
527     default: 0
528   BlockStorageImage:
529     default: overcloud-cinder-volume
530     type: string
531   OvercloudBlockStorageFlavor:
532     description: Flavor for block storage nodes to request when deploying.
533     type: string
534     constraints:
535       - custom_constraint: nova.flavor
536
537 # Object storage specific parameters
538   ObjectStorageCount:
539     type: number
540     default: 0
541   OvercloudSwiftStorageFlavor:
542     description: Flavor for Swift storage nodes to request when deploying.
543     type: string
544     constraints:
545       - custom_constraint: nova.flavor
546   SwiftStorageImage:
547     default: overcloud-swift-storage
548     type: string
549
550 # Ceph storage specific parameters
551   CephStorageCount:
552     type: number
553     default: 0
554   CephStorageImage:
555     default: overcloud-ceph-storage
556     type: string
557   OvercloudCephStorageFlavor:
558     default: baremetal
559     description: Flavor for Ceph storage nodes to request when deploying.
560     type: string
561     constraints:
562       - custom_constraint: nova.flavor
563
564   # Hostname format for each role
565   # Note %index% is translated into the index of the node, e.g 0/1/2 etc
566   # and %stackname% is replaced with OS::stack_name in the template below.
567   # If you want to use the heat generated names, pass '' (empty string).
568   ControllerHostnameFormat:
569     type: string
570     description: Format for Controller node hostnames
571     default: '%stackname%-controller-%index%'
572   ComputeHostnameFormat:
573     type: string
574     description: Format for Compute node hostnames
575     default: '%stackname%-novacompute-%index%'
576   BlockStorageHostnameFormat:
577     type: string
578     description: Format for BlockStorage node hostnames
579     default: '%stackname%-blockstorage-%index%'
580   ObjectStorageHostnameFormat:
581     type: string
582     description: Format for SwiftStorage node hostnames
583     default: '%stackname%-objectstorage-%index%'
584   CephStorageHostnameFormat:
585     type: string
586     description: Format for CephStorage node hostnames
587     default: '%stackname%-cephstorage-%index%'
588
589   # Identifiers to trigger tasks on nodes
590   UpdateIdentifier:
591     default: ''
592     type: string
593     description: >
594       Setting to a previously unused value during stack-update will trigger
595       package update on all nodes
596
597
598
599 resources:
600
601   HeatAuthEncryptionKey:
602     type: OS::Heat::RandomString
603
604   PcsdPassword:
605     type: OS::Heat::RandomString
606     properties:
607       length: 16
608
609   HorizonSecret:
610     type: OS::Heat::RandomString
611     properties:
612       length: 10
613
614   Controller:
615     type: OS::Heat::ResourceGroup
616     depends_on: Networks
617     properties:
618       count: {get_param: ControllerCount}
619       resource_def:
620         type: OS::TripleO::Controller
621         properties:
622           AdminPassword: {get_param: AdminPassword}
623           AdminToken: {get_param: AdminToken}
624           CeilometerBackend: {get_param: CeilometerBackend}
625           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
626           CeilometerPassword: {get_param: CeilometerPassword}
627           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
628           CinderPassword: {get_param: CinderPassword}
629           CinderISCSIHelper: {get_param: CinderISCSIHelper}
630           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
631           CinderEnableRbdBackend: {get_param: CinderEnableRbdBackend}
632           CloudName: {get_param: CloudName}
633           ControlVirtualInterface: {get_param: ControlVirtualInterface}
634           ControllerExtraConfig: {get_param: controllerExtraConfig}
635           Debug: {get_param: Debug}
636           EnableGalera: {get_param: EnableGalera}
637           EnableCephStorage: {get_param: ControllerEnableCephStorage}
638           EnableSwiftStorage: {get_param: ControllerEnableSwiftStorage}
639           ExtraConfig: {get_param: ExtraConfig}
640           Flavor: {get_param: OvercloudControlFlavor}
641           GlancePort: {get_param: GlancePort}
642           GlanceProtocol: {get_param: GlanceProtocol}
643           GlancePassword: {get_param: GlancePassword}
644           GlanceBackend: {get_param: GlanceBackend}
645           GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
646           GlanceLogFile: {get_param: GlanceLogFile}
647           HeatPassword: {get_param: HeatPassword}
648           HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
649           HeatAuthEncryptionKey: {get_resource: HeatAuthEncryptionKey}
650           HorizonSecret: {get_resource: HorizonSecret}
651           Image: {get_param: controllerImage}
652           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
653           KeyName: {get_param: KeyName}
654           KeystoneCACertificate: {get_param: KeystoneCACertificate}
655           KeystoneSigningCertificate: {get_param: KeystoneSigningCertificate}
656           KeystoneSigningKey: {get_param: KeystoneSigningKey}
657           KeystoneSSLCertificate: {get_param: KeystoneSSLCertificate}
658           KeystoneSSLCertificateKey: {get_param: KeystoneSSLCertificateKey}
659           MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
660           MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
661           MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
662           NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
663           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
664           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
665           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
666           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
667           NeutronPublicInterface: {get_param: NeutronPublicInterface}
668           NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
669           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
670           NeutronPassword: {get_param: NeutronPassword}
671           NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
672           NeutronDVR: {get_param: NeutronDVR}
673           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
674           NeutronAgentMode: {get_param: NeutronAgentMode}
675           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
676           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
677           NeutronL3HA: {get_param: NeutronL3HA}
678           NeutronNetworkType: {get_param: NeutronNetworkType}
679           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
680           NovaPassword: {get_param: NovaPassword}
681           NtpServer: {get_param: NtpServer}
682           PcsdPassword: {get_resource: PcsdPassword}
683           PublicVirtualInterface: {get_param: PublicVirtualInterface}
684           RabbitPassword: {get_param: RabbitPassword}
685           RabbitUserName: {get_param: RabbitUserName}
686           RabbitCookie: {get_attr: [RabbitCookie, value]}
687           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
688           RabbitClientPort: {get_param: RabbitClientPort}
689           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
690           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
691           RedisVirtualIP: {get_param: RedisVirtualIP}
692           SSLCertificate: {get_param: SSLCertificate}
693           SSLKey: {get_param: SSLKey}
694           SSLCACertificate: {get_param: SSLCACertificate}
695           SwiftHashSuffix: {get_param: SwiftHashSuffix}
696           SwiftMountCheck: {get_param: SwiftMountCheck}
697           SwiftMinPartHours: {get_param: SwiftMinPartHours}
698           SwiftPartPower: {get_param: SwiftPartPower}
699           SwiftPassword: {get_param: SwiftPassword}
700           SwiftReplicas: { get_param: SwiftReplicas}
701           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
702           PublicVirtualIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]} # deprecated. Use per service VIP settings instead now.
703           ServiceNetMap: {get_param: ServiceNetMap}
704           HeatApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
705           GlanceApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
706           MysqlVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
707           KeystonePublicApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
708           NeutronApiVirtualIP: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
709           UpdateIdentifier: {get_param: UpdateIdentifier}
710           Hostname:
711             str_replace:
712               template: {get_param: ControllerHostnameFormat}
713               params:
714                 '%stackname%': {get_param: 'OS::stack_name'}
715
716   Compute:
717     type: OS::Heat::ResourceGroup
718     depends_on: Networks
719     properties:
720       count: {get_param: ComputeCount}
721       resource_def:
722         type: OS::TripleO::Compute
723         properties:
724           AdminPassword: {get_param: AdminPassword}
725           CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
726           CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
727           CeilometerPassword: {get_param: CeilometerPassword}
728           Debug: {get_param: Debug}
729           ExtraConfig: {get_param: ExtraConfig}
730           Flavor: {get_param: OvercloudComputeFlavor}
731           GlanceHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
732           GlancePort: {get_param: GlancePort}
733           GlanceProtocol: {get_param: GlanceProtocol}
734           Image: {get_param: NovaImage}
735           ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
736           KeyName: {get_param: KeyName}
737           KeystoneHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
738           NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
739           NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
740           NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
741           NeutronHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
742           NeutronNetworkType: {get_param: NeutronNetworkType}
743           NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
744           NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
745           NeutronPassword: {get_param: NeutronPassword}
746           NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
747           NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
748           NeutronDVR: {get_param: NeutronDVR}
749           NeutronMetadataProxySharedSecret: {get_param: NeutronMetadataProxySharedSecret}
750           NeutronAgentMode: {get_param: NeutronComputeAgentMode}
751           NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
752           NeutronMechanismDrivers: {get_param: NeutronMechanismDrivers}
753           # L3 HA and Failover is not relevant for Computes, should be removed
754           NeutronAllowL3AgentFailover: {get_param: NeutronAllowL3AgentFailover}
755           NeutronL3HA: {get_param: NeutronL3HA}
756           NovaApiHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
757           NovaComputeDriver: {get_param: NovaComputeDriver}
758           NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
759           NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
760           NovaEnableRbdBackend: {get_param: NovaEnableRbdBackend}
761           NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
762           NovaPassword: {get_param: NovaPassword}
763           NtpServer: {get_param: NtpServer}
764           RabbitHost: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
765           RabbitPassword: {get_param: RabbitPassword}
766           RabbitUserName: {get_param: RabbitUserName}
767           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
768           RabbitClientPort: {get_param: RabbitClientPort}
769           SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
770           SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
771           ServiceNetMap: {get_param: ServiceNetMap}
772           UpdateIdentifier: {get_param: UpdateIdentifier}
773           Hostname:
774             str_replace:
775               template: {get_param: ComputeHostnameFormat}
776               params:
777                 '%stackname%': {get_param: 'OS::stack_name'}
778
779   BlockStorage:
780     type: OS::Heat::ResourceGroup
781     depends_on: Networks
782     properties:
783       count: {get_param: BlockStorageCount}
784       resource_def:
785         type: OS::TripleO::BlockStorage
786         properties:
787           Debug: {get_param: Debug}
788           Image: {get_param: BlockStorageImage}
789           CinderISCSIHelper: {get_param: CinderISCSIHelper}
790           CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
791           # Purpose of the dedicated BlockStorage nodes should be to use their local LVM
792           CinderEnableIscsiBackend: {get_param: CinderEnableIscsiBackend}
793           CinderPassword: {get_param: CinderPassword}
794           VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
795           KeyName: {get_param: KeyName}
796           Flavor: {get_param: OvercloudBlockStorageFlavor}
797           RabbitPassword: {get_param: RabbitPassword}
798           RabbitUserName: {get_param: RabbitUserName}
799           RabbitClientUseSSL: {get_param: RabbitClientUseSSL}
800           RabbitClientPort: {get_param: RabbitClientPort}
801           NtpServer: {get_param: NtpServer}
802           UpdateIdentifier: {get_param: UpdateIdentifier}
803           Hostname:
804             str_replace:
805               template: {get_param: BlockStorageHostnameFormat}
806               params:
807                 '%stackname%': {get_param: 'OS::stack_name'}
808
809   ObjectStorage:
810     type: OS::Heat::ResourceGroup
811     depends_on: Networks
812     properties:
813       count: {get_param: ObjectStorageCount}
814       resource_def:
815         type: OS::TripleO::ObjectStorage
816         properties:
817           KeyName: {get_param: KeyName}
818           Flavor: {get_param: OvercloudSwiftStorageFlavor}
819           HashSuffix: {get_param: SwiftHashSuffix}
820           MountCheck: {get_param: SwiftMountCheck}
821           MinPartHours: {get_param: SwiftMinPartHours}
822           PartPower: {get_param: SwiftPartPower}
823           Image: {get_param: SwiftStorageImage}
824           Replicas: { get_param: SwiftReplicas}
825           NtpServer: {get_param: NtpServer}
826           UpdateIdentifier: {get_param: UpdateIdentifier}
827           ServiceNetMap: {get_param: ServiceNetMap}
828           Hostname:
829             str_replace:
830               template: {get_param: ObjectStorageHostnameFormat}
831               params:
832                 '%stackname%': {get_param: 'OS::stack_name'}
833
834   CephStorage:
835     type: OS::Heat::ResourceGroup
836     depends_on: Networks
837     properties:
838       count: {get_param: CephStorageCount}
839       resource_def:
840         type: OS::TripleO::CephStorage
841         properties:
842           Image: {get_param: CephStorageImage}
843           KeyName: {get_param: KeyName}
844           Flavor: {get_param: OvercloudCephStorageFlavor}
845           NtpServer: {get_param: NtpServer}
846           ServiceNetMap: {get_param: ServiceNetMap}
847           UpdateIdentifier: {get_param: UpdateIdentifier}
848           Hostname:
849             str_replace:
850               template: {get_param: CephStorageHostnameFormat}
851               params:
852                 '%stackname%': {get_param: 'OS::stack_name'}
853
854   ControllerIpListMap:
855     type: OS::TripleO::Network::Ports::NetIpListMap
856     properties:
857       ExternalIpList: {get_attr: [Controller, external_ip_address]}
858       InternalApiIpList: {get_attr: [Controller, internal_api_ip_address]}
859       StorageIpList: {get_attr: [Controller, storage_ip_address]}
860       StorageMgmtIpList: {get_attr: [Controller, storage_mgmt_ip_address]}
861       TenantIpList: {get_attr: [Controller, tenant_ip_address]}
862
863   allNodesConfig:
864     type: OS::TripleO::AllNodes::SoftwareConfig
865     properties:
866       compute_hosts: {get_attr: [Compute, hosts_entry]}
867       controller_hosts: {get_attr: [Controller, hosts_entry]}
868       controller_ips: {get_attr: [Controller, ip_address]}
869       block_storage_hosts: {get_attr: [BlockStorage, hosts_entry]}
870       object_storage_hosts: {get_attr: [ObjectStorage, hosts_entry]}
871       ceph_storage_hosts: {get_attr: [CephStorage, hosts_entry]}
872       controller_names: {get_attr: [Controller, hostname]}
873       rabbit_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
874       mongo_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
875       redis_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
876       memcache_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
877       mysql_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
878       horizon_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
879       heat_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
880       swift_proxy_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
881       ceilometer_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
882       nova_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
883       nova_metadata_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
884       glance_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
885       glance_registry_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
886       cinder_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
887       neutron_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
888       keystone_public_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
889       keystone_admin_api_node_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
890
891   MysqlRootPassword:
892     type: OS::Heat::RandomString
893     properties:
894       length: 10
895
896   MysqlClusterUniquePart:
897     type: OS::Heat::RandomString
898     properties:
899       length: 10
900
901   RabbitCookie:
902     type: OS::Heat::RandomString
903     properties:
904       length: 20
905       salt: {get_param: RabbitCookieSalt}
906
907   # creates the network architecture
908   Networks:
909     type: OS::TripleO::Network
910
911   ControlVirtualIP:
912     type: OS::Neutron::Port
913     depends_on: Networks
914     properties:
915       name: control_virtual_ip
916       network_id: {get_param: NeutronControlPlaneID}
917       fixed_ips: {get_param: ControlFixedIPs}
918       replacement_policy: AUTO
919
920   # same as external
921   PublicVirtualIP:
922     type: OS::Neutron::Port
923     depends_on: Networks
924     properties:
925       name: public_virtual_ip
926       network: {get_param: PublicVirtualNetwork}
927       fixed_ips: {get_param: PublicVirtualFixedIPs}
928       replacement_policy: AUTO
929
930   InternalApiVirtualIP:
931     depends_on: Networks
932     type: OS::TripleO::Controller::Ports::InternalApiPort
933     properties:
934       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
935       PortName: internal_api_virtual_ip
936
937   StorageVirtualIP:
938     depends_on: Networks
939     type: OS::TripleO::Controller::Ports::StoragePort
940     properties:
941       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
942       PortName: storage_virtual_ip
943
944   StorageMgmtVirtualIP:
945     depends_on: Networks
946     type: OS::TripleO::Controller::Ports::StorageMgmtPort
947     properties:
948       ControlPlaneIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
949       PortName: storage_management_virtual_ip
950
951   VipMap:
952     type: OS::TripleO::Network::Ports::NetIpMap
953     properties:
954       ExternalIp: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
955       InternalApiIp: {get_attr: [InternalApiVirtualIP, ip_address]}
956       StorageIp: {get_attr: [StorageVirtualIP, ip_address]}
957       StorageMgmtIp: {get_attr: [StorageMgmtVirtualIP, ip_address]}
958       # No tenant VIP required
959
960   VipConfig:
961     type: OS::TripleO::VipConfig
962
963   VipDeployment:
964     type: OS::Heat::StructuredDeployments
965     properties:
966       config: {get_resource: VipConfig}
967       servers: {get_attr: [Controller, attributes, nova_server_resource]}
968       input_values:
969         # service VIP mappings
970         keystone_admin_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
971         keystone_public_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
972         neutron_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
973         cinder_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
974         glance_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
975         glance_registry_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
976         swift_proxy_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
977         nova_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
978         nova_metadata_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
979         ceilometer_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
980         heat_api_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
981         horizon_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
982         redis_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
983         mysql_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
984         rabbit_vip: {get_attr: [VipMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
985         # direct configuration of Virtual IPs for each network
986         control_virtual_ip: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
987         public_virtual_ip: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
988         internal_api_virtual_ip: {get_attr: [InternalApiVirtualIP, ip_address]}
989         storage_virtual_ip: {get_attr: [StorageVirtualIP, ip_address]}
990         storage_mgmt_virtual_ip: {get_attr: [StorageMgmtVirtualIP, ip_address]}
991
992   ControllerBootstrapNodeConfig:
993     type: OS::TripleO::BootstrapNode::SoftwareConfig
994     properties:
995       bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
996       bootstrap_nodeid_ip: {get_attr: [Controller, resource.0.ip_address]}
997
998   ControllerBootstrapNodeDeployment:
999     type: OS::Heat::StructuredDeployments
1000     properties:
1001       config: {get_attr: [ControllerBootstrapNodeConfig, config_id]}
1002       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1003       signal_transport: NO_SIGNAL
1004
1005   ControllerSwiftDeployment:
1006     type: OS::Heat::StructuredDeployments
1007     properties:
1008       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1009       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1010       signal_transport: NO_SIGNAL
1011
1012   ObjectStorageSwiftDeployment:
1013     type: OS::Heat::StructuredDeployments
1014     properties:
1015       config: {get_attr: [SwiftDevicesAndProxyConfig, config_id]}
1016       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1017       signal_transport: NO_SIGNAL
1018
1019   SwiftDevicesAndProxyConfig:
1020     type: OS::TripleO::SwiftDevicesAndProxy::SoftwareConfig
1021     properties:
1022       controller_swift_devices: {get_attr: [Controller, swift_device]}
1023       object_store_swift_devices: {get_attr: [ObjectStorage, swift_device]}
1024       controller_swift_proxy_memcaches: {get_attr: [Controller, swift_proxy_memcache]}
1025
1026   ComputeCephDeployment:
1027     type: OS::Heat::StructuredDeployments
1028     properties:
1029       config: {get_attr: [CephClusterConfig, config_id]}
1030       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1031
1032   ControllerCephDeployment:
1033     type: OS::Heat::StructuredDeployments
1034     properties:
1035       config: {get_attr: [CephClusterConfig, config_id]}
1036       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1037
1038   CephStorageCephDeployment:
1039     type: OS::Heat::StructuredDeployments
1040     properties:
1041       config: {get_attr: [CephClusterConfig, config_id]}
1042       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1043
1044   CephClusterConfig:
1045     type: OS::TripleO::CephClusterConfig::SoftwareConfig
1046     properties:
1047       ceph_fsid: {get_param: CephClusterFSID}
1048       ceph_mon_key: {get_param: CephMonKey}
1049       ceph_admin_key: {get_param: CephAdminKey}
1050       ceph_mon_names: {get_attr: [Controller, hostname]}
1051       ceph_mon_ips: {get_attr: [ControllerIpListMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1052
1053   ControllerClusterConfig:
1054     type: OS::Heat::StructuredConfig
1055     properties:
1056       config:
1057         corosync:
1058           nodes: {get_attr: [Controller, corosync_node]}
1059         horizon:
1060           caches:
1061             memcached:
1062               nodes: {get_attr: [Controller, hostname]}
1063         mysql:
1064           nodes: {get_attr: [Controller, corosync_node]}
1065         haproxy:
1066           nodes: {get_attr: [Controller, corosync_node]}
1067
1068   ControllerClusterDeployment:
1069     type: OS::Heat::StructuredDeployments
1070     properties:
1071       config: {get_resource: ControllerClusterConfig}
1072       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1073       signal_transport: NO_SIGNAL
1074
1075   ControllerAllNodesDeployment:
1076     type: OS::Heat::StructuredDeployments
1077     properties:
1078       config: {get_attr: [allNodesConfig, config_id]}
1079       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1080
1081   ComputeAllNodesDeployment:
1082     type: OS::Heat::StructuredDeployments
1083     properties:
1084       config: {get_attr: [allNodesConfig, config_id]}
1085       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1086
1087   BlockStorageAllNodesDeployment:
1088     type: OS::Heat::StructuredDeployments
1089     properties:
1090       config: {get_attr: [allNodesConfig, config_id]}
1091       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1092
1093   ObjectStorageAllNodesDeployment:
1094     type: OS::Heat::StructuredDeployments
1095     properties:
1096       config: {get_attr: [allNodesConfig, config_id]}
1097       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1098
1099   CephStorageAllNodesDeployment:
1100     type: OS::Heat::StructuredDeployments
1101     properties:
1102       config: {get_attr: [allNodesConfig, config_id]}
1103       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1104
1105   # Nested stack deployment runs after all other controller deployments
1106   ControllerNodesPostDeployment:
1107     type: OS::TripleO::ControllerPostDeployment
1108     depends_on: [ControllerBootstrapNodeDeployment, ControllerAllNodesDeployment, ControllerSwiftDeployment, ControllerCephDeployment]
1109     properties:
1110       servers: {get_attr: [Controller, attributes, nova_server_resource]}
1111
1112   ComputeNodesPostDeployment:
1113     type: OS::TripleO::ComputePostDeployment
1114     depends_on: [ComputeAllNodesDeployment, ComputeCephDeployment]
1115     properties:
1116       servers: {get_attr: [Compute, attributes, nova_server_resource]}
1117
1118   ObjectStorageNodesPostDeployment:
1119     type: OS::TripleO::ObjectStoragePostDeployment
1120     depends_on: [ObjectStorageSwiftDeployment, ObjectStorageAllNodesDeployment]
1121     properties:
1122       servers: {get_attr: [ObjectStorage, attributes, nova_server_resource]}
1123
1124   BlockStorageNodesPostDeployment:
1125     type: OS::TripleO::BlockStoragePostDeployment
1126     depends_on: [ControllerNodesPostDeployment, BlockStorageAllNodesDeployment]
1127     properties:
1128       servers: {get_attr: [BlockStorage, attributes, nova_server_resource]}
1129
1130   CephStorageNodesPostDeployment:
1131     type: OS::TripleO::CephStoragePostDeployment
1132     depends_on: [ControllerNodesPostDeployment, CephStorageCephDeployment, CephStorageAllNodesDeployment]
1133     properties:
1134       servers: {get_attr: [CephStorage, attributes, nova_server_resource]}
1135
1136 outputs:
1137   KeystoneURL:
1138     description: URL for the Overcloud Keystone service
1139     value:
1140       list_join:
1141       - ''
1142       - - http://
1143         - {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
1144         - :5000/v2.0/