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