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