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