Merge "Fixup neutron constraints in older overclouds before updating"
[apex-tripleo-heat-templates.git] / puppet / controller.yaml
1 heat_template_version: 2015-04-30
2
3 description: >
4   OpenStack controller node configured by Puppet.
5
6 parameters:
7   AdminEmail:
8     default: 'admin@example.com'
9     description: The email for the keystone admin account.
10     type: string
11     hidden: true
12   AdminPassword:
13     default: unset
14     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
15     type: string
16     hidden: true
17   AdminToken:
18     default: unset
19     description: The keystone auth secret and db password.
20     type: string
21     hidden: true
22   CeilometerApiVirtualIP:
23     type: string
24     default: ''
25   CeilometerBackend:
26     default: 'mongodb'
27     description: The ceilometer backend type.
28     type: string
29   CeilometerMeteringSecret:
30     default: unset
31     description: Secret shared by the ceilometer services.
32     type: string
33     hidden: true
34   CeilometerPassword:
35     default: unset
36     description: The password for the ceilometer service  and db account.
37     type: string
38     hidden: true
39   CinderApiVirtualIP:
40     type: string
41     default: ''
42   CinderEnableNfsBackend:
43     default: false
44     description: Whether to enable or not the NFS backend for Cinder
45     type: boolean
46   CinderEnableIscsiBackend:
47     default: true
48     description: Whether to enable or not the Iscsi backend for Cinder
49     type: boolean
50   CinderEnableRbdBackend:
51     default: false
52     description: Whether to enable or not the Rbd backend for Cinder
53     type: boolean
54   CinderISCSIHelper:
55     default: tgtadm
56     description: The iSCSI helper to use with cinder.
57     type: string
58   CinderLVMLoopDeviceSize:
59     default: 5000
60     description: The size of the loopback file used by the cinder LVM driver.
61     type: number
62   CinderNfsMountOptions:
63     default: ''
64     description: >
65       Mount options for NFS mounts used by Cinder NFS backend. Effective
66       when CinderEnableNfsBackend is true.
67     type: string
68   CinderNfsServers:
69     default: ''
70     description: >
71       NFS servers used by Cinder NFS backend. Effective when
72       CinderEnableNfsBackend is true.
73     type: comma_delimited_list
74   CinderPassword:
75     default: unset
76     description: The password for the cinder service and db account, used by cinder-api.
77     type: string
78     hidden: true
79   CinderBackendConfig:
80     default: {}
81     description: Contains parameters to configure Cinder backends. Typically
82                  set via parameter_defaults in the resource registry.
83     type: json
84   CloudName:
85     default: ''
86     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
87     type: string
88   ControllerExtraConfig:
89     default: {}
90     description: |
91       Controller specific hiera configuration data to inject into the cluster.
92     type: json
93   ControlVirtualInterface:
94     default: 'br-ex'
95     description: Interface where virtual ip will be assigned.
96     type: string
97   Debug:
98     default: ''
99     description: Set to True to enable debugging on all services.
100     type: string
101   EnableFencing:
102     default: false
103     description: Whether to enable fencing in Pacemaker or not.
104     type: boolean
105   EnableGalera:
106     default: true
107     description: Whether to use Galera instead of regular MariaDB.
108     type: boolean
109   EnableCephStorage:
110     default: false
111     description: Whether to deploy Ceph Storage (OSD) on the Controller
112     type: boolean
113   EnableSwiftStorage:
114     default: true
115     description: Whether to enable Swift Storage on the Controller
116     type: boolean
117   ExtraConfig:
118     default: {}
119     description: |
120       Additional hieradata to inject into the cluster, note that
121       ControllerExtraConfig takes precedence over ExtraConfig.
122     type: json
123   FencingConfig:
124     default: {}
125     description: |
126       Pacemaker fencing configuration. The JSON should have
127       the following structure:
128         {
129           "devices": [
130             {
131               "agent": "AGENT_NAME",
132               "host_mac": "HOST_MAC_ADDRESS",
133               "params": {"PARAM_NAME": "PARAM_VALUE"}
134             }
135           ]
136         }
137       For instance:
138         {
139           "devices": [
140             {
141               "agent": "fence_xvm",
142               "host_mac": "52:54:00:aa:bb:cc",
143               "params": {
144                 "multicast_address": "225.0.0.12",
145                 "port": "baremetal_0",
146                 "manage_fw": true,
147                 "manage_key_file": true,
148                 "key_file": "/etc/fence_xvm.key",
149                 "key_file_password": "abcdef"
150               }
151             }
152           ]
153         }
154     type: json
155   Flavor:
156     description: Flavor for control nodes to request when deploying.
157     type: string
158     constraints:
159       - custom_constraint: nova.flavor
160   GlanceNotifierStrategy:
161     description: Strategy to use for Glance notification queue
162     type: string
163     default: noop
164   GlanceLogFile:
165     description: The filepath of the file to use for logging messages from Glance.
166     type: string
167     default: ''
168   GlancePassword:
169     default: unset
170     description: The password for the glance service and db account, used by the glance services.
171     type: string
172     hidden: true
173   GlanceBackend:
174     default: swift
175     description: The short name of the Glance backend to use. Should be one
176       of swift, rbd, or file
177     type: string
178     constraints:
179     - allowed_values: ['swift', 'file', 'rbd']
180   GlanceFilePcmkDevice:
181     default: ''
182     description: >
183       An exported storage device that should be mounted by Pacemaker
184       as Glance storage. Effective when GlanceFilePcmkManage is true.
185     type: string
186   GlanceFilePcmkFstype:
187     default: 'nfs'
188     description: >
189       Filesystem type for Pacemaker mount used as Glance storage.
190       Effective when GlanceFilePcmkManage is true.
191     type: string
192   GlanceFilePcmkManage:
193     default: false
194     description: >
195       Whether to make Glance file backend a mount managed by Pacemaker.
196       Effective when GlanceBackend is 'file'.
197     type: boolean
198   GlanceFilePcmkOptions:
199     default: ''
200     description: >
201       Mount options for Pacemaker mount used as Glance storage.
202       Effective when GlanceFilePcmkManage is true.
203     type: string
204   HAProxySyslogAddress:
205     default: /dev/log
206     description: Syslog address where HAproxy will send its log
207     type: string
208   HeatPassword:
209     default: unset
210     description: The password for the Heat service and db account, used by the Heat services.
211     type: string
212     hidden: true
213   HeatStackDomainAdminPassword:
214     description: Password for heat_domain_admin user.
215     type: string
216     default: ''
217     hidden: true
218   HeatAuthEncryptionKey:
219     description: Auth encryption key for heat-engine
220     type: string
221     hidden: true
222   HorizonAllowedHosts:
223     default: '*'
224     description: A list of IP/Hostname allowed to connect to horizon
225     type: comma_delimited_list
226   HorizonSecret:
227     description: Secret key for Django
228     type: string
229     hidden: true
230   Image:
231     type: string
232     default: overcloud-control
233     constraints:
234       - custom_constraint: glance.image
235   ImageUpdatePolicy:
236     default: 'REBUILD_PRESERVE_EPHEMERAL'
237     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
238     type: string
239   KeyName:
240     default: default
241     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
242     type: string
243     constraints:
244       - custom_constraint: nova.keypair
245   KeystoneCACertificate:
246     default: ''
247     description: Keystone self-signed certificate authority certificate.
248     type: string
249   KeystoneSigningCertificate:
250     default: ''
251     description: Keystone certificate for verifying token validity.
252     type: string
253   KeystoneSigningKey:
254     default: ''
255     description: Keystone key for signing tokens.
256     type: string
257     hidden: true
258   KeystoneSSLCertificate:
259     default: ''
260     description: Keystone certificate for verifying token validity.
261     type: string
262   KeystoneSSLCertificateKey:
263     default: ''
264     description: Keystone key for signing tokens.
265     type: string
266     hidden: true
267   KeystoneNotificationDriver:
268     description: Comma-separated list of Oslo notification drivers used by Keystone
269     default: ['messaging']
270     type: comma_delimited_list
271   KeystoneNotificationFormat:
272     description: The Keystone notification format
273     default: 'basic'
274     type: string
275     constraints:
276       - allowed_values: [ 'basic', 'cadf' ]
277   KeystoneRegion:
278     type: string
279     default: 'regionOne'
280     description: Keystone region for endpoint
281   ManageFirewall:
282     default: false
283     description: Whether to manage IPtables rules.
284     type: boolean
285   PurgeFirewallRules:
286     default: false
287     description: Whether IPtables rules should be purged before setting up the new ones.
288     type: boolean
289   MysqlClusterUniquePart:
290     description: A unique identifier of the MySQL cluster the controller is in.
291     type: string
292     default: 'unset'  # Has to be here because of the ignored empty value bug
293     # Drop the validation: https://bugs.launchpad.net/tripleo/+bug/1405446
294     # constraints:
295     # - length: {min: 4, max: 10}
296   MysqlInnodbBufferPoolSize:
297     description: >
298         Specifies the size of the buffer pool in megabytes. Setting to
299         zero should be interpreted as "no value" and will defer to the
300         lower level default.
301     type: number
302     default: 0
303   MysqlMaxConnections:
304     description: Configures MySQL max_connections config setting
305     type: number
306     default: 4096
307   MysqlRootPassword:
308     type: string
309     hidden: true
310     default: ''  # Has to be here because of the ignored empty value bug
311   NeutronExternalNetworkBridge:
312     description: Name of bridge used for external network traffic.
313     type: string
314     default: 'br-ex'
315   NeutronBridgeMappings:
316     description: >
317       The OVS logical->physical bridge mappings to use. See the Neutron
318       documentation for details. Defaults to mapping br-ex - the external
319       bridge on hosts - to a physical name 'datacentre' which can be used
320       to create provider networks (and we use this for the default floating
321       network) - if changing this either use different post-install network
322       scripts or be sure to keep 'datacentre' as a mapping network name.
323     type: string
324     default: "datacentre:br-ex"
325   NeutronDnsmasqOptions:
326     default: 'dhcp-option-force=26,1400'
327     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.
328     type: string
329   NeutronAgentMode:
330     default: 'dvr_snat'
331     description: Agent mode for the neutron-l3-agent on the controller hosts
332     type: string
333   NeutronL3HA:
334     default: 'False'
335     description: Whether to enable l3-agent HA
336     type: string
337   NeutronDhcpAgentsPerNetwork:
338     type: number
339     default: 3
340     description: The number of neutron dhcp agents to schedule per network
341   NeutronDVR:
342     default: 'False'
343     description: Whether to configure Neutron Distributed Virtual Routers
344     type: string
345   NeutronMetadataProxySharedSecret:
346     default: 'unset'
347     description: Shared secret to prevent spoofing
348     type: string
349     hidden: true
350   NeutronCorePlugin:
351     default: 'ml2'
352     description: |
353         The core plugin for Neutron. The value should be the entrypoint to be loaded
354         from neutron.core_plugins namespace.
355     type: string
356   NeutronServicePlugins:
357     default: "router"
358     description: |
359         Comma-separated list of service plugin entrypoints to be loaded from the
360         neutron.service_plugins namespace.
361     type: comma_delimited_list
362   NeutronTypeDrivers:
363     default: "vxlan,vlan,flat,gre"
364     description: |
365         Comma-separated list of network type driver entrypoints to be loaded.
366     type: comma_delimited_list
367   NeutronMechanismDrivers:
368     default: 'openvswitch'
369     description: |
370         The mechanism drivers for the Neutron tenant network. To specify multiple
371         values, use a comma separated string, like so: 'openvswitch,l2_population'
372     type: string
373   NeutronAllowL3AgentFailover:
374     default: 'True'
375     description: Allow automatic l3-agent failover
376     type: string
377   NeutronEnableIsolatedMetadata:
378     default: 'False'
379     description: If True, DHCP provide metadata route to VM.
380     type: string
381   NeutronEnableTunnelling:
382     type: string
383     default: "True"
384   NeutronEnableL2Pop:
385     type: string
386     description: >
387         Enable/disable the L2 population feature in the Neutron agents.
388     default: "False"
389   NeutronFlatNetworks:
390     type: string
391     default: 'datacentre'
392     description: If set, flat networks to configure in neutron plugins.
393   NeutronL3HA:
394     default: 'False'
395     description: Whether to enable l3-agent HA
396     type: string
397   NeutronNetworkType:
398     default: 'vxlan'
399     description: The tenant network type for Neutron, either gre or vxlan.
400     type: string
401   NeutronNetworkVLANRanges:
402     default: 'datacentre'
403     description: >
404       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
405       Neutron documentation for permitted values. Defaults to permitting any
406       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
407     type: comma_delimited_list
408   NeutronPassword:
409     default: unset
410     description: The password for the neutron service and db account, used by neutron agents.
411     type: string
412     hidden: true
413   NeutronPublicInterface:
414     default: nic1
415     description: What interface to bridge onto br-ex for network nodes.
416     type: string
417   NeutronPublicInterfaceTag:
418     default: ''
419     description: >
420       VLAN tag for creating a public VLAN. The tag will be used to
421       create an access port on the exterior bridge for each control plane node,
422       and that port will be given the IP address returned by neutron from the
423       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
424       overcloud.yaml to include the deployment of VLAN ports to the control
425       plane.
426     type: string
427   NeutronPublicInterfaceDefaultRoute:
428     default: ''
429     description: A custom default route for the NeutronPublicInterface.
430     type: string
431   NeutronPublicInterfaceIP:
432     default: ''
433     description: A custom IP address to put onto the NeutronPublicInterface.
434     type: string
435   NeutronPublicInterfaceRawDevice:
436     default: ''
437     description: If set, the public interface is a vlan with this device as the raw device.
438     type: string
439   NeutronTunnelTypes:
440     default: 'vxlan'
441     description: |
442         The tunnel types for the Neutron tenant network. To specify multiple
443         values, use a comma separated string, like so: 'gre,vxlan'
444     type: string
445   NeutronTunnelIdRanges:
446     description: |
447         Comma-separated list of <tun_min>:<tun_max> tuples enumerating ranges
448         of GRE tunnel IDs that are available for tenant network allocation
449     default: ["1:1000", ]
450     type: comma_delimited_list
451   NeutronVniRanges:
452     description: |
453         Comma-separated list of <vni_min>:<vni_max> tuples enumerating ranges
454         of VXLAN VNI IDs that are available for tenant network allocation
455     default: ["1:1000", ]
456     type: comma_delimited_list
457   NovaApiVirtualIP:
458     type: string
459     default: ''
460   NovaPassword:
461     default: unset
462     description: The password for the nova service and db account, used by nova-api.
463     type: string
464     hidden: true
465   MongoDbNoJournal:
466     default: false
467     description: Should MongoDb journaling be disabled
468     type: boolean
469   NtpServer:
470     default: ''
471     description: Comma-separated list of ntp servers
472     type: comma_delimited_list
473   PcsdPassword:
474     type: string
475     description: The password for the 'pcsd' user.
476     hidden: true
477   PublicVirtualInterface:
478     default: 'br-ex'
479     description: >
480         Specifies the interface where the public-facing virtual ip will be assigned.
481         This should be int_public when a VLAN is being used.
482     type: string
483   PublicVirtualIP:
484     type: string
485     default: ''  # Has to be here because of the ignored empty value bug
486   RabbitCookie:
487     type: string
488     default: ''  # Has to be here because of the ignored empty value bug
489     hidden: true
490   RabbitPassword:
491     default: guest
492     description: The password for RabbitMQ
493     type: string
494     hidden: true
495   RabbitUserName:
496     default: guest
497     description: The username for RabbitMQ
498     type: string
499   RabbitClientUseSSL:
500     default: false
501     description: >
502         Rabbit client subscriber parameter to specify
503         an SSL connection to the RabbitMQ host.
504     type: string
505   RabbitClientPort:
506     default: 5672
507     description: Set rabbit subscriber port, change this if using SSL
508     type: number
509   RabbitFDLimit:
510     default: 16384
511     description: Configures RabbitMQ FD limit
512     type: string
513   RedisVirtualIP:
514     type: string
515     default: ''  # Has to be here because of the ignored empty value bug
516   SnmpdReadonlyUserName:
517     default: ro_snmp_user
518     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
519     type: string
520   SnmpdReadonlyUserPassword:
521     default: unset
522     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
523     type: string
524     hidden: true
525   SSLCACertificate:
526     default: ''
527     description: If set, the contents of an SSL certificate authority file.
528     type: string
529   SSLCertificate:
530     default: ''
531     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
532     type: string
533     hidden: true
534   SSLKey:
535     default: ''
536     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
537     type: string
538     hidden: true
539   SwiftHashSuffix:
540     default: unset
541     description: A random string to be used as a salt when hashing to determine mappings
542       in the ring.
543     hidden: true
544     type: string
545   SwiftMountCheck:
546     default: 'false'
547     description: Value of mount_check in Swift account/container/object -server.conf
548     type: boolean
549   SwiftMinPartHours:
550     type: number
551     default: 1
552     description: The minimum time (in hours) before a partition in a ring can be moved following a rebalance.
553   SwiftPartPower:
554     default: 10
555     description: Partition Power to use when building Swift rings
556     type: number
557   SwiftPassword:
558     default: unset
559     description: The password for the swift service account, used by the swift proxy
560       services.
561     hidden: true
562     type: string
563   SwiftProxyVirtualIP:
564     type: string
565     default: ''
566   SwiftReplicas:
567     type: number
568     default: 3
569     description: How many replicas to use in the swift rings.
570   VirtualIP: # DEPRECATED: use per service settings instead
571     type: string
572     default: ''  # Has to be here because of the ignored empty value bug
573   HeatApiVirtualIP:
574     type: string
575     default: ''
576   GlanceApiVirtualIP:
577     type: string
578     default: ''
579   GlanceRegistryVirtualIP:
580     type: string
581     default: ''
582   MysqlVirtualIP:
583     type: string
584     default: ''
585   KeystoneAdminApiVirtualIP:
586     type: string
587     default: ''
588   KeystonePublicApiVirtualIP:
589     type: string
590     default: ''
591   NeutronApiVirtualIP:
592     type: string
593     default: ''
594   EnablePackageInstall:
595     default: 'false'
596     description: Set to true to enable package installation via Puppet
597     type: boolean
598   ServiceNetMap:
599     default: {}
600     description: Mapping of service_name -> network name. Typically set
601                  via parameter_defaults in the resource registry.
602     type: json
603   EndpointMap:
604     default: {}
605     description: Mapping of service endpoint -> protocol. Typically set
606                  via parameter_defaults in the resource registry.
607     type: json
608   UpdateIdentifier:
609     default: ''
610     type: string
611     description: >
612       Setting to a previously unused value during stack-update will trigger
613       package update on all nodes
614   Hostname:
615     type: string
616     default: '' # Defaults to Heat created hostname
617   NetworkDeploymentActions:
618     type: comma_delimited_list
619     description: >
620       Heat action when to apply network configuration changes
621     default: ['CREATE']
622
623 resources:
624
625   Controller:
626     type: OS::Nova::Server
627     properties:
628       image: {get_param: Image}
629       image_update_policy: {get_param: ImageUpdatePolicy}
630       flavor: {get_param: Flavor}
631       key_name: {get_param: KeyName}
632       networks:
633         - network: ctlplane
634       user_data_format: SOFTWARE_CONFIG
635       user_data: {get_resource: UserData}
636       name: {get_param: Hostname}
637
638   # Combine the NodeAdminUserData and NodeUserData mime archives
639   UserData:
640     type: OS::Heat::MultipartMime
641     properties:
642       parts:
643       - config: {get_resource: NodeAdminUserData}
644         type: multipart
645       - config: {get_resource: NodeUserData}
646         type: multipart
647
648   # Creates the "heat-admin" user if configured via the environment
649   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
650   NodeAdminUserData:
651     type: OS::TripleO::NodeAdminUserData
652
653   # For optional operator additional userdata
654   # Should return a OS::Heat::MultipartMime reference via OS::stack_id
655   NodeUserData:
656     type: OS::TripleO::NodeUserData
657
658   ExternalPort:
659     type: OS::TripleO::Controller::Ports::ExternalPort
660     properties:
661       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
662
663   InternalApiPort:
664     type: OS::TripleO::Controller::Ports::InternalApiPort
665     properties:
666       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
667
668   StoragePort:
669     type: OS::TripleO::Controller::Ports::StoragePort
670     properties:
671       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
672
673   StorageMgmtPort:
674     type: OS::TripleO::Controller::Ports::StorageMgmtPort
675     properties:
676       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
677
678   TenantPort:
679     type: OS::TripleO::Controller::Ports::TenantPort
680     properties:
681       ControlPlaneIP: {get_attr: [Controller, networks, ctlplane, 0]}
682
683   NetIpMap:
684     type: OS::TripleO::Network::Ports::NetIpMap
685     properties:
686       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
687       ExternalIp: {get_attr: [ExternalPort, ip_address]}
688       InternalApiIp: {get_attr: [InternalApiPort, ip_address]}
689       StorageIp: {get_attr: [StoragePort, ip_address]}
690       StorageMgmtIp: {get_attr: [StorageMgmtPort, ip_address]}
691       TenantIp: {get_attr: [TenantPort, ip_address]}
692
693   NetIpSubnetMap:
694     type: OS::TripleO::Network::Ports::NetIpSubnetMap
695     properties:
696       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
697       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
698       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
699       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
700       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
701       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
702
703   NetworkConfig:
704     type: OS::TripleO::Controller::Net::SoftwareConfig
705     properties:
706       ControlPlaneIp: {get_attr: [Controller, networks, ctlplane, 0]}
707       ExternalIpSubnet: {get_attr: [ExternalPort, ip_subnet]}
708       InternalApiIpSubnet: {get_attr: [InternalApiPort, ip_subnet]}
709       StorageIpSubnet: {get_attr: [StoragePort, ip_subnet]}
710       StorageMgmtIpSubnet: {get_attr: [StorageMgmtPort, ip_subnet]}
711       TenantIpSubnet: {get_attr: [TenantPort, ip_subnet]}
712
713   NetworkDeployment:
714     type: OS::TripleO::SoftwareDeployment
715     properties:
716       config: {get_resource: NetworkConfig}
717       server: {get_resource: Controller}
718       actions: {get_param: NetworkDeploymentActions}
719       input_values:
720         bridge_name: br-ex
721         interface_name: {get_param: NeutronPublicInterface}
722
723   ControllerDeployment:
724     type: OS::TripleO::SoftwareDeployment
725     depends_on: NetworkDeployment
726     properties:
727       config: {get_resource: ControllerConfig}
728       server: {get_resource: Controller}
729       input_values:
730         bootstack_nodeid: {get_attr: [Controller, name]}
731         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
732         neutron_enable_l2pop: {get_param: NeutronEnableL2Pop}
733         neutron_enable_isolated_metadata: {get_param: NeutronEnableIsolatedMetadata}
734         haproxy_log_address: {get_param: HAProxySyslogAddress}
735         heat.watch_server_url:
736           list_join:
737             - ''
738             - - 'http://'
739               - {get_param: HeatApiVirtualIP}
740               - ':8003'
741         heat.metadata_server_url:
742           list_join:
743             - ''
744             - - 'http://'
745               - {get_param: HeatApiVirtualIP}
746               - ':8000'
747         heat.waitcondition_server_url:
748           list_join:
749             - ''
750             - - 'http://'
751               - {get_param: HeatApiVirtualIP}
752               - ':8000/v1/waitcondition'
753         heat_auth_encryption_key: {get_param: HeatAuthEncryptionKey}
754         horizon_allowed_hosts: {get_param: HorizonAllowedHosts}
755         horizon_secret: {get_param: HorizonSecret}
756         admin_email: {get_param: AdminEmail}
757         admin_password: {get_param: AdminPassword}
758         admin_token: {get_param: AdminToken}
759         neutron_public_interface_ip: {get_param: NeutronPublicInterfaceIP}
760         debug: {get_param: Debug}
761         cinder_enable_nfs_backend: {get_param: CinderEnableNfsBackend}
762         cinder_enable_rbd_backend: {get_param: CinderEnableRbdBackend}
763         cinder_nfs_mount_options: {get_param: CinderNfsMountOptions}
764         cinder_nfs_servers:
765           str_replace:
766             template: "['SERVERS']"
767             params:
768               SERVERS:
769                 list_join:
770                 - "','"
771                 - {get_param: CinderNfsServers}
772         cinder_lvm_loop_device_size: {get_param: CinderLVMLoopDeviceSize}
773         cinder_password: {get_param: CinderPassword}
774         cinder_enable_iscsi_backend: {get_param: CinderEnableIscsiBackend}
775         cinder_iscsi_helper: {get_param: CinderISCSIHelper}
776         cinder_backend_config: {get_param: CinderBackendConfig}
777         cinder_dsn:
778           list_join:
779             - ''
780             - - 'mysql://cinder:'
781               - {get_param: CinderPassword}
782               - '@'
783               - {get_param: MysqlVirtualIP}
784               - '/cinder'
785         glance_port: {get_param: [EndpointMap, GlanceInternal, port]}
786         glance_password: {get_param: GlancePassword}
787         glance_backend: {get_param: GlanceBackend}
788         glance_file_pcmk_device: {get_param: GlanceFilePcmkDevice}
789         glance_file_pcmk_fstype: {get_param: GlanceFilePcmkFstype}
790         glance_file_pcmk_manage: {get_param: GlanceFilePcmkManage}
791         glance_file_pcmk_options: {get_param: GlanceFilePcmkOptions}
792         glance_notifier_strategy: {get_param: GlanceNotifierStrategy}
793         glance_log_file: {get_param: GlanceLogFile}
794         glance_dsn:
795           list_join:
796             - ''
797             - - 'mysql://glance:'
798               - {get_param: GlancePassword}
799               - '@'
800               - {get_param: MysqlVirtualIP}
801               - '/glance'
802         heat_password: {get_param: HeatPassword}
803         heat_stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
804         heat_dsn:
805           list_join:
806             - ''
807             - - 'mysql://heat:'
808               - {get_param: HeatPassword}
809               - '@'
810               - {get_param: MysqlVirtualIP}
811               - '/heat'
812         keystone_ca_certificate: {get_param: KeystoneCACertificate}
813         keystone_signing_key: {get_param: KeystoneSigningKey}
814         keystone_signing_certificate: {get_param: KeystoneSigningCertificate}
815         keystone_ssl_certificate: {get_param: KeystoneSSLCertificate}
816         keystone_ssl_certificate_key: {get_param: KeystoneSSLCertificateKey}
817         keystone_notification_driver: {get_param: KeystoneNotificationDriver}
818         keystone_notification_format: {get_param: KeystoneNotificationFormat}
819         keystone_dsn:
820           list_join:
821             - ''
822             - - 'mysql://keystone:'
823               - {get_param: AdminToken}
824               - '@'
825               - {get_param: MysqlVirtualIP}
826               - '/keystone'
827         keystone_identity_uri: { get_param: [EndpointMap, KeystoneAdmin, uri_no_suffix] }
828         keystone_auth_uri: {get_param: [EndpointMap, KeystoneInternal, uri] }
829         keystone_public_url: { get_param: [EndpointMap, KeystonePublic, uri_no_suffix] }
830         keystone_internal_url: { get_param: [EndpointMap, KeystoneInternal, uri_no_suffix] }
831         keystone_ec2_uri: { get_param: [EndpointMap, KeystoneEC2, uri] }
832         enable_fencing: {get_param: EnableFencing}
833         enable_galera: {get_param: EnableGalera}
834         enable_ceph_storage: {get_param: EnableCephStorage}
835         enable_swift_storage: {get_param: EnableSwiftStorage}
836         manage_firewall: {get_param: ManageFirewall}
837         purge_firewall_rules: {get_param: PurgeFirewallRules}
838         mysql_innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
839         mysql_max_connections: {get_param: MysqlMaxConnections}
840         mysql_root_password: {get_param: MysqlRootPassword}
841         mysql_cluster_name:
842           str_replace:
843             template: tripleo-CLUSTER
844             params:
845               CLUSTER: {get_param: MysqlClusterUniquePart}
846         neutron_flat_networks: {get_param: NeutronFlatNetworks}
847         neutron_metadata_proxy_shared_secret: {get_param: NeutronMetadataProxySharedSecret}
848         neutron_agent_mode: {get_param: NeutronAgentMode}
849         neutron_router_distributed: {get_param: NeutronDVR}
850         neutron_core_plugin: {get_param: NeutronCorePlugin}
851         neutron_service_plugins:
852           str_replace:
853             template: "['PLUGINS']"
854             params:
855               PLUGINS:
856                 list_join:
857                 - "','"
858                 - {get_param: NeutronServicePlugins}
859         neutron_type_drivers:
860           str_replace:
861             template: "['DRIVERS']"
862             params:
863               DRIVERS:
864                 list_join:
865                 - "','"
866                 - {get_param: NeutronTypeDrivers}
867         neutron_mechanism_drivers: {get_param: NeutronMechanismDrivers}
868         neutron_allow_l3agent_failover: {get_param: NeutronAllowL3AgentFailover}
869         neutron_l3_ha: {get_param: NeutronL3HA}
870         neutron_dhcp_agents_per_network: {get_param: NeutronDhcpAgentsPerNetwork}
871         neutron_network_vlan_ranges:
872           str_replace:
873             template: "['RANGES']"
874             params:
875               RANGES:
876                 list_join:
877                 - "','"
878                 - {get_param: NeutronNetworkVLANRanges}
879         neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
880         neutron_external_network_bridge: {get_param: NeutronExternalNetworkBridge}
881         neutron_public_interface: {get_param: NeutronPublicInterface}
882         neutron_public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
883         neutron_public_interface_default_route: {get_param: NeutronPublicInterfaceDefaultRoute}
884         neutron_public_interface_tag: {get_param: NeutronPublicInterfaceTag}
885         neutron_tenant_network_type: {get_param: NeutronNetworkType}
886         neutron_tunnel_types: {get_param: NeutronTunnelTypes}
887         neutron_tunnel_id_ranges:
888           str_replace:
889             template: "['RANGES']"
890             params:
891               RANGES:
892                 list_join:
893                 - "','"
894                 - {get_param: NeutronTunnelIdRanges}
895         neutron_vni_ranges:
896           str_replace:
897             template: "['RANGES']"
898             params:
899               RANGES:
900                 list_join:
901                 - "','"
902                 - {get_param: NeutronVniRanges}
903         neutron_password: {get_param: NeutronPassword}
904         neutron_dnsmasq_options: {get_param: NeutronDnsmasqOptions}
905         neutron_dsn:
906           list_join:
907             - ''
908             - - 'mysql://neutron:'
909               - {get_param: NeutronPassword}
910               - '@'
911               - {get_param: MysqlVirtualIP}
912               - '/ovs_neutron?charset=utf8'
913         neutron_internal_url: { get_param: [ EndpointMap, NeutronInternal, uri ] }
914         neutron_public_url: { get_param: [ EndpointMap, NeutronPublic, uri ] }
915         neutron_admin_url: { get_param: [ EndpointMap, NeutronAdmin, uri ] }
916         neutron_admin_auth_url: { get_param: [ EndpointMap, KeystoneAdmin, uri ] }
917         nova_internal_url: { get_param: [ EndpointMap, NovaInternal, uri ] }
918         ceilometer_backend: {get_param: CeilometerBackend}
919         ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
920         ceilometer_password: {get_param: CeilometerPassword}
921         ceilometer_coordination_url:
922           list_join:
923             - ''
924             - - 'redis://'
925               - {get_param: RedisVirtualIP}
926               - ':6379'
927         ceilometer_dsn:
928           list_join:
929             - ''
930             - - 'mysql://ceilometer:'
931               - {get_param: CeilometerPassword}
932               - '@'
933               - {get_param: MysqlVirtualIP}
934               - '/ceilometer'
935         snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
936         snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
937         nova_password: {get_param: NovaPassword}
938         nova_dsn:
939           list_join:
940             - ''
941             - - 'mysql://nova:'
942               - {get_param: NovaPassword}
943               - '@'
944               - {get_param: MysqlVirtualIP}
945               - '/nova'
946         fencing_config: {get_param: FencingConfig}
947         pcsd_password: {get_param: PcsdPassword}
948         rabbit_username: {get_param: RabbitUserName}
949         rabbit_password: {get_param: RabbitPassword}
950         rabbit_cookie: {get_param: RabbitCookie}
951         rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
952         rabbit_client_port: {get_param: RabbitClientPort}
953         mongodb_no_journal: {get_param: MongoDbNoJournal}
954         # We need to force this into quotes or hiera will return integer causing
955         # the puppet module validation regexp to fail.
956         # Remove when: https://github.com/puppetlabs/puppetlabs-rabbitmq/pull/401
957         rabbit_fd_limit:
958           str_replace:
959             template: "'LIMIT'"
960             params:
961               LIMIT: {get_param: RabbitFDLimit}
962         ntp_servers: {get_param: NtpServer}
963         control_virtual_interface: {get_param: ControlVirtualInterface}
964         public_virtual_interface: {get_param: PublicVirtualInterface}
965         swift_hash_suffix: {get_param: SwiftHashSuffix}
966         swift_password: {get_param: SwiftPassword}
967         swift_part_power: {get_param: SwiftPartPower}
968         swift_replicas: {get_param: SwiftReplicas}
969         swift_min_part_hours: {get_param: SwiftMinPartHours}
970         swift_mount_check: {get_param: SwiftMountCheck}
971         enable_package_install: {get_param: EnablePackageInstall}
972         enable_package_upgrade: {get_attr: [UpdateDeployment, update_managed_packages]}
973         swift_proxy_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftProxyNetwork]}]}
974         swift_management_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}
975         cinder_iscsi_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CinderIscsiNetwork]}]}
976         cinder_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CinderApiNetwork]}]}
977         glance_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, GlanceApiNetwork]}]}
978         glance_registry_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, GlanceRegistryNetwork]}]}
979         glance_api_servers: { get_param: [EndpointMap, GlanceInternal, uri]}
980         glance_registry_host: {get_param: GlanceRegistryVirtualIP}
981         heat_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HeatApiNetwork]}]}
982         keystone_public_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, KeystonePublicApiNetwork]}]}
983         keystone_admin_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, KeystoneAdminApiNetwork]}]}
984         keystone_region: {get_param: KeystoneRegion}
985         mongo_db_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MongoDbNetwork]}]}
986         neutron_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronApiNetwork]}]}
987         neutron_local_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NeutronTenantNetwork]}]}
988         ceilometer_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CeilometerApiNetwork]}]}
989         nova_api_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaApiNetwork]}]}
990         nova_metadata_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, NovaMetadataNetwork]}]}
991         horizon_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, HorizonNetwork]}]}
992         rabbitmq_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RabbitMqNetwork]}]}
993         redis_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, RedisNetwork]}]}
994         redis_vip: {get_param: RedisVirtualIP}
995         memcached_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
996         mysql_network: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MysqlNetwork]}]}
997         mysql_virtual_ip: {get_param: MysqlVirtualIP}
998         ceph_cluster_network: {get_attr: [NetIpSubnetMap, net_ip_subnet_map, {get_param: [ServiceNetMap, CephClusterNetwork]}]}
999         ceph_public_network: {get_attr: [NetIpSubnetMap, net_ip_subnet_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1000         ceph_public_ip: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, CephPublicNetwork]}]}
1001
1002   # Map heat metadata into hiera datafiles
1003   ControllerConfig:
1004     type: OS::Heat::StructuredConfig
1005     properties:
1006       group: os-apply-config
1007       config:
1008         hiera:
1009           hierarchy:
1010             - '"%{::uuid}"'
1011             - heat_config_%{::deploy_config_name}
1012             - controller_extraconfig
1013             - extraconfig
1014             - controller
1015             - database
1016             - object
1017             - swift_devices_and_proxy # provided by SwiftDevicesAndProxyConfig
1018             - ceph_cluster # provided by CephClusterConfig
1019             - ceph
1020             - bootstrap_node # provided by BootstrapNodeConfig
1021             - all_nodes # provided by allNodesConfig
1022             - vip_data # provided by vip-config
1023             - '"%{::osfamily}"'
1024             - common
1025             - cinder_netapp_data # Optionally provided by ControllerExtraConfigPre
1026             - neutron_bigswitch_data # Optionally provided by ControllerExtraConfigPre
1027             - neutron_cisco_data # Optionally provided by ControllerExtraConfigPre
1028             - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
1029           datafiles:
1030             controller_extraconfig:
1031               mapped_data: {get_param: ControllerExtraConfig}
1032             extraconfig:
1033               mapped_data: {get_param: ExtraConfig}
1034             common:
1035               raw_data: {get_file: hieradata/common.yaml}
1036             ceph:
1037               raw_data: {get_file: hieradata/ceph.yaml}
1038               mapped_data:
1039                 ceph::profile::params::cluster_network: {get_input: ceph_cluster_network}
1040                 ceph::profile::params::public_network: {get_input: ceph_public_network}
1041                 ceph::mon::public_addr: {get_input: ceph_public_ip}
1042             database:
1043               raw_data: {get_file: hieradata/database.yaml}
1044             object:
1045               raw_data: {get_file: hieradata/object.yaml}
1046             controller:
1047               raw_data: {get_file: hieradata/controller.yaml}
1048               mapped_data: # data supplied directly to this deployment configuration, etc
1049                 bootstack_nodeid: {get_input: bootstack_nodeid}
1050
1051                 # Pacemaker
1052                 enable_fencing: {get_input: enable_fencing}
1053                 hacluster_pwd: {get_input: pcsd_password}
1054                 tripleo::fencing::config: {get_input: fencing_config}
1055
1056                 # Swift
1057                 swift::proxy::proxy_local_net_ip: {get_input: swift_proxy_network}
1058                 swift::proxy::authtoken::auth_uri: {get_input: keystone_auth_uri}
1059                 swift::proxy::authtoken::identity_uri: {get_input: keystone_identity_uri}
1060                 swift::storage::all::storage_local_net_ip: {get_input: swift_management_network}
1061                 swift::swift_hash_suffix: {get_input: swift_hash_suffix}
1062                 swift::proxy::authtoken::admin_password: {get_input: swift_password}
1063                 tripleo::ringbuilder::part_power: {get_input: swift_part_power}
1064                 tripleo::ringbuilder::replicas: {get_input: swift_replicas}
1065                 tripleo::ringbuilder::min_part_hours: {get_input: swift_min_part_hours}
1066                 swift_mount_check: {get_input: swift_mount_check}
1067
1068                 # NOTE(dprince): build_ring support is currently not wired in.
1069                 # See: https://review.openstack.org/#/c/109225/
1070                 tripleo::ringbuilder::build_ring: True
1071
1072                 # Cinder
1073                 cinder_enable_nfs_backend: {get_input: cinder_enable_nfs_backend}
1074                 cinder_enable_rbd_backend: {get_input: cinder_enable_rbd_backend}
1075                 cinder_nfs_mount_options: {get_input: cinder_nfs_mount_options}
1076                 cinder_nfs_servers: {get_input: cinder_nfs_servers}
1077                 cinder_lvm_loop_device_size: {get_input: cinder_lvm_loop_device_size}
1078                 cinder_iscsi_helper: {get_input: cinder_iscsi_helper}
1079                 cinder_iscsi_ip_address: {get_input: cinder_iscsi_network}
1080                 cinder::database_connection: {get_input: cinder_dsn}
1081                 cinder::api::keystone_password: {get_input: cinder_password}
1082                 cinder::api::auth_uri: {get_input: keystone_auth_uri}
1083                 cinder::api::identity_uri: {get_input: keystone_identity_uri}
1084                 cinder::api::bind_host: {get_input: cinder_api_network}
1085                 cinder::rabbit_userid: {get_input: rabbit_username}
1086                 cinder::rabbit_password: {get_input: rabbit_password}
1087                 cinder::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
1088                 cinder::rabbit_port: {get_input: rabbit_client_port}
1089                 cinder::debug: {get_input: debug}
1090                 cinder_enable_iscsi_backend: {get_input: cinder_enable_iscsi_backend}
1091                 cinder::glance::glance_api_servers: {get_input: glance_api_servers}
1092                 cinder_backend_config: {get_input: CinderBackendConfig}
1093                 cinder::db::mysql::password: {get_input: cinder_password}
1094
1095                 # Glance
1096                 glance::api::bind_port: {get_input: glance_port}
1097                 glance::api::bind_host: {get_input: glance_api_network}
1098                 glance::api::auth_uri: {get_input: keystone_auth_uri}
1099                 glance::api::identity_uri: {get_input: keystone_identity_uri}
1100                 glance::api::registry_host: {get_input: glance_registry_host}
1101                 glance::api::keystone_password: {get_input: glance_password}
1102                 glance::api::debug: {get_input: debug}
1103                 glance_notifier_strategy: {get_input: glance_notifier_strategy}
1104                 glance_log_file: {get_input: glance_log_file}
1105                 glance_log_file: {get_input: glance_log_file}
1106                 glance::api::database_connection: {get_input: glance_dsn}
1107                 glance::registry::keystone_password: {get_input: glance_password}
1108                 glance::registry::database_connection: {get_input: glance_dsn}
1109                 glance::registry::bind_host: {get_input: glance_registry_network}
1110                 glance::registry::auth_uri: {get_input: keystone_auth_uri}
1111                 glance::registry::identity_uri: {get_input: keystone_identity_uri}
1112                 glance::registry::debug: {get_input: debug}
1113                 glance::backend::swift::swift_store_auth_address: {get_input: keystone_auth_uri}
1114                 glance::backend::swift::swift_store_user: service:glance
1115                 glance::backend::swift::swift_store_key: {get_input: glance_password}
1116                 glance_backend: {get_input: glance_backend}
1117                 glance::db::mysql::password: {get_input: glance_password}
1118                 glance_file_pcmk_device: {get_input: glance_file_pcmk_device}
1119                 glance_file_pcmk_fstype: {get_input: glance_file_pcmk_fstype}
1120                 glance_file_pcmk_manage: {get_input: glance_file_pcmk_manage}
1121                 glance_file_pcmk_options: {get_input: glance_file_pcmk_options}
1122
1123                 # Heat
1124                 heat_stack_domain_admin_password: {get_input: heat_stack_domain_admin_password}
1125                 heat::engine::heat_watch_server_url: {get_input: heat.watch_server_url}
1126                 heat::engine::heat_metadata_server_url: {get_input: heat.metadata_server_url}
1127                 heat::engine::heat_waitcondition_server_url: {get_input: heat.waitcondition_server_url}
1128                 heat::engine::auth_encryption_key: {get_input: heat_auth_encryption_key}
1129                 heat::rabbit_userid: {get_input: rabbit_username}
1130                 heat::rabbit_password: {get_input: rabbit_password}
1131                 heat::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
1132                 heat::rabbit_port: {get_input: rabbit_client_port}
1133                 heat::auth_uri: {get_input: keystone_auth_uri}
1134                 heat::keystone_ec2_uri: {get_input: keystone_ec2_uri}
1135                 heat::identity_uri: {get_input: keystone_identity_uri}
1136                 heat::keystone_password: {get_input: heat_password}
1137                 heat::api::bind_host: {get_input: heat_api_network}
1138                 heat::api_cloudwatch::bind_host: {get_input: heat_api_network}
1139                 heat::api_cfn::bind_host: {get_input: heat_api_network}
1140                 heat::database_connection: {get_input: heat_dsn}
1141                 heat::debug: {get_input: debug}
1142                 heat::db::mysql::password: {get_input: heat_password}
1143
1144                 # Keystone
1145                 keystone::admin_token: {get_input: admin_token}
1146                 keystone_ca_certificate: {get_input: keystone_ca_certificate}
1147                 keystone_signing_key: {get_input: keystone_signing_key}
1148                 keystone_signing_certificate: {get_input: keystone_signing_certificate}
1149                 keystone_ssl_certificate: {get_input: keystone_ssl_certificate}
1150                 keystone_ssl_certificate_key: {get_input: keystone_ssl_certificate_key}
1151                 keystone::database_connection: {get_input: keystone_dsn}
1152                 keystone::public_bind_host: {get_input: keystone_public_api_network}
1153                 keystone::admin_bind_host: {get_input: keystone_admin_api_network}
1154                 keystone::debug: {get_input: debug}
1155                 keystone::db::mysql::password: {get_input: admin_token}
1156                 keystone::rabbit_userid: {get_input: rabbit_username}
1157                 keystone::rabbit_password: {get_input: rabbit_password}
1158                 keystone::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
1159                 keystone::rabbit_port: {get_input: rabbit_client_port}
1160                 keystone::notification_driver: {get_input: keystone_notification_driver}
1161                 keystone::notification_format: {get_input: keystone_notification_format}
1162                 keystone::roles::admin::email: {get_input: admin_email}
1163                 keystone::roles::admin::password: {get_input: admin_password}
1164                 keystone::endpoint::public_url: {get_input: keystone_public_url}
1165                 keystone::endpoint::internal_url: {get_input: keystone_internal_url}
1166                 keystone::endpoint::admin_url: {get_input: keystone_identity_uri}
1167                 keystone::endpoint::region: {get_input: keystone_region}
1168                 # MongoDB
1169                 mongodb::server::bind_ip: {get_input: mongo_db_network}
1170                 mongodb::server::nojournal: {get_input: mongodb_no_journal}
1171                 # MySQL
1172                 admin_password: {get_input: admin_password}
1173                 enable_galera: {get_input: enable_galera}
1174                 enable_ceph_storage: {get_input: enable_ceph_storage}
1175                 enable_swift_storage: {get_input: enable_swift_storage}
1176                 mysql_innodb_buffer_pool_size: {get_input: mysql_innodb_buffer_pool_size}
1177                 mysql_max_connections: {get_input: mysql_max_connections}
1178                 mysql::server::root_password: {get_input: mysql_root_password}
1179                 mysql_cluster_name: {get_input: mysql_cluster_name}
1180                 mysql_bind_host: {get_input: mysql_network}
1181                 mysql_virtual_ip: {get_input: mysql_virtual_ip}
1182
1183                 # Neutron
1184                 neutron::bind_host: {get_input: neutron_api_network}
1185                 neutron::rabbit_password: {get_input: rabbit_password}
1186                 neutron::rabbit_user: {get_input: rabbit_username}
1187                 neutron::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
1188                 neutron::rabbit_port: {get_input: rabbit_client_port}
1189                 neutron::debug: {get_input: debug}
1190                 neutron::server::auth_uri: {get_input: keystone_auth_uri}
1191                 neutron::server::identity_uri: {get_input: keystone_identity_uri}
1192                 neutron::server::database_connection: {get_input: neutron_dsn}
1193                 neutron::agents::l3::external_network_bridge: {get_input: neutron_external_network_bridge}
1194                 neutron::agents::ml2::ovs::enable_tunneling: {get_input: neutron_enable_tunneling}
1195                 neutron::agents::ml2::ovs::l2_population: {get_input: neutron_enable_l2pop}
1196                 neutron::agents::dhcp::enable_isolated_metadata: {get_input: neutron_enable_isolated_metadata}
1197                 neutron::agents::ml2::ovs::local_ip: {get_input: neutron_local_ip}
1198                 neutron_flat_networks: {get_input: neutron_flat_networks}
1199                 neutron::agents::metadata::shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
1200                 neutron::agents::metadata::metadata_ip: {get_input: neutron_api_network}
1201                 neutron_agent_mode: {get_input: neutron_agent_mode}
1202                 neutron_router_distributed: {get_input: neutron_router_distributed}
1203                 neutron::core_plugin: {get_input: neutron_core_plugin}
1204                 neutron::service_plugins: {get_input: neutron_service_plugins}
1205                 neutron::plugins::ml2::type_drivers: {get_input: neutron_type_drivers}
1206                 neutron_mechanism_drivers: {get_input: neutron_mechanism_drivers}
1207                 neutron::server::allow_automatic_l3agent_failover: {get_input: neutron_allow_l3agent_failover}
1208                 neutron::server::l3_ha: {get_input: neutron_l3_ha}
1209                 neutron::dhcp_agents_per_network: {get_input: neutron_dhcp_agents_per_network}
1210                 neutron::plugins::ml2::network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
1211                 neutron::plugins::ml2::tunnel_id_ranges: {get_input: neutron_tunnel_id_ranges}
1212                 neutron::plugins::ml2::vni_ranges: {get_input: neutron_vni_ranges}
1213                 neutron_bridge_mappings: {get_input: neutron_bridge_mappings}
1214                 neutron_public_interface: {get_input: neutron_public_interface}
1215                 neutron_public_interface_raw_device: {get_input: neutron_public_interface_raw_device}
1216                 neutron_public_interface_default_route: {get_input: neutron_public_interface_default_route}
1217                 neutron_public_interface_tag: {get_input: neutron_public_interface_tag}
1218                 neutron_tenant_network_type: {get_input: neutron_tenant_network_type}
1219                 neutron_tunnel_types: {get_input: neutron_tunnel_types}
1220                 neutron::server::auth_password: {get_input: neutron_password}
1221                 neutron::agents::metadata::auth_password: {get_input: neutron_password}
1222                 neutron_dnsmasq_options: {get_input: neutron_dnsmasq_options}
1223                 neutron_dsn: {get_input: neutron_dsn}
1224                 neutron::agents::metadata::auth_url: {get_input: keystone_identity_uri}
1225                 neutron::db::mysql::password: {get_input: neutron_password}
1226                 neutron::keystone::auth::public_url: {get_input: neutron_public_url }
1227                 neutron::keystone::auth::internal_url: {get_input: neutron_internal_url }
1228                 neutron::keystone::auth::admin_url: {get_input: neutron_admin_url }
1229                 neutron::keystone::auth::password: {get_input: neutron_password }
1230                 neutron::keystone::auth::region: {get_input: keystone_region}
1231                 neutron::server::notifications::nova_url: {get_input: nova_internal_url}
1232                 neutron::server::notifications::auth_url: {get_input: neutron_admin_auth_url}
1233                 neutron::server::notifications::tenant_name: 'service'
1234                 neutron::server::notifications::password: {get_input: nova_password}
1235
1236                 # Ceilometer
1237                 ceilometer_backend: {get_input: ceilometer_backend}
1238                 ceilometer_mysql_conn_string: {get_input: ceilometer_dsn}
1239                 ceilometer::metering_secret: {get_input: ceilometer_metering_secret}
1240                 ceilometer::rabbit_userid: {get_input: rabbit_username}
1241                 ceilometer::rabbit_password: {get_input: rabbit_password}
1242                 ceilometer::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
1243                 ceilometer::rabbit_port: {get_input: rabbit_client_port}
1244                 ceilometer::debug: {get_input: debug}
1245                 ceilometer::api::host: {get_input: ceilometer_api_network}
1246                 ceilometer::api::keystone_password: {get_input: ceilometer_password}
1247                 ceilometer::api::keystone_auth_uri: {get_input: keystone_auth_uri}
1248                 ceilometer::api::keystone_identity_uri: {get_input: keystone_identity_uri}
1249                 ceilometer::agent::auth::auth_password: {get_input: ceilometer_password}
1250                 ceilometer::agent::auth::auth_url: {get_input: keystone_auth_uri}
1251                 ceilometer::agent::central::coordination_url: {get_input: ceilometer_coordination_url}
1252                 ceilometer::db::mysql::password: {get_input: ceilometer_password}
1253                 snmpd_readonly_user_name: {get_input: snmpd_readonly_user_name}
1254                 snmpd_readonly_user_password: {get_input: snmpd_readonly_user_password}
1255
1256                 # Nova
1257                 nova::rabbit_userid: {get_input: rabbit_username}
1258                 nova::rabbit_password: {get_input: rabbit_password}
1259                 nova::rabbit_use_ssl: {get_input: rabbit_client_use_ssl}
1260                 nova::rabbit_port: {get_input: rabbit_client_port}
1261                 nova::debug: {get_input: debug}
1262                 nova::api::auth_uri: {get_input: keystone_auth_uri}
1263                 nova::api::identity_uri: {get_input: keystone_identity_uri}
1264                 nova::api::api_bind_address: {get_input: nova_api_network}
1265                 nova::api::metadata_listen: {get_input: nova_metadata_network}
1266                 nova::api::admin_password: {get_input: nova_password}
1267                 nova::database_connection: {get_input: nova_dsn}
1268                 nova::glance_api_servers: {get_input: glance_api_servers}
1269                 nova::api::neutron_metadata_proxy_shared_secret: {get_input: neutron_metadata_proxy_shared_secret}
1270                 nova::network::neutron::neutron_admin_password: {get_input: neutron_password}
1271                 nova::network::neutron::neutron_url: {get_input: neutron_internal_url}
1272                 nova::network::neutron::neutron_admin_auth_url: {get_input: neutron_admin_auth_url}
1273                 nova::vncproxy::host: {get_input: nova_api_network}
1274                 nova::db::mysql::password: {get_input: nova_password}
1275
1276                 # Horizon
1277                 apache::ip: {get_input: horizon_network}
1278                 horizon::allowed_hosts: {get_input: horizon_allowed_hosts}
1279                 horizon::django_debug: {get_input: debug}
1280                 horizon::secret_key: {get_input: horizon_secret}
1281                 horizon::bind_address: {get_input: horizon_network}
1282                 horizon::keystone_url: {get_input: keystone_auth_uri}
1283
1284                 # Rabbit
1285                 rabbitmq::node_ip_address: {get_input: rabbitmq_network}
1286                 rabbitmq::erlang_cookie: {get_input: rabbit_cookie}
1287                 rabbitmq::file_limit: {get_input: rabbit_fd_limit}
1288                 rabbitmq::default_user: {get_input: rabbit_username}
1289                 rabbitmq::default_pass: {get_input: rabbit_password}
1290                 # Redis
1291                 redis::bind: {get_input: redis_network}
1292                 redis_vip: {get_input: redis_vip}
1293                 # Firewall
1294                 tripleo::firewall::manage_firewall: {get_input: manage_firewall}
1295                 tripleo::firewall::purge_firewall_rules: {get_input: purge_firewall_rules}
1296                 # Misc
1297                 memcached::listen_ip: {get_input: memcached_network}
1298                 neutron_public_interface_ip: {get_input: neutron_public_interface_ip}
1299                 ntp::servers: {get_input: ntp_servers}
1300                 control_virtual_interface: {get_input: control_virtual_interface}
1301                 public_virtual_interface: {get_input: public_virtual_interface}
1302                 tripleo::loadbalancer::control_virtual_interface: {get_input: control_virtual_interface}
1303                 tripleo::loadbalancer::public_virtual_interface: {get_input: public_virtual_interface}
1304                 tripleo::loadbalancer::haproxy_log_address: {get_input: haproxy_log_address}
1305                 tripleo::packages::enable_install: {get_input: enable_package_install}
1306                 tripleo::packages::enable_upgrade: {get_input: enable_package_upgrade}
1307
1308   # Hook for site-specific additional pre-deployment config, e.g extra hieradata
1309   ControllerExtraConfigPre:
1310     depends_on: ControllerDeployment
1311     type: OS::TripleO::ControllerExtraConfigPre
1312     properties:
1313         server: {get_resource: Controller}
1314
1315   # Hook for site-specific additional pre-deployment config,
1316   # applying to all nodes, e.g node registration/unregistration
1317   NodeExtraConfig:
1318     depends_on: ControllerExtraConfigPre
1319     type: OS::TripleO::NodeExtraConfig
1320     properties:
1321         server: {get_resource: Controller}
1322
1323   UpdateConfig:
1324     type: OS::TripleO::Tasks::PackageUpdate
1325
1326   UpdateDeployment:
1327     type: OS::Heat::SoftwareDeployment
1328     properties:
1329       config: {get_resource: UpdateConfig}
1330       server: {get_resource: Controller}
1331       input_values:
1332         update_identifier:
1333           get_param: UpdateIdentifier
1334
1335 outputs:
1336   ip_address:
1337     description: IP address of the server in the ctlplane network
1338     value: {get_attr: [Controller, networks, ctlplane, 0]}
1339   external_ip_address:
1340     description: IP address of the server in the external network
1341     value: {get_attr: [ExternalPort, ip_address]}
1342   internal_api_ip_address:
1343     description: IP address of the server in the internal_api network
1344     value: {get_attr: [InternalApiPort, ip_address]}
1345   storage_ip_address:
1346     description: IP address of the server in the storage network
1347     value: {get_attr: [StoragePort, ip_address]}
1348   storage_mgmt_ip_address:
1349     description: IP address of the server in the storage_mgmt network
1350     value: {get_attr: [StorageMgmtPort, ip_address]}
1351   tenant_ip_address:
1352     description: IP address of the server in the tenant network
1353     value: {get_attr: [TenantPort, ip_address]}
1354   hostname:
1355     description: Hostname of the server
1356     value: {get_attr: [Controller, name]}
1357   corosync_node:
1358     description: >
1359       Node object in the format {ip: ..., name: ...} format that the corosync
1360       element expects
1361     value:
1362       ip: {get_attr: [Controller, networks, ctlplane, 0]}
1363       name: {get_attr: [Controller, name]}
1364   hosts_entry:
1365     description: >
1366       Server's IP address and hostname in the /etc/hosts format
1367     value:
1368       str_replace:
1369         template: IP HOST.localdomain HOST CLOUDNAME
1370         params:
1371           IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, ControllerHostnameResolveNetwork]}]}
1372           HOST: {get_attr: [Controller, name]}
1373           CLOUDNAME: {get_param: CloudName}
1374   nova_server_resource:
1375     description: Heat resource handle for the Nova compute server
1376     value:
1377       {get_resource: Controller}
1378   swift_device:
1379     description: Swift device formatted for swift-ring-builder
1380     value:
1381       str_replace:
1382         template: 'r1z1-IP:%PORT%/d1'
1383         params:
1384           IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, SwiftMgmtNetwork]}]}
1385   swift_proxy_memcache:
1386     description: Swift proxy-memcache value
1387     value:
1388       str_replace:
1389         template: "IP:11211"
1390         params:
1391           IP: {get_attr: [NetIpMap, net_ip_map, {get_param: [ServiceNetMap, MemcachedNetwork]}]}
1392   config_identifier:
1393     description: identifier which changes if the controller configuration may need re-applying
1394     value:
1395       list_join:
1396         - ','
1397         - - {get_attr: [ControllerDeployment, deploy_stdout]}
1398           - {get_attr: [ControllerExtraConfigPre, deploy_stdout]}
1399           - {get_param: UpdateIdentifier}