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