Merge "Fix Puppet Configuring NetApp Cinder Backend"
[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: 4096
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   NeutronTunnelIdRanges:
368     description: |
369         Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
370         of GRE tunnel IDs that are available for tenant network allocation
371     default: ["1:1000", ]
372     type: comma_delimited_list
373   NeutronVniRanges:
374     description: |
375         Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
376         of VXLAN VNI IDs that are available for tenant network allocation
377     default: ["1:1000", ]
378     type: comma_delimited_list
379   NovaPassword:
380     default: unset
381     description: The password for the nova service and db account, used by nova-api.
382     type: string
383     hidden: true
384   MongoDbNoJournal:
385     default: false
386     description: Should MongoDb journaling be disabled
387     type: boolean
388   NtpServer:
389     type: string
390     default: ''
391   PcsdPassword:
392     type: string
393     description: The password for the 'pcsd' user.
394   PublicVirtualInterface:
395     default: 'br-ex'
396     description: >
397         Specifies the interface where the public-facing virtual ip will be assigned.
398         This should be int_public when a VLAN is being used.
399     type: string
400   PublicVirtualIP:
401     type: string
402     default: ''  # Has to be here because of the ignored empty value bug
403   RabbitCookie:
404     type: string
405     default: ''  # Has to be here because of the ignored empty value bug
406     hidden: true
407   RabbitPassword:
408     default: guest
409     description: The password for RabbitMQ
410     type: string
411     hidden: true
412   RabbitUserName:
413     default: guest
414     description: The username for RabbitMQ
415     type: string
416   RabbitClientUseSSL:
417     default: false
418     description: >
419         Rabbit client subscriber parameter to specify
420         an SSL connection to the RabbitMQ host.
421     type: string
422   RabbitClientPort:
423     default: 5672
424     description: Set rabbit subscriber port, change this if using SSL
425     type: number
426   RedisVirtualIP:
427     type: string
428     default: ''  # Has to be here because of the ignored empty value bug
429   SnmpdReadonlyUserName:
430     default: ro_snmp_user
431     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
432     type: string
433   SnmpdReadonlyUserPassword:
434     default: unset
435     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
436     type: string
437     hidden: true
438   SSLCACertificate:
439     default: ''
440     description: If set, the contents of an SSL certificate authority file.
441     type: string
442   SSLCertificate:
443     default: ''
444     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
445     type: string
446     hidden: true
447   SSLKey:
448     default: ''
449     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
450     type: string
451     hidden: true
452   SwiftHashSuffix:
453     default: unset
454     description: A random string to be used as a salt when hashing to determine mappings
455       in the ring.
456     hidden: true
457     type: string
458   SwiftMountCheck:
459     default: 'false'
460     description: Value of mount_check in Swift account/container/object -server.conf
461     type: boolean
462   SwiftMinPartHours:
463     type: number
464     default: 1
465     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
466   SwiftPartPower:
467     default: 10
468     description: Partition Power to use when building Swift rings
469     type: number
470   SwiftPassword:
471     default: unset
472     description: The password for the swift service account, used by the swift proxy
473       services.
474     hidden: true
475     type: string
476   SwiftReplicas:
477     type: number
478     default: 3
479     description: How many replicas to use in the swift rings.
480   VirtualIP:
481     type: string
482     default: ''  # Has to be here because of the ignored empty value bug
483   HeatApiVirtualIP:
484     type: string
485     default: ''
486   GlanceApiVirtualIP:
487     type: string
488     default: ''
489   MysqlVirtualIP:
490     type: string
491     default: ''
492   KeystonePublicApiVirtualIP:
493     type: string
494     default: ''
495   NeutronApiVirtualIP:
496     type: string
497     default: ''
498   ServiceNetMap:
499     default: {}
500     description: Mapping of service_name -> network name. Typically set
501                  via parameter_defaults in the resource registry.
502     type: json
503   UpdateIdentifier:
504     default: ''
505     type: string
506     description: >
507       Setting to a previously unused value during stack-update will trigger
508       package update on all nodes
509   Hostname:
510     type: string
511     default: '' # Defaults to Heat created hostname
512
513 resources:
514
515   Controller:
516     type: OS::Nova::Server
517     properties:
518       image: {get_param: Image}
519       image_update_policy: {get_param: ImageUpdatePolicy}
520       flavor: {get_param: Flavor}
521       key_name: {get_param: KeyName}
522       networks:
523         - network: ctlplane
524       user_data_format: SOFTWARE_CONFIG
525       user_data: {get_resource: NodeUserData}
526       name: {get_param: Hostname}
527
528   NodeUserData:
529     type: OS::TripleO::NodeUserData
530
531   ExternalPort:
532     type: OS::TripleO::Controller::Ports::ExternalPort
533     properties:
534       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
535
536   InternalApiPort:
537     type: OS::TripleO::Controller::Ports::InternalApiPort
538     properties:
539       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
540
541   StoragePort:
542     type: OS::TripleO::Controller::Ports::StoragePort
543     properties:
544       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
545
546   StorageMgmtPort:
547     type: OS::TripleO::Controller::Ports::StorageMgmtPort
548     properties:
549       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
550
551   TenantPort:
552     type: OS::TripleO::Controller::Ports::TenantPort
553     properties:
554       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
555
556   NetworkConfig:
557     type: OS::TripleO::Controller::Net::SoftwareConfig
558     properties:
559       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
560       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
561       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
562       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
563       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
564
565   NetworkDeployment:
566     type: OS::TripleO::SoftwareDeployment
567     properties:
568       signal_transport: NO_SIGNAL
569       config: {get_resource: NetworkConfig}
570       server: {get_resource: Controller}
571       input_values:
572         bridge_name: br-ex
573         interface_name: {get_param: NeutronPublicInterface}
574
575   ControllerPassthroughConfig:
576     type: OS::Heat::StructuredConfig
577     properties:
578       group: os-apply-config
579       config: {get_input: passthrough_config}
580
581   ControllerPassthroughConfigSpecific:
582     type: OS::Heat::StructuredConfig
583     properties:
584       group: os-apply-config
585       config: {get_input: passthrough_config_specific}
586
587   ControllerConfig:
588     type: OS::Heat::StructuredConfig
589     properties:
590       group: os-apply-config
591       config:
592         admin-password: {get_input: admin_password}
593         admin-token: {get_input: admin_token}
594         bootstack:
595           public_interface_ip: {get_input: neutron_public_interface_ip}
596         bootstrap_host:
597           nodeid: {get_input: bootstack_nodeid}
598         cinder:
599           db: {get_input: cinder_dsn}
600           debug: {get_input: debug}
601           volume_size_mb: {get_input: cinder_lvm_loop_device_size}
602           service-password: {get_input: cinder_password}
603           iscsi-helper: {get_input: CinderISCSIHelper}
604         controller-address: {get_input: controller_host}
605         corosync:
606           bindnetaddr: {get_input: controller_host}
607           mcastport: 5577
608         pacemaker:
609           stonith_enabled : false
610           recheck_interval : 5
611           quorum_policy : ignore
612         db-password: unset
613         glance:
614           registry:
615             host: {get_input: controller_virtual_ip}
616           backend: swift
617           db: {get_input: glance_dsn}
618           debug: {get_input: debug}
619           host: {get_input: controller_virtual_ip}
620           port: {get_input: glance_port}
621           protocol: {get_input: glance_protocol}
622           service-password: {get_input: glance_password}
623           swift-store-user: service:glance
624           swift-store-key: {get_input: glance_password}
625           notifier-strategy: {get_input: glance_notifier_strategy}
626           log-file: {get_input: glance_log_file}
627         heat:
628           admin_password: {get_input: heat_password}
629           admin_tenant_name: service
630           admin_user: heat
631           auth_encryption_key: {get_input: heat_auth_encryption_key}
632           db: {get_input: heat_dsn}
633           debug: {get_input: debug}
634           stack_domain_admin_password: {get_input: heat_stack_domain_admin_password}
635           watch_server_url: {get_input: heat.watch_server_url}
636           metadata_server_url: {get_input: heat.metadata_server_url}
637           waitcondition_server_url: {get_input: heat.waitcondition_server_url}
638         keystone:
639           db: {get_input: keystone_dsn}
640           debug: {get_input: debug}
641           host: {get_input: controller_virtual_ip}
642           ca_certificate: {get_input: keystone_ca_certificate}
643           signing_key: {get_input: keystone_signing_key}
644           signing_certificate: {get_input: keystone_signing_certificate}
645           ssl:
646               certificate: {get_input: keystone_ssl_certificate}
647               certificate_key: {get_input: keystone_ssl_certificate_key}
648         mysql:
649           innodb_buffer_pool_size: {get_input: mysql_innodb_buffer_pool_size}
650           local_bind: true
651           root-password: {get_input: mysql_root_password}
652           cluster_name: {get_input: mysql_cluster_name}
653         neutron:
654           debug: {get_input: debug}
655           flat-networks: {get_input: neutron_flat_networks}
656           host: {get_input: controller_virtual_ip}
657           metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
658           agent_mode: {get_input: neutron_agent_mode}
659           router_distributed: {get_input: neutron_router_distributed}
660           mechanism_drivers: {get_input: neutron_mechanism_drivers}
661           allow_automatic_l3agent_failover: {get_input: neutron_allow_l3agent_failover}
662           l3_ha: {get_input: neutron_l3_ha}
663           dhcp_agents_per_network: {get_input: neutron_dhcp_agents_per_network}
664           ovs:
665             enable_tunneling: {get_input: neutron_enable_tunneling}
666             local_ip: {get_input: controller_host}
667             network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
668             bridge_mappings: {get_input: neutron_bridge_mappings}
669             public_interface: {get_input: neutron_public_interface}
670             public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
671             public_interface_route: {get_input: neutron_public_interface_default_route}
672             public_interface_tag: {get_input: neutron_public_interface_tag}
673             physical_bridge: br-ex
674             tenant_network_type: {get_input: neutron_tenant_network_type}
675             tunnel_types: {get_input: neutron_tunnel_types}
676             tunnel_id_ranges: {get_input: neutron_tunnel_id_ranges}
677             vni_ranges: {get_input: neutron_vni_ranges}
678           ovs_db: {get_input: neutron_dsn}
679           service-password: {get_input: neutron_password}
680           dnsmasq-options: {get_input: neutron_dnsmasq_options}
681         ceilometer:
682           db: {get_input: ceilometer_dsn}
683           debug: {get_input: debug}
684           metering_secret: {get_input: ceilometer_metering_secret}
685           service-password: {get_input: ceilometer_password}
686         snmpd:
687           export_MIB: UCD-SNMP-MIB
688           readonly_user_name: {get_input: snmpd_readonly_user_name}
689           readonly_user_password: {get_input: snmpd_readonly_user_password}
690         nova:
691           compute_driver: libvirt.LibvirtDriver
692           db: {get_input: nova_dsn}
693           default_floating_pool:
694             ext-net
695           host: {get_input: controller_virtual_ip}
696           metadata-proxy: true
697           service-password: {get_input: nova_password}
698         mongodb:
699           nojournal: {get_input: mongodb_no_journal}
700         rabbit:
701           host: {get_input: controller_virtual_ip}
702           username: {get_input: rabbit_username}
703           password: {get_input: rabbit_password}
704           cookie: {get_input: rabbit_cookie}
705           rabbit_client_use_ssl: {get_input: rabbit_client_use_ssl}
706           rabbit_port: {get_input: rabbit_client_port}
707         ntp:
708           servers:
709               - {server: {get_input: ntp_server}}
710         virtual_interfaces:
711           instances:
712             - vrrp_instance_name: VI_CONTROL
713               virtual_router_id: 51
714               keepalive_interface: {get_input: control_virtual_interface}
715               priority: 101
716               virtual_ips:
717               - ip: {get_input: controller_virtual_ip}
718                 interface: {get_input: control_virtual_interface}
719             - vrrp_instance_name: VI_PUBLIC
720               virtual_router_id: 52
721               keepalive_interface: {get_input: public_virtual_interface}
722               priority: 101
723               virtual_ips:
724               - ip: {get_input: public_virtual_ip}
725                 interface: {get_input: public_virtual_interface}
726           vrrp_sync_groups:
727             - name: VG1
728               members:
729                 - VI_CONTROL
730                 - VI_PUBLIC
731         keepalived:
732           keepalive_interface: {get_input: public_virtual_interface}
733           priority: 101
734         virtual_ips:
735             -
736               ip: {get_input: controller_virtual_ip}
737               interface: {get_input: control_virtual_interface}
738             -
739               ip: {get_input: public_virtual_ip}
740               interface: {get_input: public_virtual_interface}
741         haproxy:
742           net_binds:
743             - ip: {get_input: controller_virtual_ip}
744           options:
745             - option httpchk GET /
746           services:
747             - name: keystone_admin
748               port: 35357
749               net_binds: &public_binds
750                 - ip: {get_input: controller_virtual_ip}
751                 - ip: {get_input: public_virtual_ip}
752             - name: keystone_public
753               port: 5000
754               net_binds: *public_binds
755             - name: horizon
756               port: 80
757               net_binds: *public_binds
758             - name: neutron
759               port: 9696
760               net_binds: *public_binds
761             - name: cinder
762               port: 8776
763               net_binds: *public_binds
764             - name: glance_api
765               port: 9292
766               net_binds: *public_binds
767             - name: glance_registry
768               port: 9191
769               net_binds: *public_binds
770               options: # overwrite options as glace_reg needs auth for http req
771             - name: heat_api
772               port: 8004
773               net_binds: *public_binds
774             - name: heat_cloudwatch
775               port: 8003
776               net_binds: *public_binds
777             - name: heat_cfn
778               port: 8000
779               net_binds: *public_binds
780             - name: mysql
781               port: 3306
782               extra_server_params:
783                 - backup
784               options:
785                 - timeout client 0
786                 - timeout server 0
787             - name: nova_ec2
788               port: 8773
789             - name: nova_osapi
790               port: 8774
791               net_binds: *public_binds
792             - name: nova_metadata
793               port: 8775
794               net_binds: *public_binds
795             - name: nova_novncproxy
796               port: 6080
797               net_binds: *public_binds
798             - name: ceilometer
799               port: 8777
800               net_binds: *public_binds
801               options: # overwrite options as ceil needs auth for http req
802             - name: swift_proxy_server
803               port: 8080
804               net_binds: *public_binds
805               options:
806                 - option httpchk GET /info
807             - name: rabbitmq
808               port: 5672
809               options:
810                 - timeout client 0
811                 - timeout server 0
812                 - maxconn 1500
813
814   ControllerDeployment:
815     type: OS::TripleO::SoftwareDeployment
816     properties:
817       signal_transport: NO_SIGNAL
818       config: {get_resource: ControllerConfig}
819       server: {get_resource: Controller}
820       input_values:
821         bootstack_nodeid: {get_attr: [Controller, name]}
822         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
823         controller_virtual_ip: {get_param: VirtualIP}
824         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
825         heat.watch_server_url:
826           list_join:
827             - ''
828             - - 'http://'
829               - {get_param: VirtualIP}
830               - ':8003'
831         heat.metadata_server_url:
832           list_join:
833             - ''
834             - - 'http://'
835               - {get_param: VirtualIP}
836               - ':8000'
837         heat.waitcondition_server_url:
838           list_join:
839             - ''
840             - - 'http://'
841               - {get_param: VirtualIP}
842               - ':8000/v1/waitcondition'
843         admin_password: {get_param: AdminPassword}
844         admin_token: {get_param: AdminToken}
845         neutron_public_interface_ip: {get_param: NeutronPublicInterfaceIP}
846         debug: {get_param: Debug}
847         cinder_lvm_loop_device_size: {get_param: CinderLVMLoopDeviceSize}
848         cinder_password: {get_param: CinderPassword}
849         cinder_iscsi_helper: {get_param: CinderISCSIHelper}
850         cinder_dsn:
851           list_join:
852             - ''
853             - - 'mysql://cinder:'
854               - {get_param: CinderPassword}
855               - '@'
856               - {get_param: VirtualIP}
857               - '/cinder'
858         glance_port: {get_param: GlancePort}
859         glance_protocol: {get_param: GlanceProtocol}
860         glance_password: {get_param: GlancePassword}
861         glance_notifier_strategy: {get_param: GlanceNotifierStrategy}
862         glance_log_file: {get_param: GlanceLogFile}
863         glance_dsn:
864           list_join:
865             - ''
866             - - 'mysql://glance:'
867               - {get_param: GlancePassword}
868               - '@'
869               - {get_param: VirtualIP}
870               - '/glance'
871         heat_password: {get_param: HeatPassword}
872         heat_stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
873         heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey}
874         heat_dsn:
875           list_join:
876             - ''
877             - - 'mysql://heat:'
878               - {get_param: HeatPassword}
879               - '@'
880               - {get_param: VirtualIP}
881               - '/heat'
882         keystone_ca_certificate: {get_param: KeystoneCACertificate}
883         keystone_signing_key: {get_param: KeystoneSigningKey}
884         keystone_signing_certificate: {get_param: KeystoneSigningCertificate}
885         keystone_ssl_certificate: {get_param: KeystoneSSLCertificate}
886         keystone_ssl_certificate_key: {get_param: KeystoneSSLCertificateKey}
887         keystone_dsn:
888           list_join:
889             - ''
890             - - 'mysql://keystone:'
891               - {get_param: AdminToken}
892               - '@'
893               - {get_param: VirtualIP}
894               - '/keystone'
895         mongodb_no_journal: {get_param: MongoDbNoJournal}
896         mysql_innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
897         mysql_root_password: {get_param: MysqlRootPassword}
898         mysql_cluster_name:
899           str_replace:
900             template: tripleo-CLUSTER
901             params:
902               CLUSTER: {get_param: MysqlClusterUniquePart}
903         neutron_flat_networks: {get_param: NeutronFlatNetworks}
904         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
905         neutron_agent_mode: {get_param: NeutronAgentMode}
906         neutron_router_distributed: {get_param: NeutronDVR}
907         neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
908         neutron_allow_l3agent_failover: {get_param: NeutronAllowL3AgentFailover}
909         neutron_l3_ha: {get_param: NeutronL3HA}
910         neutron_dhcp_agents_per_network: {get_param: NeutronDhcpAgentsPerNetwork}
911         neutron_network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
912         neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
913         neutron_public_interface: {get_param: NeutronPublicInterface}
914         neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
915         neutron_public_interface_default_route: {get_param: NeutronPublicInterfaceDefaultRoute}
916         neutron_public_interface_tag: {get_param: NeutronPublicInterfaceTag}
917         neutron_tenant_network_type: {get_param: NeutronNetworkType}
918         neutron_tunnel_types: {get_param: NeutronTunnelTypes}
919         neutron_tunnel_id_ranges:
920           str_replace:
921             template: "['RANGES']"
922             params:
923               RANGES:
924                 list_join:
925                 - "','"
926                 - {get_param: NeutronTunnelIdRanges}
927         neutron_vni_ranges:
928           str_replace:
929             template: "['RANGES']"
930             params:
931               RANGES:
932                 list_join:
933                 - "','"
934                 - {get_param: NeutronVniRanges}
935         neutron_password: {get_param: NeutronPassword}
936         neutron_dnsmasq_options: {get_param: NeutronDnsmasqOptions}
937         neutron_dsn:
938           list_join:
939             - ''
940             - - 'mysql://neutron:'
941               - {get_param: NeutronPassword}
942               - '@'
943               - {get_param: VirtualIP}
944               - '/ovs_neutron?charset=utf8'
945         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
946         ceilometer_password: {get_param: CeilometerPassword}
947         ceilometer_dsn:
948           list_join:
949             - ''
950             - - 'mysql://ceilometer:'
951               - {get_param: CeilometerPassword}
952               - '@'
953               - {get_param: VirtualIP}
954               - '/ceilometer'
955         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
956         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
957         nova_password: {get_param: NovaPassword}
958         nova_dsn:
959           list_join:
960             - ''
961             - - 'mysql://nova:'
962               - {get_param: NovaPassword}
963               - '@'
964               - {get_param: VirtualIP}
965               - '/nova'
966         rabbit_username: {get_param: RabbitUserName}
967         rabbit_password: {get_param: RabbitPassword}
968         rabbit_cookie: {get_param: RabbitCookie}
969         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
970         rabbit_client_port: {get_param: RabbitClientPort}
971         ntp_server: {get_param: NtpServer}
972         control_virtual_interface: {get_param: ControlVirtualInterface}
973         public_virtual_interface: {get_param: PublicVirtualInterface}
974         public_virtual_ip: {get_param: PublicVirtualIP}
975
976   SSLConfig:
977     type: OS::Heat::StructuredConfig
978     properties:
979       group: os-apply-config
980       config:
981         ssl:
982           ca_certificate: {get_input: ssl_ca_certificate}
983         stunnel:
984           cert: {get_input: ssl_certificate}
985           key: {get_input: ssl_key}
986           cacert: {get_input: ssl_ca_certificate}
987           ports:
988            - name: 'ec2'
989              accept: 13773
990              connect: 8773
991              connect_host: {get_input: controller_host}
992            - name: 'image'
993              accept: 13292
994              connect: 9292
995              connect_host: {get_input: controller_host}
996            - name: 'identity'
997              accept: 13000
998              connect: 5000
999              connect_host: {get_input: controller_host}
1000            - name: 'network'
1001              accept: 13696
1002              connect: 9696
1003              connect_host: {get_input: controller_host}
1004            - name: 'compute'
1005              accept: 13774
1006              connect: 8774
1007              connect_host: {get_input: controller_host}
1008            - name: 'swift-proxy'
1009              accept: 13080
1010              connect: 8080
1011              connect_host: {get_input: controller_host}
1012            - name: 'cinder'
1013              accept: 13776
1014              connect: 8776
1015              connect_host: {get_input: controller_host}
1016            - name: 'ceilometer'
1017              accept: 13777
1018              connect: 8777
1019              connect_host: {get_input: controller_host}
1020
1021   ControllerSSLDeployment:
1022     type: OS::Heat::StructuredDeployment
1023     properties:
1024       config: {get_resource: SSLConfig}
1025       server: {get_resource: Controller}
1026       signal_transport: NO_SIGNAL
1027       input_values:
1028         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
1029         ssl_certificate: {get_param: SSLCertificate}
1030         ssl_key: {get_param: SSLKey}
1031         ssl_ca_certificate: {get_param: SSLCACertificate}
1032
1033   ControllerPassthroughDeployment:
1034     type: OS::Heat::StructuredDeployment
1035     properties:
1036       config: {get_resource: ControllerPassthroughConfig}
1037       server: {get_resource: Controller}
1038       signal_transport: NO_SIGNAL
1039       input_values:
1040         passthrough_config: {get_param: ExtraConfig}
1041
1042   ControllerPassthroughSpecificDeployment:
1043     depends_on: [ControllerPassthroughDeployment]
1044     type: OS::Heat::StructuredDeployment
1045     properties:
1046       config: {get_resource: ControllerPassthroughConfigSpecific}
1047       server: {get_resource: Controller}
1048       signal_transport: NO_SIGNAL
1049       input_values:
1050         passthrough_config_specific: {get_param: ControllerExtraConfig}
1051
1052   SwiftConfig:
1053     type: OS::Heat::StructuredConfig
1054     properties:
1055       group: os-apply-config
1056       config:
1057         swift:
1058           hash: { get_input: swift_hash_suffix }
1059           part-power: { get_input: swift_part_power }
1060           mount-check: { get_input: swift_mount_check }
1061           min-part-hours: { get_input: swift_min_part_hours }
1062           replicas: {get_input: swift_replicas }
1063           service-password: { get_input: swift_password }
1064
1065   SwiftStorageDeploy:
1066     type: OS::Heat::StructuredDeployment
1067     properties:
1068       server: {get_resource: Controller}
1069       config: {get_resource: SwiftConfig}
1070       signal_transport: NO_SIGNAL
1071       input_values:
1072         swift_hash_suffix: {get_param: SwiftHashSuffix}
1073         swift_mount_check: {get_param: SwiftMountCheck}
1074         swift_password: {get_param: SwiftPassword}
1075         swift_min_part_hours: {get_param: SwiftMinPartHours}
1076         swift_part_power: {get_param: SwiftPartPower}
1077         swift_replicas: { get_param: SwiftReplicas}
1078
1079 outputs:
1080   ip_address:
1081     description: IP address of the server in the ctlplane network
1082     value: {get_attr: [Controller, networks, ctlplane, 0]}
1083   external_ip_address:
1084     description: IP address of the server in the external network
1085     value: {get_attr: [ExternalPort, ip_address]}
1086   internal_api_ip_address:
1087     description: IP address of the server in the internal_api network
1088     value: {get_attr: [InternalApiPort, ip_address]}
1089   storage_ip_address:
1090     description: IP address of the server in the storage network
1091     value: {get_attr: [StoragePort, ip_address]}
1092   storage_mgmt_ip_address:
1093     description: IP address of the server in the storage_mgmt network
1094     value: {get_attr: [StorageMgmtPort, ip_address]}
1095   tenant_ip_address:
1096     description: IP address of the server in the tenant network
1097     value: {get_attr: [TenantPort, ip_address]}
1098   hostname:
1099     description: Hostname of the server
1100     value: {get_attr: [Controller, name]}
1101   corosync_node:
1102     description: >
1103       Node object in the format {ip: ..., name: ...} format that the corosync
1104       element expects
1105     value:
1106       ip: {get_attr: [Controller, networks, ctlplane, 0]}
1107       name: {get_attr: [Controller, name]}
1108   hosts_entry:
1109     description: >
1110       Server's IP address and hostname in the /etc/hosts format
1111     value:
1112       str_replace:
1113         template: IP HOST CLOUDNAME
1114         params:
1115           IP: {get_attr: [Controller, networks, ctlplane, 0]}
1116           HOST: {get_attr: [Controller, name]}
1117           CLOUDNAME: {get_param: CloudName}
1118   nova_server_resource:
1119     description: Heat resource handle for the Nova compute server
1120     value:
1121       {get_resource: Controller}
1122   swift_device:
1123     description: Swift device formatted for swift-ring-builder
1124     value:
1125       str_replace:
1126         template: 'r1z1-IP:%PORT%/d1'
1127         params:
1128           IP: {get_attr: [Controller, networks, ctlplane, 0]}
1129   swift_proxy_memcache:
1130     description: Swift proxy-memcache value
1131     value:
1132       str_replace:
1133         template: "IP:11211"
1134         params:
1135           IP: {get_attr: [Controller, networks, ctlplane, 0]}
1136   config_identifier:
1137     description: identifier which changes if the node configuration may need re-applying
1138     value: "None - NO_SIGNAL"