Merge "Add support for Ceph as a Cinder and Nova backend"
[apex-tripleo-heat-templates.git] / controller.yaml
1 heat_template_version: 2014-10-16
2
3 description: >
4   OpenStack control plane node. Can be wrapped in a ResourceGroup for scaling.
5
6 parameters:
7   AdminPassword:
8     default: unset
9     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
10     type: string
11     hidden: true
12   AdminToken:
13     default: unset
14     description: The keystone auth secret.
15     type: string
16     hidden: true
17   CeilometerMeteringSecret:
18     default: unset
19     description: Secret shared by the ceilometer services.
20     type: string
21     hidden: true
22   CeilometerPassword:
23     default: unset
24     description: The password for the ceilometer service account.
25     type: string
26     hidden: true
27   CinderEnableIscsiBackend:
28     default: true
29     description: Whether to enable or not the Iscsi backend for Cinder
30     type: boolean
31   CinderEnableRbdBackend:
32     default: false
33     description: Whether to enable or not the Rbd backend for Cinder
34     type: boolean
35   CinderISCSIHelper:
36     default: tgtadm
37     description: The iSCSI helper to use with cinder.
38     type: string
39   CinderLVMLoopDeviceSize:
40     default: 5000
41     description: The size of the loopback file used by the cinder LVM driver.
42     type: number
43   CinderPassword:
44     default: unset
45     description: The password for the cinder service account, used by cinder-api.
46     type: string
47     hidden: true
48   CloudName:
49     default: ''
50     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
51     type: string
52   ControllerExtraConfig:
53     default: {}
54     description: |
55       Controller specific configuration to inject into the cluster. Same
56       structure as ExtraConfig.
57     type: json
58   ControlVirtualInterface:
59     default: 'br-ex'
60     description: Interface where virtual ip will be assigned.
61     type: string
62   Debug:
63     default: ''
64     description: Set to True to enable debugging on all services.
65     type: string
66   ExtraConfig:
67     default: {}
68     description: |
69       Additional configuration to inject into the cluster. The JSON should have
70       the following structure:
71         {"FILEKEY":
72           {"config":
73             [{"section": "SECTIONNAME",
74               "values":
75                 [{"option": "OPTIONNAME",
76                   "value": "VALUENAME"
77                  }
78                 ]
79              }
80             ]
81           }
82         }
83       For instance:
84         {"nova":
85           {"config":
86             [{"section": "default",
87               "values":
88                 [{"option": "compute_manager",
89                   "value": "ironic.nova.compute.manager.ClusterComputeManager"
90                  }
91                 ]
92              },
93              {"section": "cells",
94               "values":
95                 [{"option": "driver",
96                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
97                  }
98                 ]
99              }
100             ]
101           }
102         }
103     type: json
104   Flavor:
105     description: Flavor for control nodes to request when deploying.
106     type: string
107     constraints:
108       - custom_constraint: nova.flavor
109   GlanceNotifierStrategy:
110     description: Strategy to use for Glance notification queue
111     type: string
112     default: noop
113   GlanceLogFile:
114     description: The filepath of the file to use for logging messages from Glance.
115     type: string
116     default: ''
117   GlancePassword:
118     default: unset
119     description: The password for the glance service account, used by the glance services.
120     type: string
121     hidden: true
122   GlancePort:
123     default: "9292"
124     description: Glance port.
125     type: string
126   GlanceProtocol:
127     default: http
128     description: Protocol to use when connecting to glance, set to https for SSL.
129     type: string
130   HeatPassword:
131     default: unset
132     description: The password for the Heat service account, used by the Heat services.
133     type: string
134     hidden: true
135   HeatStackDomainAdminPassword:
136     description: Password for heat_domain_admin user.
137     type: string
138     default: ''
139     hidden: true
140   HeatAuthEncryptionKey:
141     description: Auth encryption key for heat-engine
142     type: string
143   Image:
144     type: string
145     default: overcloud-control
146     constraints:
147       - custom_constraint: glance.image
148   ImageUpdatePolicy:
149     default: 'REBUILD_PRESERVE_EPHEMERAL'
150     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
151     type: string
152   KeyName:
153     default: default
154     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
155     type: string
156     constraints:
157       - custom_constraint: nova.keypair
158   KeystoneCACertificate:
159     default: ''
160     description: Keystone self-signed certificate authority certificate.
161     type: string
162   KeystoneSigningCertificate:
163     default: ''
164     description: Keystone certificate for verifying token validity.
165     type: string
166   KeystoneSigningKey:
167     default: ''
168     description: Keystone key for signing tokens.
169     type: string
170     hidden: true
171   KeystoneSSLCertificate:
172     default: ''
173     description: Keystone certificate for verifying token validity.
174     type: string
175   KeystoneSSLCertificateKey:
176     default: ''
177     description: Keystone key for signing tokens.
178     type: string
179     hidden: true
180   MysqlClusterUniquePart:
181     description: A unique identifier of the MySQL cluster the controller is in.
182     type: string
183     default: 'unset'  # Has to be here because of the ignored empty value bug
184     # Drop the validation: https://bugs.launchpad.net/tripleo/+bug/1405446
185     # constraints:
186     # - length: {min: 4, max: 10}
187   MysqlInnodbBufferPoolSize:
188     description: >
189         Specifies the size of the buffer pool in megabytes. Setting to
190         zero should be interpreted as "no value" and will defer to the
191         lower level default.
192     type: number
193     default: 0
194   MysqlRootPassword:
195     type: string
196     hidden: true
197     default: ''  # Has to be here because of the ignored empty value bug
198   NeutronBridgeMappings:
199     description: >
200       The OVS logical->physical bridge mappings to use. See the Neutron
201       documentation for details. Defaults to mapping br-ex - the external
202       bridge on hosts - to a physical name 'datacentre' which can be used
203       to create provider networks (and we use this for the default floating
204       network) - if changing this either use different post-install network
205       scripts or be sure to keep 'datacentre' as a mapping network name.
206     type: string
207     default: ""
208   NeutronDnsmasqOptions:
209     default: 'dhcp-option-force=26,1400'
210     description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the gre tunnel overhead.
211     type: string
212   NeutronAgentMode:
213     default: 'dvr_snat'
214     description: Agent mode for the neutron-l3-agent on the controller hosts
215     type: string
216   NeutronDVR:
217     default: 'False'
218     description: Whether to configure Neutron Distributed Virtual Routers
219     type: string
220   NeutronMetadataProxySharedSecret:
221     default: 'unset'
222     description: Shared secret to prevent spoofing
223     type: string
224   NeutronMechanismDrivers:
225     default: 'openvswitch'
226     description: |
227         The mechanism drivers for the Neutron tenant network. To specify multiple
228         values, use a comma separated string, like so: 'openvswitch,l2_population'
229     type: string
230   NeutronAllowL3AgentFailover:
231     default: 'True'
232     description: Allow automatic l3-agent failover
233     type: string
234   NeutronL3HA:
235     default: 'False'
236     description: Whether to enable l3-agent HA
237     type: string
238   NeutronEnableTunnelling:
239     type: string
240     default: "True"
241   NeutronFlatNetworks:
242     type: string
243     default: ''
244     description: If set, flat networks to configure in neutron plugins.
245   NeutronNetworkType:
246     default: 'gre'
247     description: The tenant network type for Neutron, either gre or vxlan.
248     type: string
249   NeutronNetworkVLANRanges:
250     default: 'datacentre'
251     description: >
252       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
253       Neutron documentation for permitted values. Defaults to permitting any
254       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
255     type: string
256   NeutronPassword:
257     default: unset
258     description: The password for the neutron service account, used by neutron agents.
259     type: string
260     hidden: true
261   NeutronPublicInterface:
262     default: nic1
263     description: What interface to bridge onto br-ex for network nodes.
264     type: string
265   NeutronPublicInterfaceTag:
266     default: ''
267     description: >
268       VLAN tag for creating a public VLAN. The tag will be used to
269       create an access port on the exterior bridge for each control plane node,
270       and that port will be given the IP address returned by neutron from the
271       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
272       overcloud.yaml to include the deployment of VLAN ports to the control
273       plane.
274     type: string
275   NeutronPublicInterfaceDefaultRoute:
276     default: ''
277     description: A custom default route for the NeutronPublicInterface.
278     type: string
279   NeutronPublicInterfaceIP:
280     default: ''
281     description: A custom IP address to put onto the NeutronPublicInterface.
282     type: string
283   NeutronPublicInterfaceRawDevice:
284     default: ''
285     description: If set, the public interface is a vlan with this device as the raw device.
286     type: string
287   NeutronTunnelTypes:
288     default: 'gre'
289     description: |
290         The tunnel types for the Neutron tenant network. To specify multiple
291         values, use a comma separated string, like so: 'gre,vxlan'
292     type: string
293   NovaPassword:
294     default: unset
295     description: The password for the nova service account, used by nova-api.
296     type: string
297     hidden: true
298   NtpServer:
299     type: string
300     default: ''
301   PublicVirtualInterface:
302     default: 'br-ex'
303     description: >
304         Specifies the interface where the public-facing virtual ip will be assigned.
305         This should be int_public when a VLAN is being used.
306     type: string
307   PublicVirtualIP:
308     type: string
309     default: ''  # Has to be here because of the ignored empty value bug
310   RabbitCookie:
311     type: string
312     default: ''  # Has to be here because of the ignored empty value bug
313     hidden: true
314   RabbitPassword:
315     default: guest
316     description: The password for RabbitMQ
317     type: string
318     hidden: true
319   RabbitUserName:
320     default: guest
321     description: The username for RabbitMQ
322     type: string
323   RabbitClientUseSSL:
324     default: false
325     description: >
326         Rabbit client subscriber parameter to specify
327         an SSL connection to the RabbitMQ host.
328     type: string
329   RabbitClientPort:
330     default: 5672
331     description: Set rabbit subscriber port, change this if using SSL
332     type: number
333   SnmpdReadonlyUserName:
334     default: ro_snmp_user
335     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
336     type: string
337   SnmpdReadonlyUserPassword:
338     default: unset
339     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
340     type: string
341     hidden: true
342   SSLCACertificate:
343     default: ''
344     description: If set, the contents of an SSL certificate authority file.
345     type: string
346   SSLCertificate:
347     default: ''
348     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
349     type: string
350     hidden: true
351   SSLKey:
352     default: ''
353     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
354     type: string
355     hidden: true
356   SwiftHashSuffix:
357     default: unset
358     description: A random string to be used as a salt when hashing to determine mappings
359       in the ring.
360     hidden: true
361     type: string
362   SwiftMountCheck:
363     default: 'false'
364     description: Value of mount_check in Swift account/container/object -server.conf
365     type: boolean
366   SwiftMinPartHours:
367     type: number
368     default: 1
369     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
370   SwiftPartPower:
371     default: 10
372     description: Partition Power to use when building Swift rings
373     type: number
374   SwiftPassword:
375     default: unset
376     description: The password for the swift service account, used by the swift proxy
377       services.
378     hidden: true
379     type: string
380   SwiftReplicas:
381     type: number
382     default: 3
383     description: How many replicas to use in the swift rings.
384   VirtualIP:
385     type: string
386     default: ''  # Has to be here because of the ignored empty value bug
387
388
389 resources:
390
391   Controller:
392     type: OS::Nova::Server
393     properties:
394       image: {get_param: Image}
395       image_update_policy: {get_param: ImageUpdatePolicy}
396       flavor: {get_param: Flavor}
397       key_name: {get_param: KeyName}
398       networks:
399         - network: ctlplane
400       user_data_format: SOFTWARE_CONFIG
401
402   NetworkConfig:
403     type: OS::TripleO::Net::SoftwareConfig
404
405   NetworkDeployment:
406     type: OS::TripleO::SoftwareDeployment
407     properties:
408       signal_transport: NO_SIGNAL
409       config: {get_attr: [NetworkConfig, config_id]}
410       server: {get_resource: Controller}
411       input_values:
412         bridge_name: br-ex
413         interface_name: {get_param: NeutronPublicInterface}
414
415   ControllerPassthroughConfig:
416     type: OS::Heat::StructuredConfig
417     properties:
418       group: os-apply-config
419       config: {get_input: passthrough_config}
420
421   ControllerPassthroughConfigSpecific:
422     type: OS::Heat::StructuredConfig
423     properties:
424       group: os-apply-config
425       config: {get_input: passthrough_config_specific}
426
427   ControllerConfig:
428     type: OS::Heat::StructuredConfig
429     properties:
430       group: os-apply-config
431       config:
432         admin-password: {get_input: admin_password}
433         admin-token: {get_input: admin_token}
434         bootstack:
435           public_interface_ip: {get_input: neutron_public_interface_ip}
436         bootstrap_host:
437           nodeid: {get_input: bootstack_nodeid}
438         cinder:
439           db: {get_input: cinder_dsn}
440           debug: {get_input: debug}
441           volume_size_mb: {get_input: cinder_lvm_loop_device_size}
442           service-password: {get_input: cinder_password}
443           iscsi-helper: {get_input: CinderISCSIHelper}
444         controller-address: {get_input: controller_host}
445         corosync:
446           bindnetaddr: {get_input: controller_host}
447           mcastport: 5577
448         pacemaker:
449           stonith_enabled : false
450           recheck_interval : 5
451           quorum_policy : ignore
452         db-password: unset
453         glance:
454           registry:
455             host: {get_input: controller_virtual_ip}
456           backend: swift
457           db: {get_input: glance_dsn}
458           debug: {get_input: debug}
459           host: {get_input: controller_virtual_ip}
460           port: {get_input: glance_port}
461           protocol: {get_input: glance_protocol}
462           service-password: {get_input: glance_password}
463           swift-store-user: service:glance
464           swift-store-key: {get_input: glance_password}
465           notifier-strategy: {get_input: glance_notifier_strategy}
466           log-file: {get_input: glance_log_file}
467         heat:
468           admin_password: {get_input: heat_password}
469           admin_tenant_name: service
470           admin_user: heat
471           auth_encryption_key: {get_input: heat_auth_encryption_key}
472           db: {get_input: heat_dsn}
473           debug: {get_input: debug}
474           stack_domain_admin_password: {get_input: heat_stack_domain_admin_password}
475           watch_server_url: {get_input: heat.watch_server_url}
476           metadata_server_url: {get_input: heat.metadata_server_url}
477           waitcondition_server_url: {get_input: heat.waitcondition_server_url}
478         keystone:
479           db: {get_input: keystone_dsn}
480           debug: {get_input: debug}
481           host: {get_input: controller_virtual_ip}
482           ca_certificate: {get_input: keystone_ca_certificate}
483           signing_key: {get_input: keystone_signing_key}
484           signing_certificate: {get_input: keystone_signing_certificate}
485           ssl:
486               certificate: {get_input: keystone_ssl_certificate}
487               certificate_key: {get_input: keystone_ssl_certificate_key}
488         mysql:
489           innodb_buffer_pool_size: {get_input: mysql_innodb_buffer_pool_size}
490           local_bind: true
491           root-password: {get_input: mysql_root_password}
492           cluster_name: {get_input: mysql_cluster_name}
493         neutron:
494           debug: {get_input: debug}
495           flat-networks: {get_input: neutron_flat_networks}
496           host: {get_input: controller_virtual_ip}
497           metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
498           agent_mode: {get_input: neutron_agent_mode}
499           router_distributed: {get_input: neutron_router_distributed}
500           mechanism_drivers: {get_input: neutron_mechanism_drivers}
501           allow_automatic_l3agent_failover: {get_input: neutron_allow_l3agent_failover}
502           l3_ha: {get_input: neutron_l3_ha}
503           ovs:
504             enable_tunneling: {get_input: neutron_enable_tunneling}
505             local_ip: {get_input: controller_host}
506             network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
507             bridge_mappings: {get_input: neutron_bridge_mappings}
508             public_interface: {get_input: neutron_public_interface}
509             public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
510             public_interface_route: {get_input: neutron_public_interface_default_route}
511             public_interface_tag: {get_input: neutron_public_interface_tag}
512             physical_bridge: br-ex
513             tenant_network_type: {get_input: neutron_tenant_network_type}
514             tunnel_types: {get_input: neutron_tunnel_types}
515           ovs_db: {get_input: neutron_dsn}
516           service-password: {get_input: neutron_password}
517           dnsmasq-options: {get_input: neutron_dnsmasq_options}
518         ceilometer:
519           db: {get_input: ceilometer_dsn}
520           debug: {get_input: debug}
521           metering_secret: {get_input: ceilometer_metering_secret}
522           service-password: {get_input: ceilometer_password}
523         snmpd:
524           export_MIB: UCD-SNMP-MIB
525           readonly_user_name: {get_input: snmpd_readonly_user_name}
526           readonly_user_password: {get_input: snmpd_readonly_user_password}
527         nova:
528           compute_driver: libvirt.LibvirtDriver
529           db: {get_input: nova_dsn}
530           default_floating_pool:
531             ext-net
532           host: {get_input: controller_virtual_ip}
533           metadata-proxy: true
534           service-password: {get_input: nova_password}
535         rabbit:
536           host: {get_input: controller_virtual_ip}
537           username: {get_input: rabbit_username}
538           password: {get_input: rabbit_password}
539           cookie: {get_input: rabbit_cookie}
540           rabbit_client_use_ssl: {get_input: rabbit_client_use_ssl}
541           rabbit_port: {get_input: rabbit_client_port}
542         ntp:
543           servers:
544               - {server: {get_input: ntp_server}}
545         virtual_interfaces:
546           instances:
547             - vrrp_instance_name: VI_CONTROL
548               virtual_router_id: 51
549               keepalive_interface: {get_input: control_virtual_interface}
550               priority: 101
551               virtual_ips:
552               - ip: {get_input: controller_virtual_ip}
553                 interface: {get_input: control_virtual_interface}
554             - vrrp_instance_name: VI_PUBLIC
555               virtual_router_id: 52
556               keepalive_interface: {get_input: public_virtual_interface}
557               priority: 101
558               virtual_ips:
559               - ip: {get_input: public_virtual_ip}
560                 interface: {get_input: public_virtual_interface}
561           vrrp_sync_groups:
562             - name: VG1
563               members:
564                 - VI_CONTROL
565                 - VI_PUBLIC
566         keepalived:
567           keepalive_interface: {get_input: public_virtual_interface}
568           priority: 101
569         virtual_ips:
570             -
571               ip: {get_input: controller_virtual_ip}
572               interface: {get_input: control_virtual_interface}
573             -
574               ip: {get_input: public_virtual_ip}
575               interface: {get_input: public_virtual_interface}
576         haproxy:
577           net_binds:
578             - ip: {get_input: controller_virtual_ip}
579           options:
580             - option httpchk GET /
581           services:
582             - name: keystone_admin
583               port: 35357
584               net_binds: &public_binds
585                 - ip: {get_input: controller_virtual_ip}
586                 - ip: {get_input: public_virtual_ip}
587             - name: keystone_public
588               port: 5000
589               net_binds: *public_binds
590             - name: horizon
591               port: 80
592               net_binds: *public_binds
593             - name: neutron
594               port: 9696
595               net_binds: *public_binds
596             - name: cinder
597               port: 8776
598               net_binds: *public_binds
599             - name: glance_api
600               port: 9292
601               net_binds: *public_binds
602             - name: glance_registry
603               port: 9191
604               net_binds: *public_binds
605               options: # overwrite options as glace_reg needs auth for http req
606             - name: heat_api
607               port: 8004
608               net_binds: *public_binds
609             - name: heat_cloudwatch
610               port: 8003
611               net_binds: *public_binds
612             - name: heat_cfn
613               port: 8000
614               net_binds: *public_binds
615             - name: mysql
616               port: 3306
617               extra_server_params:
618                 - backup
619               options:
620                 - timeout client 0
621                 - timeout server 0
622             - name: nova_ec2
623               port: 8773
624             - name: nova_osapi
625               port: 8774
626               net_binds: *public_binds
627             - name: nova_metadata
628               port: 8775
629               net_binds: *public_binds
630             - name: nova_novncproxy
631               port: 6080
632               net_binds: *public_binds
633             - name: ceilometer
634               port: 8777
635               net_binds: *public_binds
636               options: # overwrite options as ceil needs auth for http req
637             - name: swift_proxy_server
638               port: 8080
639               net_binds: *public_binds
640               options:
641                 - option httpchk GET /info
642             - name: rabbitmq
643               port: 5672
644               options:
645                 - timeout client 0
646                 - timeout server 0
647                 - maxconn 1500
648
649   ControllerDeployment:
650     type: OS::TripleO::SoftwareDeployment
651     properties:
652       signal_transport: NO_SIGNAL
653       config: {get_resource: ControllerConfig}
654       server: {get_resource: Controller}
655       input_values:
656         bootstack_nodeid: {get_attr: [Controller, name]}
657         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
658         controller_virtual_ip: {get_param: VirtualIP}
659         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
660         heat.watch_server_url:
661           list_join:
662             - ''
663             - - 'http://'
664               - {get_param: VirtualIP}
665               - ':8003'
666         heat.metadata_server_url:
667           list_join:
668             - ''
669             - - 'http://'
670               - {get_param: VirtualIP}
671               - ':8000'
672         heat.waitcondition_server_url:
673           list_join:
674             - ''
675             - - 'http://'
676               - {get_param: VirtualIP}
677               - ':8000/v1/waitcondition'
678         admin_password: {get_param: AdminPassword}
679         admin_token: {get_param: AdminToken}
680         neutron_public_interface_ip: {get_param: NeutronPublicInterfaceIP}
681         debug: {get_param: Debug}
682         cinder_lvm_loop_device_size: {get_param: CinderLVMLoopDeviceSize}
683         cinder_password: {get_param: CinderPassword}
684         cinder_iscsi_helper: {get_param: CinderISCSIHelper}
685         cinder_dsn:
686           list_join:
687             - ''
688             - - 'mysql://cinder:unset@'
689               - {get_param: VirtualIP}
690               - '/cinder'
691         glance_port: {get_param: GlancePort}
692         glance_protocol: {get_param: GlanceProtocol}
693         glance_password: {get_param: GlancePassword}
694         glance_notifier_strategy: {get_param: GlanceNotifierStrategy}
695         glance_log_file: {get_param: GlanceLogFile}
696         glance_dsn:
697           list_join:
698             - ''
699             - - 'mysql://glance:unset@'
700               - {get_param: VirtualIP}
701               - '/glance'
702         heat_password: {get_param: HeatPassword}
703         heat_stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
704         heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey}
705         heat_dsn:
706           list_join:
707             - ''
708             - - 'mysql://heat:unset@'
709               - {get_param: VirtualIP}
710               - '/heat'
711         keystone_ca_certificate: {get_param: KeystoneCACertificate}
712         keystone_signing_key: {get_param: KeystoneSigningKey}
713         keystone_signing_certificate: {get_param: KeystoneSigningCertificate}
714         keystone_ssl_certificate: {get_param: KeystoneSSLCertificate}
715         keystone_ssl_certificate_key: {get_param: KeystoneSSLCertificateKey}
716         keystone_dsn:
717           list_join:
718             - ''
719             - - 'mysql://keystone:unset@'
720               - {get_param: VirtualIP}
721               - '/keystone'
722         mysql_innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
723         mysql_root_password: {get_param: MysqlRootPassword}
724         mysql_cluster_name:
725           str_replace:
726             template: tripleo-CLUSTER
727             params:
728               CLUSTER: {get_param: MysqlClusterUniquePart}
729         neutron_flat_networks: {get_param: NeutronFlatNetworks}
730         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
731         neutron_agent_mode: {get_param: NeutronAgentMode}
732         neutron_router_distributed: {get_param: NeutronDVR}
733         neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
734         neutron_allow_l3agent_failover: {get_param: NeutronAllowL3AgentFailover}
735         neutron_l3_ha: {get_param: NeutronL3HA}
736         neutron_network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
737         neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
738         neutron_public_interface: {get_param: NeutronPublicInterface}
739         neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
740         neutron_public_interface_default_route: {get_param: NeutronPublicInterfaceDefaultRoute}
741         neutron_public_interface_tag: {get_param: NeutronPublicInterfaceTag}
742         neutron_tenant_network_type: {get_param: NeutronNetworkType}
743         neutron_tunnel_types: {get_param: NeutronTunnelTypes}
744         neutron_password: {get_param: NeutronPassword}
745         neutron_dnsmasq_options: {get_param: NeutronDnsmasqOptions}
746         neutron_dsn:
747           list_join:
748             - ''
749             - - 'mysql://neutron:unset@'
750               - {get_param: VirtualIP}
751               - '/ovs_neutron?charset=utf8'
752         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
753         ceilometer_password: {get_param: CeilometerPassword}
754         ceilometer_dsn:
755           list_join:
756             - ''
757             - - 'mysql://ceilometer:unset@'
758               - {get_param: VirtualIP}
759               - '/ceilometer'
760         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
761         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
762         nova_password: {get_param: NovaPassword}
763         nova_dsn:
764           list_join:
765             - ''
766             - - 'mysql://nova:unset@'
767               - {get_param: VirtualIP}
768               - '/nova'
769         rabbit_username: {get_param: RabbitUserName}
770         rabbit_password: {get_param: RabbitPassword}
771         rabbit_cookie: {get_param: RabbitCookie}
772         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
773         rabbit_client_port: {get_param: RabbitClientPort}
774         ntp_server: {get_param: NtpServer}
775         control_virtual_interface: {get_param: ControlVirtualInterface}
776         public_virtual_interface: {get_param: PublicVirtualInterface}
777         public_virtual_ip: {get_param: PublicVirtualIP}
778
779   SSLConfig:
780     type: OS::Heat::StructuredConfig
781     properties:
782       group: os-apply-config
783       config:
784         ssl:
785           ca_certificate: {get_input: ssl_ca_certificate}
786         stunnel:
787           cert: {get_input: ssl_certificate}
788           key: {get_input: ssl_key}
789           cacert: {get_input: ssl_ca_certificate}
790           ports:
791            - name: 'ec2'
792              accept: 13773
793              connect: 8773
794              connect_host: {get_input: controller_host}
795            - name: 'image'
796              accept: 13292
797              connect: 9292
798              connect_host: {get_input: controller_host}
799            - name: 'identity'
800              accept: 13000
801              connect: 5000
802              connect_host: {get_input: controller_host}
803            - name: 'network'
804              accept: 13696
805              connect: 9696
806              connect_host: {get_input: controller_host}
807            - name: 'compute'
808              accept: 13774
809              connect: 8774
810              connect_host: {get_input: controller_host}
811            - name: 'swift-proxy'
812              accept: 13080
813              connect: 8080
814              connect_host: {get_input: controller_host}
815            - name: 'cinder'
816              accept: 13776
817              connect: 8776
818              connect_host: {get_input: controller_host}
819            - name: 'ceilometer'
820              accept: 13777
821              connect: 8777
822              connect_host: {get_input: controller_host}
823
824   ControllerSSLDeployment:
825     type: OS::Heat::StructuredDeployment
826     properties:
827       config: {get_resource: SSLConfig}
828       server: {get_resource: Controller}
829       signal_transport: NO_SIGNAL
830       input_values:
831         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
832         ssl_certificate: {get_param: SSLCertificate}
833         ssl_key: {get_param: SSLKey}
834         ssl_ca_certificate: {get_param: SSLCACertificate}
835
836   ControllerPassthroughDeployment:
837     type: OS::Heat::StructuredDeployment
838     properties:
839       config: {get_resource: ControllerPassthroughConfig}
840       server: {get_resource: Controller}
841       signal_transport: NO_SIGNAL
842       input_values:
843         passthrough_config: {get_param: ExtraConfig}
844
845   ControllerPassthroughSpecificDeployment:
846     depends_on: [ControllerPassthroughDeployment]
847     type: OS::Heat::StructuredDeployment
848     properties:
849       config: {get_resource: ControllerPassthroughConfigSpecific}
850       server: {get_resource: Controller}
851       signal_transport: NO_SIGNAL
852       input_values:
853         passthrough_config_specific: {get_param: ControllerExtraConfig}
854
855   SwiftConfig:
856     type: OS::Heat::StructuredConfig
857     properties:
858       group: os-apply-config
859       config:
860         swift:
861           hash: { get_input: swift_hash_suffix }
862           part-power: { get_input: swift_part_power }
863           mount-check: { get_input: swift_mount_check }
864           min-part-hours: { get_input: swift_min_part_hours }
865           replicas: {get_input: swift_replicas }
866           service-password: { get_input: swift_password }
867
868   SwiftStorageDeploy:
869     type: OS::Heat::StructuredDeployment
870     properties:
871       server: {get_resource: Controller}
872       config: {get_resource: SwiftConfig}
873       signal_transport: NO_SIGNAL
874       input_values:
875         swift_hash_suffix: {get_param: SwiftHashSuffix}
876         swift_mount_check: {get_param: SwiftMountCheck}
877         swift_password: {get_param: SwiftPassword}
878         swift_min_part_hours: {get_param: SwiftMinPartHours}
879         swift_part_power: {get_param: SwiftPartPower}
880         swift_replicas: { get_param: SwiftReplicas}
881
882 outputs:
883   ip_address:
884     description: IP address of the server in the ctlplane network
885     value: {get_attr: [Controller, networks, ctlplane, 0]}
886   hostname:
887     description: Hostname of the server
888     value: {get_attr: [Controller, name]}
889   corosync_node:
890     description: >
891       Node object in the format {ip: ..., name: ...} format that the corosync
892       element expects
893     value:
894       ip: {get_attr: [Controller, networks, ctlplane, 0]}
895       name: {get_attr: [Controller, name]}
896   hosts_entry:
897     description: >
898       Server's IP address and hostname in the /etc/hosts format
899     value:
900       str_replace:
901         template: IP HOST HOST.novalocal CLOUDNAME
902         params:
903           IP: {get_attr: [Controller, networks, ctlplane, 0]}
904           HOST: {get_attr: [Controller, name]}
905           CLOUDNAME: {get_param: CloudName}
906   nova_server_resource:
907     description: Heat resource handle for the Nova compute server
908     value:
909       {get_resource: Controller}
910   swift_device:
911     description: Swift device formatted for swift-ring-builder
912     value:
913       str_replace:
914         template: 'r1z1-IP:%PORT%/d1'
915         params:
916           IP: {get_attr: [Controller, networks, ctlplane, 0]}
917   swift_proxy_memcache:
918     description: Swift proxy-memcache value
919     value:
920       str_replace:
921         template: "IP:11211"
922         params:
923           IP: {get_attr: [Controller, networks, ctlplane, 0]}