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