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