9dd41c997ac7168d42cf547284d915ffad194aa9
[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   CinderEnableIscsiBackend:
32     default: true
33     description: Whether to enable or not the Iscsi backend for Cinder
34     type: boolean
35   CinderEnableRbdBackend:
36     default: false
37     description: Whether to enable or not the Rbd backend for Cinder
38     type: boolean
39   CinderISCSIHelper:
40     default: tgtadm
41     description: The iSCSI helper to use with cinder.
42     type: string
43   CinderLVMLoopDeviceSize:
44     default: 5000
45     description: The size of the loopback file used by the cinder LVM driver.
46     type: number
47   CinderPassword:
48     default: unset
49     description: The password for the cinder service and db account, used by cinder-api.
50     type: string
51     hidden: true
52   CloudName:
53     default: ''
54     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
55     type: string
56   ControllerExtraConfig:
57     default: {}
58     description: |
59       Controller specific configuration to inject into the cluster. Same
60       structure as ExtraConfig.
61     type: json
62   ControlVirtualInterface:
63     default: 'br-ex'
64     description: Interface where virtual ip will be assigned.
65     type: string
66   Debug:
67     default: ''
68     description: Set to True to enable debugging on all services.
69     type: string
70   EnableFencing:
71     default: false
72     description: Whether to enable fencing in Pacemaker or not.
73     type: boolean
74   EnableGalera:
75     default: true
76     description: Whether to use Galera instead of regular MariaDB.
77     type: boolean
78   EnableCephStorage:
79     default: false
80     description: Whether to deploy Ceph Storage (OSD) on the Controller
81     type: boolean
82   EnableSwiftStorage:
83     default: true
84     description: Whether to enable Swift Storage on the Controller
85     type: boolean
86   ExtraConfig:
87     default: {}
88     description: |
89       Additional configuration to inject into the cluster. The JSON should have
90       the following structure:
91         {"FILEKEY":
92           {"config":
93             [{"section": "SECTIONNAME",
94               "values":
95                 [{"option": "OPTIONNAME",
96                   "value": "VALUENAME"
97                  }
98                 ]
99              }
100             ]
101           }
102         }
103       For instance:
104         {"nova":
105           {"config":
106             [{"section": "default",
107               "values":
108                 [{"option": "compute_manager",
109                   "value": "ironic.nova.compute.manager.ClusterComputeManager"
110                  }
111                 ]
112              },
113              {"section": "cells",
114               "values":
115                 [{"option": "driver",
116                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
117                  }
118                 ]
119              }
120             ]
121           }
122         }
123     type: json
124   FencingConfig:
125     default: {}
126     description: |
127       Pacemaker fencing configuration. The JSON should have
128       the following structure:
129         {
130           "devices": [
131             {
132               "agent": "AGENT_NAME",
133               "host_mac": "HOST_MAC_ADDRESS",
134               "params": {"PARAM_NAME": "PARAM_VALUE"}
135             }
136           ]
137         }
138       For instance:
139         {
140           "devices": [
141             {
142               "agent": "fence_xvm",
143               "host_mac": "52:54:00:aa:bb:cc",
144               "params": {
145                 "multicast_address": "225.0.0.12",
146                 "port": "baremetal_0",
147                 "manage_fw": true,
148                 "manage_key_file": true,
149                 "key_file": "/etc/fence_xvm.key",
150                 "key_file_password": "abcdef"
151               }
152             }
153           ]
154         }
155     type: json
156   Flavor:
157     description: Flavor for control nodes to request when deploying.
158     type: string
159     constraints:
160       - custom_constraint: nova.flavor
161   GlanceNotifierStrategy:
162     description: Strategy to use for Glance notification queue
163     type: string
164     default: noop
165   GlanceLogFile:
166     description: The filepath of the file to use for logging messages from Glance.
167     type: string
168     default: ''
169   GlancePassword:
170     default: unset
171     description: The password for the glance service and db account, used by the glance services.
172     type: string
173     hidden: true
174   GlancePort:
175     default: "9292"
176     description: Glance port.
177     type: string
178   GlanceProtocol:
179     default: http
180     description: Protocol to use when connecting to glance, set to https for SSL.
181     type: string
182   GlanceBackend:
183     default: swift
184     description: The short name of the Glance backend to use. Should be one
185       of swift, rbd, or file
186     type: string
187     constraints:
188     - allowed_values: ['swift', 'file', 'rbd']
189   HeatPassword:
190     default: unset
191     description: The password for the Heat service and db account, used by the Heat services.
192     type: string
193     hidden: true
194   HeatStackDomainAdminPassword:
195     description: Password for heat_domain_admin user.
196     type: string
197     default: ''
198     hidden: true
199   HeatAuthEncryptionKey:
200     description: Auth encryption key for heat-engine
201     type: string
202   HorizonSecret:
203     description: Secret key for Django
204     type: string
205   Image:
206     type: string
207     default: overcloud-control
208     constraints:
209       - custom_constraint: glance.image
210   ImageUpdatePolicy:
211     default: 'REBUILD_PRESERVE_EPHEMERAL'
212     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
213     type: string
214   KeyName:
215     default: default
216     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
217     type: string
218     constraints:
219       - custom_constraint: nova.keypair
220   KeystoneCACertificate:
221     default: ''
222     description: Keystone self-signed certificate authority certificate.
223     type: string
224   KeystoneSigningCertificate:
225     default: ''
226     description: Keystone certificate for verifying token validity.
227     type: string
228   KeystoneSigningKey:
229     default: ''
230     description: Keystone key for signing tokens.
231     type: string
232     hidden: true
233   KeystoneSSLCertificate:
234     default: ''
235     description: Keystone certificate for verifying token validity.
236     type: string
237   KeystoneSSLCertificateKey:
238     default: ''
239     description: Keystone key for signing tokens.
240     type: string
241     hidden: true
242   MysqlClusterUniquePart:
243     description: A unique identifier of the MySQL cluster the controller is in.
244     type: string
245     default: 'unset'  # Has to be here because of the ignored empty value bug
246     # Drop the validation: https://bugs.launchpad.net/tripleo/+bug/1405446
247     # constraints:
248     # - length: {min: 4, max: 10}
249   MysqlInnodbBufferPoolSize:
250     description: >
251         Specifies the size of the buffer pool in megabytes. Setting to
252         zero should be interpreted as "no value" and will defer to the
253         lower level default.
254     type: number
255     default: 0
256   MysqlMaxConnections:
257     description: Configures MySQL max_connections config setting
258     type: number
259     default: 1024
260   MysqlRootPassword:
261     type: string
262     hidden: true
263     default: ''  # Has to be here because of the ignored empty value bug
264   NeutronExternalNetworkBridge:
265     description: Name of bridge used for external network traffic.
266     type: string
267     default: 'br-ex'
268   NeutronBridgeMappings:
269     description: >
270       The OVS logical->physical bridge mappings to use. See the Neutron
271       documentation for details. Defaults to mapping br-ex - the external
272       bridge on hosts - to a physical name 'datacentre' which can be used
273       to create provider networks (and we use this for the default floating
274       network) - if changing this either use different post-install network
275       scripts or be sure to keep 'datacentre' as a mapping network name.
276     type: string
277     default: "datacentre:br-ex"
278   NeutronDnsmasqOptions:
279     default: 'dhcp-option-force=26,1400'
280     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.
281     type: string
282   NeutronAgentMode:
283     default: 'dvr_snat'
284     description: Agent mode for the neutron-l3-agent on the controller hosts
285     type: string
286   NeutronDVR:
287     default: 'False'
288     description: Whether to configure Neutron Distributed Virtual Routers
289     type: string
290   NeutronMetadataProxySharedSecret:
291     default: 'unset'
292     description: Shared secret to prevent spoofing
293     type: string
294   NeutronMechanismDrivers:
295     default: 'openvswitch'
296     description: |
297         The mechanism drivers for the Neutron tenant network. To specify multiple
298         values, use a comma separated string, like so: 'openvswitch,l2_population'
299     type: string
300   NeutronAllowL3AgentFailover:
301     default: 'True'
302     description: Allow automatic l3-agent failover
303     type: string
304   NeutronL3HA:
305     default: 'False'
306     description: Whether to enable l3-agent HA
307     type: string
308   NeutronDhcpAgentsPerNetwork:
309     type: number
310     default: 3
311     description: The number of neutron dhcp agents to schedule per network
312   NeutronEnableTunnelling:
313     type: string
314     default: "True"
315   NeutronFlatNetworks:
316     type: string
317     default: 'datacentre'
318     description: If set, flat networks to configure in neutron plugins.
319   NeutronNetworkType:
320     default: 'gre'
321     description: The tenant network type for Neutron, either gre or vxlan.
322     type: string
323   NeutronNetworkVLANRanges:
324     default: 'datacentre'
325     description: >
326       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
327       Neutron documentation for permitted values. Defaults to permitting any
328       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
329     type: comma_delimited_list
330   NeutronPassword:
331     default: unset
332     description: The password for the neutron service and db account, used by neutron agents.
333     type: string
334     hidden: true
335   NeutronPublicInterface:
336     default: nic1
337     description: What interface to bridge onto br-ex for network nodes.
338     type: string
339   NeutronPublicInterfaceTag:
340     default: ''
341     description: >
342       VLAN tag for creating a public VLAN. The tag will be used to
343       create an access port on the exterior bridge for each control plane node,
344       and that port will be given the IP address returned by neutron from the
345       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
346       overcloud.yaml to include the deployment of VLAN ports to the control
347       plane.
348     type: string
349   NeutronPublicInterfaceDefaultRoute:
350     default: ''
351     description: A custom default route for the NeutronPublicInterface.
352     type: string
353   NeutronPublicInterfaceIP:
354     default: ''
355     description: A custom IP address to put onto the NeutronPublicInterface.
356     type: string
357   NeutronPublicInterfaceRawDevice:
358     default: ''
359     description: If set, the public interface is a vlan with this device as the raw device.
360     type: string
361   NeutronTunnelTypes:
362     default: 'gre'
363     description: |
364         The tunnel types for the Neutron tenant network. To specify multiple
365         values, use a comma separated string, like so: 'gre,vxlan'
366     type: string
367   NovaPassword:
368     default: unset
369     description: The password for the nova service and db account, used by nova-api.
370     type: string
371     hidden: true
372   MongoDbNoJournal:
373     default: false
374     description: Should MongoDb journaling be disabled
375     type: boolean
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           dhcp_agents_per_network: {get_input: neutron_dhcp_agents_per_network}
652           ovs:
653             enable_tunneling: {get_input: neutron_enable_tunneling}
654             local_ip: {get_input: controller_host}
655             network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
656             bridge_mappings: {get_input: neutron_bridge_mappings}
657             public_interface: {get_input: neutron_public_interface}
658             public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
659             public_interface_route: {get_input: neutron_public_interface_default_route}
660             public_interface_tag: {get_input: neutron_public_interface_tag}
661             physical_bridge: br-ex
662             tenant_network_type: {get_input: neutron_tenant_network_type}
663             tunnel_types: {get_input: neutron_tunnel_types}
664           ovs_db: {get_input: neutron_dsn}
665           service-password: {get_input: neutron_password}
666           dnsmasq-options: {get_input: neutron_dnsmasq_options}
667         ceilometer:
668           db: {get_input: ceilometer_dsn}
669           debug: {get_input: debug}
670           metering_secret: {get_input: ceilometer_metering_secret}
671           service-password: {get_input: ceilometer_password}
672         snmpd:
673           export_MIB: UCD-SNMP-MIB
674           readonly_user_name: {get_input: snmpd_readonly_user_name}
675           readonly_user_password: {get_input: snmpd_readonly_user_password}
676         nova:
677           compute_driver: libvirt.LibvirtDriver
678           db: {get_input: nova_dsn}
679           default_floating_pool:
680             ext-net
681           host: {get_input: controller_virtual_ip}
682           metadata-proxy: true
683           service-password: {get_input: nova_password}
684         mongodb:
685           nojournal: {get_input: mongodb_no_journal}
686         rabbit:
687           host: {get_input: controller_virtual_ip}
688           username: {get_input: rabbit_username}
689           password: {get_input: rabbit_password}
690           cookie: {get_input: rabbit_cookie}
691           rabbit_client_use_ssl: {get_input: rabbit_client_use_ssl}
692           rabbit_port: {get_input: rabbit_client_port}
693         ntp:
694           servers:
695               - {server: {get_input: ntp_server}}
696         virtual_interfaces:
697           instances:
698             - vrrp_instance_name: VI_CONTROL
699               virtual_router_id: 51
700               keepalive_interface: {get_input: control_virtual_interface}
701               priority: 101
702               virtual_ips:
703               - ip: {get_input: controller_virtual_ip}
704                 interface: {get_input: control_virtual_interface}
705             - vrrp_instance_name: VI_PUBLIC
706               virtual_router_id: 52
707               keepalive_interface: {get_input: public_virtual_interface}
708               priority: 101
709               virtual_ips:
710               - ip: {get_input: public_virtual_ip}
711                 interface: {get_input: public_virtual_interface}
712           vrrp_sync_groups:
713             - name: VG1
714               members:
715                 - VI_CONTROL
716                 - VI_PUBLIC
717         keepalived:
718           keepalive_interface: {get_input: public_virtual_interface}
719           priority: 101
720         virtual_ips:
721             -
722               ip: {get_input: controller_virtual_ip}
723               interface: {get_input: control_virtual_interface}
724             -
725               ip: {get_input: public_virtual_ip}
726               interface: {get_input: public_virtual_interface}
727         haproxy:
728           net_binds:
729             - ip: {get_input: controller_virtual_ip}
730           options:
731             - option httpchk GET /
732           services:
733             - name: keystone_admin
734               port: 35357
735               net_binds: &public_binds
736                 - ip: {get_input: controller_virtual_ip}
737                 - ip: {get_input: public_virtual_ip}
738             - name: keystone_public
739               port: 5000
740               net_binds: *public_binds
741             - name: horizon
742               port: 80
743               net_binds: *public_binds
744             - name: neutron
745               port: 9696
746               net_binds: *public_binds
747             - name: cinder
748               port: 8776
749               net_binds: *public_binds
750             - name: glance_api
751               port: 9292
752               net_binds: *public_binds
753             - name: glance_registry
754               port: 9191
755               net_binds: *public_binds
756               options: # overwrite options as glace_reg needs auth for http req
757             - name: heat_api
758               port: 8004
759               net_binds: *public_binds
760             - name: heat_cloudwatch
761               port: 8003
762               net_binds: *public_binds
763             - name: heat_cfn
764               port: 8000
765               net_binds: *public_binds
766             - name: mysql
767               port: 3306
768               extra_server_params:
769                 - backup
770               options:
771                 - timeout client 0
772                 - timeout server 0
773             - name: nova_ec2
774               port: 8773
775             - name: nova_osapi
776               port: 8774
777               net_binds: *public_binds
778             - name: nova_metadata
779               port: 8775
780               net_binds: *public_binds
781             - name: nova_novncproxy
782               port: 6080
783               net_binds: *public_binds
784             - name: ceilometer
785               port: 8777
786               net_binds: *public_binds
787               options: # overwrite options as ceil needs auth for http req
788             - name: swift_proxy_server
789               port: 8080
790               net_binds: *public_binds
791               options:
792                 - option httpchk GET /info
793             - name: rabbitmq
794               port: 5672
795               options:
796                 - timeout client 0
797                 - timeout server 0
798                 - maxconn 1500
799
800   ControllerDeployment:
801     type: OS::TripleO::SoftwareDeployment
802     properties:
803       signal_transport: NO_SIGNAL
804       config: {get_resource: ControllerConfig}
805       server: {get_resource: Controller}
806       input_values:
807         bootstack_nodeid: {get_attr: [Controller, name]}
808         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
809         controller_virtual_ip: {get_param: VirtualIP}
810         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
811         heat.watch_server_url:
812           list_join:
813             - ''
814             - - 'http://'
815               - {get_param: VirtualIP}
816               - ':8003'
817         heat.metadata_server_url:
818           list_join:
819             - ''
820             - - 'http://'
821               - {get_param: VirtualIP}
822               - ':8000'
823         heat.waitcondition_server_url:
824           list_join:
825             - ''
826             - - 'http://'
827               - {get_param: VirtualIP}
828               - ':8000/v1/waitcondition'
829         admin_password: {get_param: AdminPassword}
830         admin_token: {get_param: AdminToken}
831         neutron_public_interface_ip: {get_param: NeutronPublicInterfaceIP}
832         debug: {get_param: Debug}
833         cinder_lvm_loop_device_size: {get_param: CinderLVMLoopDeviceSize}
834         cinder_password: {get_param: CinderPassword}
835         cinder_iscsi_helper: {get_param: CinderISCSIHelper}
836         cinder_dsn:
837           list_join:
838             - ''
839             - - 'mysql://cinder:'
840               - {get_param: CinderPassword}
841               - '@'
842               - {get_param: VirtualIP}
843               - '/cinder'
844         glance_port: {get_param: GlancePort}
845         glance_protocol: {get_param: GlanceProtocol}
846         glance_password: {get_param: GlancePassword}
847         glance_notifier_strategy: {get_param: GlanceNotifierStrategy}
848         glance_log_file: {get_param: GlanceLogFile}
849         glance_dsn:
850           list_join:
851             - ''
852             - - 'mysql://glance:'
853               - {get_param: GlancePassword}
854               - '@'
855               - {get_param: VirtualIP}
856               - '/glance'
857         heat_password: {get_param: HeatPassword}
858         heat_stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
859         heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey}
860         heat_dsn:
861           list_join:
862             - ''
863             - - 'mysql://heat:'
864               - {get_param: HeatPassword}
865               - '@'
866               - {get_param: VirtualIP}
867               - '/heat'
868         keystone_ca_certificate: {get_param: KeystoneCACertificate}
869         keystone_signing_key: {get_param: KeystoneSigningKey}
870         keystone_signing_certificate: {get_param: KeystoneSigningCertificate}
871         keystone_ssl_certificate: {get_param: KeystoneSSLCertificate}
872         keystone_ssl_certificate_key: {get_param: KeystoneSSLCertificateKey}
873         keystone_dsn:
874           list_join:
875             - ''
876             - - 'mysql://keystone:'
877               - {get_param: AdminToken}
878               - '@'
879               - {get_param: VirtualIP}
880               - '/keystone'
881         mongodb_no_journal: {get_param: MongoDbNoJournal}
882         mysql_innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
883         mysql_root_password: {get_param: MysqlRootPassword}
884         mysql_cluster_name:
885           str_replace:
886             template: tripleo-CLUSTER
887             params:
888               CLUSTER: {get_param: MysqlClusterUniquePart}
889         neutron_flat_networks: {get_param: NeutronFlatNetworks}
890         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
891         neutron_agent_mode: {get_param: NeutronAgentMode}
892         neutron_router_distributed: {get_param: NeutronDVR}
893         neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
894         neutron_allow_l3agent_failover: {get_param: NeutronAllowL3AgentFailover}
895         neutron_l3_ha: {get_param: NeutronL3HA}
896         neutron_dhcp_agents_per_network: {get_param: NeutronDhcpAgentsPerNetwork}
897         neutron_network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
898         neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
899         neutron_public_interface: {get_param: NeutronPublicInterface}
900         neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
901         neutron_public_interface_default_route: {get_param: NeutronPublicInterfaceDefaultRoute}
902         neutron_public_interface_tag: {get_param: NeutronPublicInterfaceTag}
903         neutron_tenant_network_type: {get_param: NeutronNetworkType}
904         neutron_tunnel_types: {get_param: NeutronTunnelTypes}
905         neutron_password: {get_param: NeutronPassword}
906         neutron_dnsmasq_options: {get_param: NeutronDnsmasqOptions}
907         neutron_dsn:
908           list_join:
909             - ''
910             - - 'mysql://neutron:'
911               - {get_param: NeutronPassword}
912               - '@'
913               - {get_param: VirtualIP}
914               - '/ovs_neutron?charset=utf8'
915         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
916         ceilometer_password: {get_param: CeilometerPassword}
917         ceilometer_dsn:
918           list_join:
919             - ''
920             - - 'mysql://ceilometer:'
921               - {get_param: CeilometerPassword}
922               - '@'
923               - {get_param: VirtualIP}
924               - '/ceilometer'
925         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
926         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
927         nova_password: {get_param: NovaPassword}
928         nova_dsn:
929           list_join:
930             - ''
931             - - 'mysql://nova:'
932               - {get_param: NovaPassword}
933               - '@'
934               - {get_param: VirtualIP}
935               - '/nova'
936         rabbit_username: {get_param: RabbitUserName}
937         rabbit_password: {get_param: RabbitPassword}
938         rabbit_cookie: {get_param: RabbitCookie}
939         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
940         rabbit_client_port: {get_param: RabbitClientPort}
941         ntp_server: {get_param: NtpServer}
942         control_virtual_interface: {get_param: ControlVirtualInterface}
943         public_virtual_interface: {get_param: PublicVirtualInterface}
944         public_virtual_ip: {get_param: PublicVirtualIP}
945
946   SSLConfig:
947     type: OS::Heat::StructuredConfig
948     properties:
949       group: os-apply-config
950       config:
951         ssl:
952           ca_certificate: {get_input: ssl_ca_certificate}
953         stunnel:
954           cert: {get_input: ssl_certificate}
955           key: {get_input: ssl_key}
956           cacert: {get_input: ssl_ca_certificate}
957           ports:
958            - name: 'ec2'
959              accept: 13773
960              connect: 8773
961              connect_host: {get_input: controller_host}
962            - name: 'image'
963              accept: 13292
964              connect: 9292
965              connect_host: {get_input: controller_host}
966            - name: 'identity'
967              accept: 13000
968              connect: 5000
969              connect_host: {get_input: controller_host}
970            - name: 'network'
971              accept: 13696
972              connect: 9696
973              connect_host: {get_input: controller_host}
974            - name: 'compute'
975              accept: 13774
976              connect: 8774
977              connect_host: {get_input: controller_host}
978            - name: 'swift-proxy'
979              accept: 13080
980              connect: 8080
981              connect_host: {get_input: controller_host}
982            - name: 'cinder'
983              accept: 13776
984              connect: 8776
985              connect_host: {get_input: controller_host}
986            - name: 'ceilometer'
987              accept: 13777
988              connect: 8777
989              connect_host: {get_input: controller_host}
990
991   ControllerSSLDeployment:
992     type: OS::Heat::StructuredDeployment
993     properties:
994       config: {get_resource: SSLConfig}
995       server: {get_resource: Controller}
996       signal_transport: NO_SIGNAL
997       input_values:
998         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
999         ssl_certificate: {get_param: SSLCertificate}
1000         ssl_key: {get_param: SSLKey}
1001         ssl_ca_certificate: {get_param: SSLCACertificate}
1002
1003   ControllerPassthroughDeployment:
1004     type: OS::Heat::StructuredDeployment
1005     properties:
1006       config: {get_resource: ControllerPassthroughConfig}
1007       server: {get_resource: Controller}
1008       signal_transport: NO_SIGNAL
1009       input_values:
1010         passthrough_config: {get_param: ExtraConfig}
1011
1012   ControllerPassthroughSpecificDeployment:
1013     depends_on: [ControllerPassthroughDeployment]
1014     type: OS::Heat::StructuredDeployment
1015     properties:
1016       config: {get_resource: ControllerPassthroughConfigSpecific}
1017       server: {get_resource: Controller}
1018       signal_transport: NO_SIGNAL
1019       input_values:
1020         passthrough_config_specific: {get_param: ControllerExtraConfig}
1021
1022   SwiftConfig:
1023     type: OS::Heat::StructuredConfig
1024     properties:
1025       group: os-apply-config
1026       config:
1027         swift:
1028           hash: { get_input: swift_hash_suffix }
1029           part-power: { get_input: swift_part_power }
1030           mount-check: { get_input: swift_mount_check }
1031           min-part-hours: { get_input: swift_min_part_hours }
1032           replicas: {get_input: swift_replicas }
1033           service-password: { get_input: swift_password }
1034
1035   SwiftStorageDeploy:
1036     type: OS::Heat::StructuredDeployment
1037     properties:
1038       server: {get_resource: Controller}
1039       config: {get_resource: SwiftConfig}
1040       signal_transport: NO_SIGNAL
1041       input_values:
1042         swift_hash_suffix: {get_param: SwiftHashSuffix}
1043         swift_mount_check: {get_param: SwiftMountCheck}
1044         swift_password: {get_param: SwiftPassword}
1045         swift_min_part_hours: {get_param: SwiftMinPartHours}
1046         swift_part_power: {get_param: SwiftPartPower}
1047         swift_replicas: { get_param: SwiftReplicas}
1048
1049 outputs:
1050   ip_address:
1051     description: IP address of the server in the ctlplane network
1052     value: {get_attr: [Controller, networks, ctlplane, 0]}
1053   external_ip_address:
1054     description: IP address of the server in the external network
1055     value: {get_attr: [ExternalPort, ip_address]}
1056   internal_api_ip_address:
1057     description: IP address of the server in the internal_api network
1058     value: {get_attr: [InternalApiPort, ip_address]}
1059   storage_ip_address:
1060     description: IP address of the server in the storage network
1061     value: {get_attr: [StoragePort, ip_address]}
1062   storage_mgmt_ip_address:
1063     description: IP address of the server in the storage_mgmt network
1064     value: {get_attr: [StorageMgmtPort, ip_address]}
1065   tenant_ip_address:
1066     description: IP address of the server in the tenant network
1067     value: {get_attr: [TenantPort, ip_address]}
1068   hostname:
1069     description: Hostname of the server
1070     value: {get_attr: [Controller, name]}
1071   corosync_node:
1072     description: >
1073       Node object in the format {ip: ..., name: ...} format that the corosync
1074       element expects
1075     value:
1076       ip: {get_attr: [Controller, networks, ctlplane, 0]}
1077       name: {get_attr: [Controller, name]}
1078   hosts_entry:
1079     description: >
1080       Server's IP address and hostname in the /etc/hosts format
1081     value:
1082       str_replace:
1083         template: IP HOST CLOUDNAME
1084         params:
1085           IP: {get_attr: [Controller, networks, ctlplane, 0]}
1086           HOST: {get_attr: [Controller, name]}
1087           CLOUDNAME: {get_param: CloudName}
1088   nova_server_resource:
1089     description: Heat resource handle for the Nova compute server
1090     value:
1091       {get_resource: Controller}
1092   swift_device:
1093     description: Swift device formatted for swift-ring-builder
1094     value:
1095       str_replace:
1096         template: 'r1z1-IP:%PORT%/d1'
1097         params:
1098           IP: {get_attr: [Controller, networks, ctlplane, 0]}
1099   swift_proxy_memcache:
1100     description: Swift proxy-memcache value
1101     value:
1102       str_replace:
1103         template: "IP:11211"
1104         params:
1105           IP: {get_attr: [Controller, networks, ctlplane, 0]}
1106   config_identifier:
1107     description: identifier which changes if the node configuration may need re-applying
1108     value: "None - NO_SIGNAL"