dddc82ce72c163d998a98003b592dffc67143331
[apex-tripleo-heat-templates.git] / controller.yaml
1 heat_template_version: 2014-10-16
2
3 description: >
4   OpenStack control plane node. Can be wrapped in a ResourceGroup for scaling.
5
6 parameters:
7   AdminPassword:
8     default: unset
9     description: The password for the keystone admin account, used for monitoring, querying neutron etc.
10     type: string
11     hidden: true
12   AdminToken:
13     default: unset
14     description: The keystone auth secret.
15     type: string
16     hidden: true
17   CeilometerMeteringSecret:
18     default: unset
19     description: Secret shared by the ceilometer services.
20     type: string
21     hidden: true
22   CeilometerPassword:
23     default: unset
24     description: The password for the ceilometer service account.
25     type: string
26     hidden: true
27   CinderISCSIHelper:
28     default: tgtadm
29     description: The iSCSI helper to use with cinder.
30     type: string
31   CinderLVMLoopDeviceSize:
32     default: 5000
33     description: The size of the loopback file used by the cinder LVM driver.
34     type: number
35   CinderPassword:
36     default: unset
37     description: The password for the cinder service account, used by cinder-api.
38     type: string
39     hidden: true
40   CloudName:
41     default: ''
42     description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
43     type: string
44   ControllerExtraConfig:
45     default: {}
46     description: |
47       Controller specific configuration to inject into the cluster. Same
48       structure as ExtraConfig.
49     type: json
50   ControlVirtualInterface:
51     default: 'br-ex'
52     description: Interface where virtual ip will be assigned.
53     type: string
54   Debug:
55     default: ''
56     description: Set to True to enable debugging on all services.
57     type: string
58   ExtraConfig:
59     default: {}
60     description: |
61       Additional configuration to inject into the cluster. The JSON should have
62       the following structure:
63         {"FILEKEY":
64           {"config":
65             [{"section": "SECTIONNAME",
66               "values":
67                 [{"option": "OPTIONNAME",
68                   "value": "VALUENAME"
69                  }
70                 ]
71              }
72             ]
73           }
74         }
75       For instance:
76         {"nova":
77           {"config":
78             [{"section": "default",
79               "values":
80                 [{"option": "compute_manager",
81                   "value": "ironic.nova.compute.manager.ClusterComputeManager"
82                  }
83                 ]
84              },
85              {"section": "cells",
86               "values":
87                 [{"option": "driver",
88                   "value": "nova.cells.rpc_driver.CellsRPCDriver"
89                  }
90                 ]
91              }
92             ]
93           }
94         }
95     type: json
96   Flavor:
97     default: baremetal
98     description: Flavor for control nodes to request when deploying.
99     type: string
100     constraints:
101       - custom_constraint: nova.flavor
102   GlanceNotifierStrategy:
103     description: Strategy to use for Glance notification queue
104     type: string
105     default: noop
106   GlanceLogFile:
107     description: The filepath of the file to use for logging messages from Glance.
108     type: string
109     default: ''
110   GlancePassword:
111     default: unset
112     description: The password for the glance service account, used by the glance services.
113     type: string
114     hidden: true
115   GlancePort:
116     default: "9292"
117     description: Glance port.
118     type: string
119   GlanceProtocol:
120     default: http
121     description: Protocol to use when connecting to glance, set to https for SSL.
122     type: string
123   HeatPassword:
124     default: unset
125     description: The password for the Heat service account, used by the Heat services.
126     type: string
127     hidden: true
128   HeatStackDomainAdminPassword:
129     description: Password for heat_domain_admin user.
130     type: string
131     default: ''
132     hidden: true
133   Image:
134     type: string
135     default: overcloud-control
136     constraints:
137       - custom_constraint: glance.image
138   ImageUpdatePolicy:
139     default: 'REBUILD_PRESERVE_EPHEMERAL'
140     description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
141     type: string
142   KeyName:
143     default: default
144     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
145     type: string
146     constraints:
147       - custom_constraint: nova.keypair
148   KeystoneCACertificate:
149     default: ''
150     description: Keystone self-signed certificate authority certificate.
151     type: string
152   KeystoneSigningCertificate:
153     default: ''
154     description: Keystone certificate for verifying token validity.
155     type: string
156   KeystoneSigningKey:
157     default: ''
158     description: Keystone key for signing tokens.
159     type: string
160     hidden: true
161   KeystoneSSLCertificate:
162     default: ''
163     description: Keystone certificate for verifying token validity.
164     type: string
165   KeystoneSSLCertificateKey:
166     default: ''
167     description: Keystone key for signing tokens.
168     type: string
169     hidden: true
170   MysqlClusterUniquePart:
171     description: A unique identifier of the MySQL cluster the controller is in.
172     type: string
173     default: 'unset'  # Has to be here because of the ignored empty value bug
174     constraints:
175     - length: {min: 4, max: 10}
176   MysqlInnodbBufferPoolSize:
177     description: >
178         Specifies the size of the buffer pool in megabytes. Setting to
179         zero should be interpreted as "no value" and will defer to the
180         lower level default.
181     type: number
182     default: 0
183   MysqlRootPassword:
184     type: string
185     hidden: true
186     default: ''  # Has to be here because of the ignored empty value bug
187   NeutronBridgeMappings:
188     description: >
189       The OVS logical->physical bridge mappings to use. See the Neutron
190       documentation for details. Defaults to mapping br-ex - the external
191       bridge on hosts - to a physical name 'datacentre' which can be used
192       to create provider networks (and we use this for the default floating
193       network) - if changing this either use different post-install network
194       scripts or be sure to keep 'datacentre' as a mapping network name.
195     type: string
196     default: ""
197   NeutronDnsmasqOptions:
198     default: 'dhcp-option-force=26,1400'
199     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.
200     type: string
201   NeutronEnableTunnelling:
202     type: string
203     default: "True"
204   NeutronFlatNetworks:
205     type: string
206     default: ''
207     description: If set, flat networks to configure in neutron plugins.
208   NeutronNetworkType:
209     default: 'gre'
210     description: The tenant network type for Neutron, either gre or vxlan.
211     type: string
212   NeutronNetworkVLANRanges:
213     default: 'datacentre'
214     description: >
215       The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
216       Neutron documentation for permitted values. Defaults to permitting any
217       VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
218     type: string
219   NeutronPassword:
220     default: unset
221     description: The password for the neutron service account, used by neutron agents.
222     type: string
223     hidden: true
224   NeutronPublicInterface:
225     default: eth0
226     description: What interface to bridge onto br-ex for network nodes.
227     type: string
228   NeutronPublicInterfaceTag:
229     default: ''
230     description: >
231       VLAN tag for creating a public VLAN. The tag will be used to
232       create an access port on the exterior bridge for each control plane node,
233       and that port will be given the IP address returned by neutron from the
234       public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
235       overcloud.yaml to include the deployment of VLAN ports to the control
236       plane.
237     type: string
238   NeutronPublicInterfaceDefaultRoute:
239     default: ''
240     description: A custom default route for the NeutronPublicInterface.
241     type: string
242   NeutronPublicInterfaceIP:
243     default: ''
244     description: A custom IP address to put onto the NeutronPublicInterface.
245     type: string
246   NeutronPublicInterfaceRawDevice:
247     default: ''
248     description: If set, the public interface is a vlan with this device as the raw device.
249     type: string
250   NeutronTunnelTypes:
251     default: 'gre'
252     description: |
253         The tunnel types for the Neutron tenant network. To specify multiple
254         values, use a comma separated string, like so: 'gre,vxlan'
255     type: string
256   NovaPassword:
257     default: unset
258     description: The password for the nova service account, used by nova-api.
259     type: string
260     hidden: true
261   NtpServer:
262     type: string
263     default: ''
264   PublicVirtualInterface:
265     default: 'br-ex'
266     description: >
267         Specifies the interface where the public-facing virtual ip will be assigned.
268         This should be int_public when a VLAN is being used.
269     type: string
270   PublicVirtualIP:
271     type: string
272     default: ''  # Has to be here because of the ignored empty value bug
273   RabbitCookie:
274     type: string
275     default: ''  # Has to be here because of the ignored empty value bug
276     hidden: true
277   RabbitPassword:
278     default: guest
279     description: The password for RabbitMQ
280     type: string
281     hidden: true
282   RabbitUserName:
283     default: guest
284     description: The username for RabbitMQ
285     type: string
286   RabbitClientUseSSL:
287     default: false
288     description: >
289         Rabbit client subscriber parameter to specify
290         an SSL connection to the RabbitMQ host.
291     type: string
292   RabbitClientPort:
293     default: 5672
294     description: Set rabbit subscriber port, change this if using SSL
295     type: number
296   SnmpdReadonlyUserName:
297     default: ro_snmp_user
298     description: The user name for SNMPd with readonly rights running on all Overcloud nodes
299     type: string
300   SnmpdReadonlyUserPassword:
301     default: unset
302     description: The user password for SNMPd with readonly rights running on all Overcloud nodes
303     type: string
304     hidden: true
305   SSLCACertificate:
306     default: ''
307     description: If set, the contents of an SSL certificate authority file.
308     type: string
309   SSLCertificate:
310     default: ''
311     description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
312     type: string
313     hidden: true
314   SSLKey:
315     default: ''
316     description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
317     type: string
318     hidden: true
319   SwiftHashSuffix:
320     default: unset
321     description: A random string to be used as a salt when hashing to determine mappings
322       in the ring.
323     hidden: true
324     type: string
325   SwiftPartPower:
326     default: 10
327     description: Partition Power to use when building Swift rings
328     type: number
329   SwiftPassword:
330     default: unset
331     description: The password for the swift service account, used by the swift proxy
332       services.
333     hidden: true
334     type: string
335   SwiftReplicas:
336     type: number
337     default: 1
338     description: How many replicas to use in the swift rings.
339   VirtualIP:
340     type: string
341     default: ''  # Has to be here because of the ignored empty value bug
342
343
344 resources:
345
346   Controller:
347     type: OS::Nova::Server
348     properties:
349       image: {get_param: Image}
350       image_update_policy: {get_param: ImageUpdatePolicy}
351       flavor: {get_param: Flavor}
352       key_name: {get_param: KeyName}
353       networks:
354         - network: ctlplane
355       user_data_format: SOFTWARE_CONFIG
356
357   ControllerConfig:
358     type: OS::Heat::StructuredConfig
359     properties:
360       group: os-apply-config
361       config:
362         admin-password: {get_param: AdminPassword}
363         admin-token: {get_param: AdminToken}
364         bootstack:
365           public_interface_ip: {get_param: NeutronPublicInterfaceIP}
366         bootstrap_host:
367           nodeid: {get_input: bootstack_nodeid}
368         database:
369           host: &database_host
370             {get_param: VirtualIP}
371         cinder:
372           db:
373             list_join:
374               - ''
375               - - mysql://cinder:unset@
376                 - *database_host
377                 - /cinder
378           debug: {get_param: Debug}
379           volume_size_mb: {get_param: CinderLVMLoopDeviceSize}
380           service-password: {get_param: CinderPassword}
381           iscsi-helper: {get_param: CinderISCSIHelper}
382         controller-address: {get_input: controller_host}
383         corosync:
384           bindnetaddr: {get_input: controller_host}
385           mcastport: 5577
386         pacemaker:
387           stonith_enabled : false
388           recheck_interval : 5
389           quorum_policy : ignore
390         db-password: unset
391         glance:
392           registry:
393             host: {get_input: controller_virtual_ip}
394           backend: swift
395           db:
396             list_join:
397               - ''
398               - - mysql://glance:unset@
399                 - *database_host
400                 - /glance
401           debug: {get_param: Debug}
402           host: {get_input: controller_virtual_ip}
403           port: {get_param: GlancePort}
404           protocol: {get_param: GlanceProtocol}
405           service-password: {get_param: GlancePassword}
406           swift-store-user: service:glance
407           swift-store-key: {get_param: GlancePassword}
408           notifier-strategy: {get_param: GlanceNotifierStrategy}
409           log-file: {get_param: GlanceLogFile}
410         heat:
411           admin_password: {get_param: HeatPassword}
412           admin_tenant_name: service
413           admin_user: heat
414           auth_encryption_key: unset___________
415           db:
416             list_join:
417               - ''
418               - - mysql://heat:unset@
419                 - *database_host
420                 - /heat
421           debug: {get_param: Debug}
422           stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
423           watch_server_url: {get_input: heat.watch_server_url}
424           metadata_server_url: {get_input: heat.metadata_server_url}
425           waitcondition_server_url: {get_input: heat.waitcondition_server_url}
426         keystone:
427           db:
428             list_join:
429               - ''
430               - - mysql://keystone:unset@
431                 - *database_host
432                 - /keystone
433           debug: {get_param: Debug}
434           host: {get_input: controller_virtual_ip}
435           ca_certificate: {get_param: KeystoneCACertificate}
436           signing_key: {get_param: KeystoneSigningKey}
437           signing_certificate: {get_param: KeystoneSigningCertificate}
438           ssl:
439               certificate: {get_param: KeystoneSSLCertificate}
440               certificate_key: {get_param: KeystoneSSLCertificateKey}
441         mysql:
442           innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
443           local_bind: true
444           root-password: {get_param: MysqlRootPassword}
445           cluster_name:
446             str_replace:
447               template: tripleo-CLUSTER
448               params:
449                 CLUSTER: {get_param: MysqlClusterUniquePart}
450         neutron:
451           debug: {get_param: Debug}
452           flat-networks: {get_param: NeutronFlatNetworks}
453           host: {get_input: controller_virtual_ip}
454           metadata_proxy_shared_secret: unset
455           ovs:
456             enable_tunneling: {get_input: neutron_enable_tunneling}
457             local_ip: {get_input: controller_host}
458             network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
459             bridge_mappings: {get_param: NeutronBridgeMappings}
460             public_interface: {get_param: NeutronPublicInterface}
461             public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
462             public_interface_route: {get_param: NeutronPublicInterfaceDefaultRoute}
463             public_interface_tag: {get_param: NeutronPublicInterfaceTag}
464             physical_bridge: br-ex
465             tenant_network_type: {get_param: NeutronNetworkType}
466             tunnel_types: {get_param: NeutronTunnelTypes}
467           ovs_db:
468             list_join:
469               - ''
470               - - mysql://neutron:unset@
471                 - *database_host
472                 - /ovs_neutron?charset=utf8
473           service-password: {get_param: NeutronPassword}
474           dnsmasq-options: {get_param: NeutronDnsmasqOptions}
475         ceilometer:
476           db:
477             list_join:
478               - ''
479               - - mysql://ceilometer:unset@
480                 - *database_host
481                 - /ceilometer
482           debug: {get_param: Debug}
483           metering_secret: {get_param: CeilometerMeteringSecret}
484           service-password: {get_param: CeilometerPassword}
485         snmpd:
486           export_MIB: UCD-SNMP-MIB
487           readonly_user_name: {get_param: SnmpdReadonlyUserName}
488           readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
489         nova:
490           compute_driver: libvirt.LibvirtDriver
491           db:
492             list_join:
493               - ''
494               - - mysql://nova:unset@
495                 - *database_host
496                 - /nova
497           default_floating_pool:
498             ext-net
499           host: {get_input: controller_virtual_ip}
500           metadata-proxy: true
501           service-password: {get_param: NovaPassword}
502         rabbit:
503           host: {get_input: controller_virtual_ip}
504           username: {get_param: RabbitUserName}
505           password: {get_param: RabbitPassword}
506           cookie: {get_param: RabbitCookie}
507           rabbit_client_use_ssl: {get_param: RabbitClientUseSSL}
508           rabbit_port: {get_param: RabbitClientPort}
509         ntp:
510           servers:
511               - {server: {get_param: NtpServer}, fudge: "stratum 0"}
512         virtual_interfaces:
513           instances:
514             - vrrp_instance_name: VI_CONTROL
515               virtual_router_id: 51
516               keepalive_interface: {get_param: ControlVirtualInterface}
517               priority: 101
518               virtual_ips:
519               - ip: {get_param: VirtualIP}
520                 interface: {get_param: ControlVirtualInterface}
521             - vrrp_instance_name: VI_PUBLIC
522               virtual_router_id: 52
523               keepalive_interface: {get_param: PublicVirtualInterface}
524               priority: 101
525               virtual_ips:
526               - ip: {get_param: PublicVirtualIP}
527                 interface: {get_param: PublicVirtualInterface}
528           vrrp_sync_groups:
529             - name: VG1
530               members:
531                 - VI_CONTROL
532                 - VI_PUBLIC
533         keepalived:
534           keepalive_interface: {get_param: PublicVirtualInterface}
535           priority: 101
536         virtual_ips:
537             -
538               ip: {get_param: VirtualIP}
539               interface: {get_param: ControlVirtualInterface}
540             -
541               ip: {get_param: PublicVirtualIP}
542               interface: {get_param: PublicVirtualInterface}
543         haproxy:
544           net_binds:
545             - ip: {get_param: VirtualIP}
546           services:
547             - name: keystone_admin
548               port: 35357
549               net_binds: &public_binds
550                 - ip: {get_param: VirtualIP}
551                 - ip: {get_param: PublicVirtualIP}
552             - name: keystone_public
553               port: 5000
554               net_binds: *public_binds
555             - name: horizon
556               port: 80
557               net_binds: *public_binds
558             - name: neutron
559               port: 9696
560               net_binds: *public_binds
561             - name: cinder
562               port: 8776
563               net_binds: *public_binds
564             - name: glance_api
565               port: 9292
566               net_binds: *public_binds
567             - name: glance_registry
568               port: 9191
569               net_binds: *public_binds
570             - name: heat_api
571               port: 8004
572               net_binds: *public_binds
573             - name: heat_cloudwatch
574               port: 8003
575               net_binds: *public_binds
576             - name: heat_cfn
577               port: 8000
578               net_binds: *public_binds
579             - name: mysql
580               port: 3306
581               extra_server_params:
582                 - backup
583               options:
584                 - timeout client 0
585                 - timeout server 0
586             - name: nova_ec2
587               port: 8773
588             - name: nova_osapi
589               port: 8774
590               net_binds: *public_binds
591             - name: nova_metadata
592               port: 8775
593               net_binds: *public_binds
594             - name: ceilometer
595               port: 8777
596               net_binds: *public_binds
597             - name: swift_proxy_server
598               port: 8080
599               net_binds: *public_binds
600             - name: rabbitmq
601               port: 5672
602               options:
603                 - timeout client 0
604                 - timeout server 0
605
606   ControllerPassthroughConfig:
607     type: OS::Heat::StructuredConfig
608     properties:
609       group: os-apply-config
610       config: {get_input: passthrough_config}
611
612   ControllerPassthroughConfigSpecific:
613     type: OS::Heat::StructuredConfig
614     properties:
615       group: os-apply-config
616       config: {get_input: passthrough_config_specific}
617
618   ControllerDeployment:
619     type: OS::Heat::StructuredDeployment
620     properties:
621       signal_transport: NO_SIGNAL
622       config: {get_resource: ControllerConfig}
623       server: {get_resource: Controller}
624       input_values:
625         bootstack_nodeid: {get_attr: [Controller, name]}
626         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
627         controller_virtual_ip: {get_param: VirtualIP}
628         neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
629         heat.watch_server_url:
630           list_join:
631             - ''
632             - - 'http://'
633               - {get_param: VirtualIP}
634               - ':8003'
635         heat.metadata_server_url:
636           list_join:
637             - ''
638             - - 'http://'
639               - {get_param: VirtualIP}
640               - ':8000'
641         heat.waitcondition_server_url:
642           list_join:
643             - ''
644             - - 'http://'
645               - {get_param: VirtualIP}
646               - ':8000/v1/waitcondition'
647
648   SSLConfig:
649     type: OS::Heat::StructuredConfig
650     properties:
651       group: os-apply-config
652       config:
653         ssl:
654           ca_certificate: {get_input: ssl_ca_certificate}
655         stunnel:
656           cert: {get_input: ssl_certificate}
657           key: {get_input: ssl_key}
658           cacert: {get_input: ssl_ca_certificate}
659           ports:
660            - name: 'ec2'
661              accept: 13773
662              connect: 8773
663              connect_host: {get_input: controller_host}
664            - name: 'image'
665              accept: 13292
666              connect: 9292
667              connect_host: {get_input: controller_host}
668            - name: 'identity'
669              accept: 13000
670              connect: 5000
671              connect_host: {get_input: controller_host}
672            - name: 'network'
673              accept: 13696
674              connect: 9696
675              connect_host: {get_input: controller_host}
676            - name: 'compute'
677              accept: 13774
678              connect: 8774
679              connect_host: {get_input: controller_host}
680            - name: 'swift-proxy'
681              accept: 13080
682              connect: 8080
683              connect_host: {get_input: controller_host}
684            - name: 'cinder'
685              accept: 13776
686              connect: 8776
687              connect_host: {get_input: controller_host}
688            - name: 'ceilometer'
689              accept: 13777
690              connect: 8777
691              connect_host: {get_input: controller_host}
692
693   ControllerSSLDeployment:
694     type: OS::Heat::StructuredDeployment
695     properties:
696       config: {get_resource: SSLConfig}
697       server: {get_resource: Controller}
698       signal_transport: NO_SIGNAL
699       input_values:
700         controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
701         ssl_certificate: {get_param: SSLCertificate}
702         ssl_key: {get_param: SSLKey}
703         ssl_ca_certificate: {get_param: SSLCACertificate}
704
705   ControllerPassthroughDeployment:
706     type: OS::Heat::StructuredDeployment
707     properties:
708       config: {get_resource: ControllerPassthroughConfig}
709       server: {get_resource: Controller}
710       signal_transport: NO_SIGNAL
711       input_values:
712         passthrough_config: {get_param: ExtraConfig}
713
714   ControllerPassthroughSpecificDeployment:
715     depends_on: [ControllerPassthroughDeployment]
716     type: OS::Heat::StructuredDeployment
717     properties:
718       config: {get_resource: ControllerPassthroughConfigSpecific}
719       server: {get_resource: Controller}
720       signal_transport: NO_SIGNAL
721       input_values:
722         passthrough_config_specific: {get_param: ControllerExtraConfig}
723
724   SwiftConfig:
725     type: OS::Heat::StructuredConfig
726     properties:
727       group: os-apply-config
728       config:
729         swift:
730           hash: { get_input: swift_hash_suffix }
731           part-power: { get_input: swift_part_power }
732           replicas: {get_input: swift_replicas }
733           service-password: { get_input: swift_password }
734
735   SwiftStorageDeploy:
736     type: OS::Heat::StructuredDeployment
737     properties:
738       server: {get_resource: Controller}
739       config: {get_resource: SwiftConfig}
740       signal_transport: NO_SIGNAL
741       input_values:
742         swift_hash_suffix: {get_param: SwiftHashSuffix}
743         swift_password: {get_param: SwiftPassword}
744         swift_part_power: {get_param: SwiftPartPower}
745         swift_replicas: { get_param: SwiftReplicas}
746
747 outputs:
748   ip_address:
749     description: IP address of the server in the ctlplane network
750     value: {get_attr: [Controller, networks, ctlplane, 0]}
751   hostname:
752     description: Hostname of the server
753     value: {get_attr: [Controller, name]}
754   corosync_node:
755     description: >
756       Node object in the format {ip: ..., name: ...} format that the corosync
757       element expects
758     value:
759       ip: {get_attr: [Controller, networks, ctlplane, 0]}
760       name: {get_attr: [Controller, name]}
761   hosts_entry:
762     description: >
763       Server's IP address and hostname in the /etc/hosts format
764     value:
765       str_replace:
766         template: IP HOST HOST.novalocal CLOUDNAME
767         params:
768           IP: {get_attr: [Controller, networks, ctlplane, 0]}
769           HOST: {get_attr: [Controller, name]}
770           CLOUDNAME: {get_param: CloudName}
771   nova_server_resource:
772     description: Heat resource handle for the Nova compute server
773     value:
774       {get_resource: Controller}
775   swift_device:
776     description: Swift device formatted for swift-ring-builder
777     value:
778       str_replace:
779         template: 'r1z1-IP:%PORT%/d1'
780         params:
781           IP: {get_attr: [Controller, networks, ctlplane, 0]}
782   swift_proxy_memcache:
783     description: Swift proxy-memcache value
784     value:
785       str_replace:
786         template: "IP:11211"
787         params:
788           IP: {get_attr: [Controller, networks, ctlplane, 0]}