[openstack-tripleo-heat-templates] Updated patches from master-patches

slagle slagle at fedoraproject.org
Mon Sep 29 20:28:34 UTC 2014


commit 39caf8bc4ff1f18847fb3edcb9c21085e707ecc1
Author: James Slagle <jslagle at redhat.com>
Date:   Mon Sep 29 16:28:15 2014 -0400

    Updated patches from master-patches

 ...and-controller-templates-without-merge.py.patch | 2067 ++++++++++++++++++++
 ...erted-version-of-block-and-object-storage.patch |  441 +++++
 openstack-tripleo-heat-templates.spec              |    6 +
 3 files changed, 2514 insertions(+), 0 deletions(-)
---
diff --git a/0001-Compute-and-controller-templates-without-merge.py.patch b/0001-Compute-and-controller-templates-without-merge.py.patch
new file mode 100644
index 0000000..041c568
--- /dev/null
+++ b/0001-Compute-and-controller-templates-without-merge.py.patch
@@ -0,0 +1,2067 @@
+From 963968afde9b14ba8cd67ebe89437012536e732c Mon Sep 17 00:00:00 2001
+From: Tomas Sedovic <tsedovic at redhat.com>
+Date: Wed, 6 Aug 2014 13:24:10 +0200
+Subject: [PATCH] Compute and controller templates without merge.py
+
+This provides three templates: overcloud.yaml, compute.yaml and
+controller.yaml. These can be used in combination with
+overcloud-resource-registry.yaml to deploy the overcloud on their own --
+without having to do any pre-processing (via merge.py).
+
+To test these you have to add the resource registry environment (in
+addition to the existing `-e` option) to the Heat call in
+devtest_overcloud.sh (line 374):
+
+    heat $HEAT_OP -e $TRIPLEO_ROOT/overcloud-env.json \
+        -e "$TRIPLEO_ROOT/tripleo-heat-templates/overcloud-resource-registry.yaml" \
+        -t 360 \
+        -f $TRIPLEO_ROOT/tripleo-heat-templates/overcloud.yaml \
+        -P "ExtraConfig=${OVERCLOUD_EXTRA_CONFIG}" \
+        $STACKNAME
+
+The `make overcloud.yaml` call can stay (we've turn the overcloud
+target in Makefile to no-op and removed it from .gitignore) and the
+inputs and outputs of the template remain the same.
+
+This means that the existing overcloud Heat environment
+($TRIPLE_ROOT/overcloud-env.json) should continue to work.  Scaling is
+now being controlled by the `ControllerCount` and `ComputeCount`
+template parameters, though.
+
+NOTE: the changes here depend on a fairly recent Heat build (commit
+e5f285f6cb from ~7th September, 2014). In other words, this requires
+Juno Heat.
+
+Also, passing more than one environment file to Heat requires
+python-heatclient version 0.2.11.
+
+Change-Id: I687a00c7dc164ba044f9f2dfca96a02401427855
+---
+ .gitignore                       |   1 -
+ Makefile                         |  10 +-
+ compute.yaml                     | 403 +++++++++++++++++++
+ controller.yaml                  | 817 +++++++++++++++++++++++++++++++--------
+ overcloud-resource-registry.yaml |   3 +
+ overcloud.yaml                   | 674 ++++++++++++++++++++++++++++++++
+ 6 files changed, 1741 insertions(+), 167 deletions(-)
+ create mode 100644 compute.yaml
+ create mode 100644 overcloud-resource-registry.yaml
+ create mode 100644 overcloud.yaml
+
+diff --git a/.gitignore b/.gitignore
+index 3035c9e..f5a4f5b 100644
+--- a/.gitignore
++++ b/.gitignore
+@@ -1,5 +1,4 @@
+ # Built via Makefile
+-overcloud.yaml
+ overcloud-with-block-storage.yaml
+ overcloud-with-block-storage-nfs.yaml
+ undercloud-bm.yaml
+diff --git a/Makefile b/Makefile
+index 349a077..c28a294 100644
+--- a/Makefile
++++ b/Makefile
+@@ -1,5 +1,4 @@
+ generated_templates =                         \
+-        overcloud.yaml                        \
+         overcloud-with-block-storage-nfs.yaml \
+         undercloud-vm.yaml                    \
+         undercloud-bm.yaml                    \
+@@ -15,11 +14,8 @@ validate-all: $(VALIDATE)
+ $(VALIDATE):
+ 	heat template-validate -f $(subst validate-,,$@)
+ 
+-# set CONTROLEXTRA to overcloud-vlan-port.yaml to activate the VLAN
+-# auto-assignment from Neutron.
+-overcloud.yaml: overcloud-source.yaml block-storage.yaml swift-deploy.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml nova-compute-config.yaml $(overcloud_source_deps)
+-	python ./tripleo_heat_merge/merge.py --hot --scale NovaCompute=$${COMPUTESCALE:-'1'} --scale controller=$${CONTROLSCALE:-'1'} --scale SwiftStorage=$${SWIFTSTORAGESCALE:-'0'} --scale BlockStorage=$${BLOCKSTORAGESCALE:-'0'} overcloud-source.yaml block-storage.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml swift-deploy.yaml nova-compute-config.yaml ${CONTROLEXTRA} > $@.tmp
+-	mv $@.tmp $@
++overcloud.yaml:
++	@echo "Warning: overcloud.yaml doesn't rely on merge.py anymore. This is a no-op."
+ 
+ overcloud-with-block-storage-nfs.yaml: overcloud-source.yaml block-storage-nfs.yaml nfs-server-source.yaml swift-source.yaml swift-storage-source.yaml ssl-source.yaml $(overcloud_source_deps)
+ 	# $^ won't work here because we want to list nova-compute-instance.yaml as
+@@ -51,4 +47,4 @@ test:
+ clean:
+ 	rm -f $(generated_templates)
+ 
+-.PHONY: clean overcloud.yaml check
++.PHONY: clean check
+diff --git a/compute.yaml b/compute.yaml
+new file mode 100644
+index 0000000..98f99ed
+--- /dev/null
++++ b/compute.yaml
+@@ -0,0 +1,403 @@
++heat_template_version: 2014-10-16
++
++description: >
++  OpenStack hypervisor node. Can be wrapped in a ResourceGroup for scaling.
++
++parameters:
++  AdminPassword:
++    default: unset
++    description: The password for the keystone admin account, used for monitoring, querying neutron etc.
++    type: string
++    hidden: true
++  CeilometerComputeAgent:
++    description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
++    type: string
++    default: ''
++    constraints:
++    - allowed_values: ['', Present]
++  CeilometerDSN:
++    type: string
++  CeilometerMeteringSecret:
++    default: unset
++    description: Secret shared by the ceilometer services.
++    type: string
++    hidden: true
++  CeilometerPassword:
++    default: unset
++    description: The password for the ceilometer service account.
++    type: string
++    hidden: true
++  Debug:
++    default: ''
++    description: Set to True to enable debugging on all services.
++    type: string
++  ExtraConfig:
++    default: {}
++    description: |
++      Additional configuration to inject into the cluster. The JSON should have
++      the following structure:
++        {"FILEKEY":
++          {"config":
++            [{"section": "SECTIONNAME",
++              "values":
++                [{"option": "OPTIONNAME",
++                  "value": "VALUENAME"
++                 }
++                ]
++             }
++            ]
++          }
++        }
++      For instance:
++        {"nova":
++          {"config":
++            [{"section": "default",
++              "values":
++                [{"option": "force_config_drive",
++                  "value": "always"
++                 }
++                ]
++             },
++             {"section": "cells",
++              "values":
++                [{"option": "driver",
++                  "value": "nova.cells.rpc_driver.CellsRPCDriver"
++                 }
++                ]
++             }
++            ]
++          }
++        }
++    type: json
++  Flavor:
++    description: Flavor for the nova compute node
++    type: string
++    default: baremetal
++  GlanceHost:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++  GlancePort:
++    default: "9292"
++    description: Glance port.
++    type: string
++  GlanceProtocol:
++    default: http
++    description: Protocol to use when connecting to glance, set to https for SSL.
++    type: string
++  Image:
++    type: string
++    default: overcloud-compute
++  ImageUpdatePolicy:
++    default: 'REBUILD_PRESERVE_EPHEMERAL'
++    description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
++    type: string
++  KeyName:
++    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
++    type: string
++    default: default
++  KeystoneHost:
++    type: string
++    default: ''
++  LiveUpdateComputeImage:
++    type: string
++    description: The image ID for live-updates to the overcloud compute nodes.
++    default: ''
++  LiveUpdateHost:
++    type: string
++    description: The IP address for the undercloud Glance API.
++    default: ''
++  LiveUpdateUserName:
++    type: string
++    description: The live-update username for the undercloud Glance API.
++    default: ''
++  LiveUpdatePassword:
++    type: string
++    default: ''
++    description: The live-update password for the undercloud Glance API.
++    hidden: true
++  LiveUpdateTenantName:
++    type: string
++    description: The live-update tenant name for the undercloud Glance API.
++    default: ''
++  NeutronBridgeMappings:
++    description: >
++      The OVS logical->physical bridge mappings to use. See the Neutron
++      documentation for details. Defaults to mapping br-ex - the external
++      bridge on hosts - to a physical name 'datacentre' which can be used
++      to create provider networks (and we use this for the default floating
++      network) - if changing this either use different post-install network
++      scripts or be sure to keep 'datacentre' as a mapping network name.
++    type: string
++    default: ""
++  NeutronDSN:
++    type: string
++  NeutronEnableTunnelling:
++    type: string
++    default: "True"
++  NeutronFlatNetworks:
++    type: string
++    default: ''
++    description: >
++      If set, flat networks to configure in neutron plugins. Defaults to
++      'datacentre' to permit external network creation.
++  NeutronHost:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++  NeutronNetworkType:
++    type: string
++    description: The tenant network type for Neutron, either gre or vxlan.
++    default: 'gre'
++  NeutronNetworkVLANRanges:
++    default: 'datacentre'
++    description: >
++      The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
++      Neutron documentation for permitted values. Defaults to permitting any
++      VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
++    type: string
++  NeutronPassword:
++    default: unset
++    description: The password for the neutron service account, used by neutron agents.
++    type: string
++    hidden: true
++  NeutronPhysicalBridge:
++    default: ''
++    description: An OVS bridge to create for accessing external networks.
++    type: string
++  NeutronPublicInterface:
++    default: ''
++    description: A port to add to the NeutronPhysicalBridge.
++    type: string
++  NeutronTunnelTypes:
++    type: string
++    description: |
++        The tunnel types for the Neutron tenant network. To specify multiple
++        values, use a comma separated string, like so: 'gre,vxlan'
++    default: 'gre'
++  NovaApiHost:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++  NovaComputeDriver:
++    type: string
++    default: libvirt.LibvirtDriver
++  NovaComputeExtraConfig:
++    default: {}
++    description: |
++      NovaCompute specific configuration to inject into the cluster. Same
++      structure as ExtraConfig.
++    type: json
++  NovaComputeLibvirtType:
++    type: string
++    default: ''
++  NovaDSN:
++    type: string
++  NovaPassword:
++    default: unset
++    description: The password for the nova service account, used by nova-api.
++    type: string
++    hidden: true
++  NovaPublicIP:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++  NtpServer:
++    type: string
++    default: ''
++  RabbitHost:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++  RabbitUserName:
++    default: guest
++    description: The username for RabbitMQ
++    type: string
++  RabbitPassword:
++    default: guest
++    description: The password for RabbitMQ
++    type: string
++    hidden: true
++  SnmpdReadonlyUserName:
++    default: ro_snmp_user
++    description: The user name for SNMPd with readonly rights running on all Overcloud nodes
++    type: string
++  SnmpdReadonlyUserPassword:
++    default: unset
++    description: The user password for SNMPd with readonly rights running on all Overcloud nodes
++    type: string
++    hidden: true
++
++
++resources:
++
++  NovaCompute:
++    type: OS::Nova::Server
++    properties:
++      image:
++        {get_param: Image}
++      image_update_policy:
++        get_param: ImageUpdatePolicy
++      flavor: {get_param: Flavor}
++      key_name: {get_param: KeyName}
++      networks:
++        - network: ctlplane
++      user_data_format: SOFTWARE_CONFIG
++
++  NovaComputeConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config:
++        nova:
++          compute_driver: { get_input: nova_compute_driver }
++          compute_libvirt_type: { get_input: nova_compute_libvirt_type }
++          db: {get_input: nova_dsn}
++          debug: {get_param: Debug}
++          host: {get_input: nova_api_host}
++          public_ip: {get_input: nova_public_ip}
++          service-password: {get_input: nova_password}
++        ceilometer:
++          db: {get_input: ceilometer_dsn}
++          debug: {get_param: Debug}
++          metering_secret: {get_input: ceilometer_metering_secret}
++          service-password: {get_input: ceilometer_password}
++          compute_agent: {get_input: ceilometer_compute_agent}
++        snmpd:
++          export_MIB: UCD-SNMP-MIB
++          readonly_user_name: {get_input: snmpd_readonly_user_name}
++          readonly_user_password: {get_input: snmpd_readonly_user_password}
++        glance:
++          debug: {get_param: Debug}
++          host: {get_input: glance_host}
++          port: {get_input: glance_port}
++          protocol: {get_input: glance_protocol}
++        keystone:
++          debug: {get_param: Debug}
++          host: {get_input: keystone_host}
++        neutron:
++          debug: {get_param: Debug}
++          flat-networks: {get_input: neutron_flat_networks}
++          host: {get_input: neutron_host}
++          ovs_db: {get_input: neutron_dsn}
++          ovs:
++            local_ip: {get_input: neutron_local_ip}
++            tenant_network_type: {get_input: neutron_tenant_network_type}
++            tunnel_types: {get_input: neutron_tunnel_types}
++            network_vlan_ranges: {get_input: neutron_network_vlan_ranges}
++            bridge_mappings: {get_input: neutron_bridge_mappings}
++            enable_tunneling: {get_input: neutron_enable_tunneling}
++            physical_bridge: {get_input: neutron_physical_bridge}
++            public_interface: {get_input: neutron_public_interface}
++          service-password: {get_input: neutron_password}
++        admin-password: {get_input: admin_password}
++        rabbit:
++          host: {get_input: rabbit_host}
++          username: {get_input: rabbit_username}
++          password: {get_input: rabbit_password}
++        live-update:
++          host: {get_input: live_update_host}
++          username: {get_input: live_update_username}
++          password: {get_input: live_update_password}
++          tenant-name: {get_input: live_update_tenant_name}
++          base_image_id: {get_input: nova_image}
++          live_update_image_id: {get_input: live_update_compute_image}
++        ntp:
++          servers:
++              - {server: {get_input: ntp_server}, fudge: "stratum 0"}
++
++  NovaComputeDeployment:
++    #depends_on: [controller0AllNodes]
++    type: OS::Heat::StructuredDeployment
++    properties:
++      signal_transport: NO_SIGNAL
++      config: {get_resource: NovaComputeConfig}
++      server: {get_resource: NovaCompute}
++      input_values:
++        nova_compute_driver: {get_param: NovaComputeDriver}
++        nova_compute_libvirt_type: {get_param: NovaComputeLibvirtType}
++        nova_dsn: {get_param: NovaDSN}
++        nova_public_ip: {get_param: NovaPublicIP}
++        nova_api_host: {get_param: NovaApiHost}
++        nova_password: {get_param: NovaPassword}
++        ceilometer_dsn: {get_param: CeilometerDSN}
++        ceilometer_metering_secret: {get_param: CeilometerMeteringSecret}
++        ceilometer_password: {get_param: CeilometerPassword}
++        ceilometer_compute_agent: {get_param: CeilometerComputeAgent}
++        snmpd_readonly_user_name: {get_param: SnmpdReadonlyUserName}
++        snmpd_readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
++        glance_host: {get_param: GlanceHost}
++        glance_port: {get_param: GlancePort}
++        glance_protocol: {get_param: GlanceProtocol}
++        keystone_host: {get_param: KeystoneHost}
++        neutron_flat_networks: {get_param: NeutronFlatNetworks}
++        neutron_host: {get_param: NeutronHost}
++        neutron_dsn: {get_param: NeutronDSN}
++        neutron_local_ip: {get_attr: [NovaCompute, networks, ctlplane, 0]}
++        neutron_tenant_network_type: {get_param: NeutronNetworkType}
++        neutron_tunnel_types: {get_param: NeutronTunnelTypes}
++        neutron_network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
++        neutron_bridge_mappings: {get_param: NeutronBridgeMappings}
++        neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
++        neutron_physical_bridge: {get_param: NeutronPhysicalBridge}
++        neutron_public_interface: {get_param: NeutronPublicInterface}
++        neutron_password: {get_param: NeutronPassword}
++        admin_password: {get_param: AdminPassword}
++        rabbit_host: {get_param: RabbitHost}
++        rabbit_username: {get_param: RabbitUserName}
++        rabbit_password: {get_param: RabbitPassword}
++        live_update_host: {get_param: LiveUpdateHost}
++        live_update_username: {get_param: LiveUpdateUserName}
++        live_update_password: {get_param: LiveUpdatePassword}
++        live_update_tenant_name: {get_param: LiveUpdateTenantName}
++        nova_image: {get_param: Image}
++        live_update_image_id: {get_param: LiveUpdateComputeImage}
++        ntp_server: {get_param: NtpServer}
++
++  NovaComputePassthrough:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config: {get_input: passthrough_config}
++
++  NovaComputePassthroughSpecific:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config: {get_input: passthrough_config_specific}
++
++  NovaComputePassthroughDeployment:
++    depends_on: [NovaComputeDeployment]
++    type: OS::Heat::StructuredDeployment
++    properties:
++      config: {get_resource: NovaComputePassthrough}
++      server: {get_resource: NovaCompute}
++      signal_transport: NO_SIGNAL
++      input_values:
++        passthrough_config: {get_param: ExtraConfig}
++
++  NovaComputePassthroughDeploymentSpecific:
++    depends_on: [NovaComputePassthroughDeployment]
++    type: OS::Heat::StructuredDeployment
++    properties:
++      config: {get_resource: NovaComputePassthroughSpecific}
++      server: {get_resource: NovaCompute}
++      signal_transport: NO_SIGNAL
++      input_values:
++        passthrough_config_specific: {get_param: NovaComputeExtraConfig}
++
++outputs:
++  ip_address:
++    description: IP address of the server in the ctlplane network
++    value: {get_attr: [NovaCompute, networks, ctlplane, 0]}
++  hostname:
++    description: Hostname of the server
++    value: {get_attr: [NovaCompute, show, name]}
++  hosts_entry:
++    description: >
++      Server's IP address and hostname in the /etc/hosts format
++    value:
++      str_replace:
++        template: "IP HOST HOST.novalocal"
++        params:
++          IP: {get_attr: [NovaCompute, networks, ctlplane, 0]}
++          HOST: {get_attr: [NovaCompute, name]}
++  nova_server_resource:
++    description: Heat resource handle for the Nova compute server
++    value:
++      {get_resource: NovaCompute}
+diff --git a/controller.yaml b/controller.yaml
+index 8aac819..8be40e3 100644
+--- a/controller.yaml
++++ b/controller.yaml
+@@ -1,36 +1,102 @@
+-description: Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
+-  server,Dedicated RabbitMQ Server
+-heat_template_version: 2013-05-23
++heat_template_version: 2014-10-16
++
++description: >
++  OpenStack control plane node. Can be wrapped in a ResourceGroup for scaling.
++
+ parameters:
++  AdminPassword:
++    default: unset
++    description: The password for the keystone admin account, used for monitoring, querying neutron etc.
++    type: string
++    hidden: true
+   AdminToken:
++    default: unset
++    description: The keystone auth secret.
+     type: string
+-  BootstrapDumpPassword:
+-    default: ''
+-    description: Password to use for mysqldump from Bootstrap Host
++    hidden: true
++  CeilometerMeteringSecret:
++    default: unset
++    description: Secret shared by the ceilometer services.
+     type: string
+     hidden: true
+-  BootstrapHost:
+-    default: ''
+-    description: Load mysqldump from this Host
++  CeilometerPassword:
++    default: unset
++    description: The password for the ceilometer service account.
+     type: string
+-  BootstrapRootPassword:
+-    default: ''
+-    description: Root password for localhost access after bootstrap
++    hidden: true
++  CinderISCSIHelper:
++    default: tgtadm
++    description: The iSCSI helper to use with cinder.
++    type: string
++  CinderLVMLoopDeviceSize:
++    default: 5000
++    description: The size of the loopback file used by the cinder LVM driver.
++    type: number
++  CinderPassword:
++    default: unset
++    description: The password for the cinder service account, used by cinder-api.
+     type: string
+     hidden: true
+-  BootstrapSlavePassword:
++  CloudName:
+     default: ''
+-    description: Password to use with BootstrapSlaveUser
++    description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
+     type: string
+-    hidden: true
+-  BootstrapSlaveUser:
++  controllerExtraConfig:
++    default: {}
++    description: |
++      Controller specific configuration to inject into the cluster. Same
++      structure as ExtraConfig.
++    type: json
++  ControlVirtualInterface:
++    default: 'br-ex'
++    description: Interface where virtual ip will be assigned.
++    type: string
++  Debug:
+     default: ''
+-    description: User to use for replication from bootstrap host
++    description: Set to True to enable debugging on all services.
+     type: string
+-  GlanceDBPassword:
+-    description: Password for connecting to glance database
++  ExtraConfig:
++    default: {}
++    description: |
++      Additional configuration to inject into the cluster. The JSON should have
++      the following structure:
++        {"FILEKEY":
++          {"config":
++            [{"section": "SECTIONNAME",
++              "values":
++                [{"option": "OPTIONNAME",
++                  "value": "VALUENAME"
++                 }
++                ]
++             }
++            ]
++          }
++        }
++      For instance:
++        {"nova":
++          {"config":
++            [{"section": "default",
++              "values":
++                [{"option": "compute_manager",
++                  "value": "ironic.nova.compute.manager.ClusterComputeManager"
++                 }
++                ]
++             },
++             {"section": "cells",
++              "values":
++                [{"option": "driver",
++                  "value": "nova.cells.rpc_driver.CellsRPCDriver"
++                 }
++                ]
++             }
++            ]
++          }
++        }
++    type: json
++  Flavor:
++    default: baremetal
++    description: Flavor for control nodes to request when deploying.
+     type: string
+-    hidden: true
+   GlanceNotifierStrategy:
+     description: Strategy to use for Glance notification queue
+     type: string
+@@ -39,179 +105,612 @@ parameters:
+     description: The filepath of the file to use for logging messages from Glance.
+     type: string
+     default: ''
+-  HeatDBPassword:
+-    description: Password for accessing Heat database.
++  GlancePassword:
++    default: unset
++    description: The password for the glance service account, used by the glance services.
+     type: string
+     hidden: true
+-  InstanceType:
+-    default: baremetal
+-    description: Use this flavor
++  GlancePort:
++    default: "9292"
++    description: Glance port.
++    type: string
++  GlanceProtocol:
++    default: http
++    description: Protocol to use when connecting to glance, set to https for SSL.
++    type: string
++  HeatPassword:
++    default: unset
++    description: The password for the Heat service account, used by the Heat services.
++    type: string
++    hidden: true
++  HeatStackDomainAdminPassword:
++    description: Password for heat_domain_admin user.
++    type: string
++    default: ''
++    hidden: true
++  Image:
++    type: string
++    default: overcloud-control
++  ImageUpdatePolicy:
++    default: 'REBUILD_PRESERVE_EPHEMERAL'
++    description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
+     type: string
+   KeyName:
+     default: default
+     description: Name of an existing EC2 KeyPair to enable SSH access to the instances
+     type: string
+-  KeystoneDBPassword:
+-    description: Password for connecting to keystone
++  KeystoneCACertificate:
++    default: ''
++    description: Keystone self-signed certificate authority certificate.
++    type: string
++  KeystoneSigningCertificate:
++    default: ''
++    description: Keystone certificate for verifying token validity.
++    type: string
++  KeystoneSigningKey:
++    default: ''
++    description: Keystone key for signing tokens.
+     type: string
+     hidden: true
+-  NovaDBPassword:
+-    description: Password for connecting to nova database
++  MysqlClusterUniquePart:
++    description: A unique identifier of the MySQL cluster the controller is in
++    type: string
++    default: 'unset'  # Has to be here because of the ignored empty value bug
++    constraints:
++    - length: {min: 4, max: 10}
++  MysqlInnodbBufferPoolSize:
++    description: >
++        Specifies the size of the buffer pool in megabytes. Setting to
++        zero should be interpreted as "no value" and will defer to the
++        lower level default.
++    type: number
++    default: 0
++  MysqlRootPassword:
+     type: string
+     hidden: true
+-  NovaInterfaces:
+-    default: eth0
++    default: ''  # Has to be here because of the ignored empty value bug
++  NeutronBridgeMappings:
++    description: >
++      The OVS logical->physical bridge mappings to use. See the Neutron
++      documentation for details. Defaults to mapping br-ex - the external
++      bridge on hosts - to a physical name 'datacentre' which can be used
++      to create provider networks (and we use this for the default floating
++      network) - if changing this either use different post-install network
++      scripts or be sure to keep 'datacentre' as a mapping network name.
++    type: string
++    default: ""
++  NeutronDnsmasqOptions:
++    default: 'dhcp-option-force=26,1400'
++    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.
++    type: string
++  NeutronEnableTunnelling:
++    type: string
++    default: "True"
++  NeutronFlatNetworks:
+     type: string
+-  NeutronDBPassword:
+-    description: Password for connecting to neutron database
++    default: ''
++    description: If set, flat networks to configure in neutron plugins.
++  NeutronNetworkType:
++    default: 'gre'
++    description: The tenant network type for Neutron, either gre or vxlan.
++    type: string
++  NeutronNetworkVLANRanges:
++    default: 'datacentre'
++    description: >
++      The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
++      Neutron documentation for permitted values. Defaults to permitting any
++      VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
++    type: string
++  NeutronPassword:
++    default: unset
++    description: The password for the neutron service account, used by neutron agents.
+     type: string
+     hidden: true
+-  NeutronInterfaces:
++  NeutronPublicInterface:
+     default: eth0
++    description: What interface to bridge onto br-ex for network nodes.
+     type: string
+-  RabbitMQPassword:
+-    description: Password for RabbitMQ
++  NeutronPublicInterfaceTag:
++    default: ''
++    description: >
++      VLAN tag for creating a public VLAN. The tag will be used to
++      create an access port on the exterior bridge for each control plane node,
++      and that port will be given the IP address returned by neutron from the
++      public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
++      overcloud.yaml to include the deployment of VLAN ports to the control
++      plane.
++    type: string
++  NeutronPublicInterfaceDefaultRoute:
++    default: ''
++    description: A custom default route for the NeutronPublicInterface.
++    type: string
++  NeutronPublicInterfaceIP:
++    default: ''
++    description: A custom IP address to put onto the NeutronPublicInterface.
++    type: string
++  NeutronPublicInterfaceRawDevice:
++    default: ''
++    description: If set, the public interface is a vlan with this device as the raw device.
++    type: string
++  NeutronTunnelTypes:
++    default: 'gre'
++    description: |
++        The tunnel types for the Neutron tenant network. To specify multiple
++        values, use a comma separated string, like so: 'gre,vxlan'
++    type: string
++  NovaPassword:
++    default: unset
++    description: The password for the nova service account, used by nova-api.
+     type: string
+     hidden: true
++  NtpServer:
++    type: string
++    default: ''
++  PublicVirtualInterface:
++    default: 'br-ex'
++    description: >
++        Specifies the interface where the public-facing virtual ip will be assigned.
++        This should be int_public when a VLAN is being used.
++    type: string
++  PublicVirtualIP:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++  RabbitCookie:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++    hidden: true
+   RabbitUserName:
++    default: guest
++    description: The username for RabbitMQ
+     type: string
+   RabbitPassword:
++    default: guest
++    description: The password for RabbitMQ
+     type: string
+     hidden: true
+-  ServicePassword:
+-    description: admin_password for setting up auth in nova.
++  SnmpdReadonlyUserName:
++    default: ro_snmp_user
++    description: The user name for SNMPd with readonly rights running on all Overcloud nodes
++    type: string
++  SnmpdReadonlyUserPassword:
++    default: unset
++    description: The user password for SNMPd with readonly rights running on all Overcloud nodes
+     type: string
+     hidden: true
+-  controllerImage:
++  SSLCACertificate:
++    default: ''
++    description: If set, the contents of an SSL certificate authority file.
+     type: string
+-  HeatStackDomainAdminPassword:
+-    description: Password for heat_domain_admin user.
++  SSLCertificate:
++    default: ''
++    description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
+     type: string
++    hidden: true
++  SSLKey:
+     default: ''
++    description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
++    type: string
+     hidden: true
++  VirtualIP:
++    type: string
++    default: ''  # Has to be here because of the ignored empty value bug
++
++
+ resources:
+-  AccessPolicy:
++
++  Controller:
++    type: OS::Nova::Server
+     properties:
+-      AllowedResources:
+-      - controller0
+-    type: OS::Heat::AccessPolicy
+-  controller0Key:
++      image: {get_param: Image}
++      image_update_policy: {get_param: ImageUpdatePolicy}
++      flavor: {get_param: Flavor}
++      key_name: {get_param: KeyName}
++      networks:
++        - network: ctlplane
++      user_data_format: SOFTWARE_CONFIG
++
++  controllerConfig:
++    type: OS::Heat::StructuredConfig
+     properties:
+-      UserName:
+-        get_resource: User
+-    type: AWS::IAM::AccessKey
+-  User:
++      group: os-apply-config
++      config:
++        admin-password: {get_param: AdminPassword}
++        admin-token: {get_param: AdminToken}
++        bootstack:
++          public_interface_ip: {get_param: NeutronPublicInterfaceIP}
++        bootstrap_host:
++          nodeid: {get_input: bootstack_nodeid}
++        database:
++          host: &database_host
++            {get_param: VirtualIP}
++        cinder:
++          db:
++            list_join:
++              - ''
++              - - mysql://cinder:unset@
++                - *database_host
++                - /cinder
++          debug: {get_param: Debug}
++          volume_size_mb: {get_param: CinderLVMLoopDeviceSize}
++          service-password: {get_param: CinderPassword}
++          iscsi-helper: {get_param: CinderISCSIHelper}
++        controller-address: {get_input: controller_host}
++        corosync:
++          bindnetaddr: {get_input: controller_host}
++          mcastport: 5577
++        pacemaker:
++          stonith_enabled : false
++          recheck_interval : 5
++          quorum_policy : ignore
++        db-password: unset
++        glance:
++          registry:
++            host: {get_input: controller_virtual_ip}
++          backend: swift
++          db:
++            list_join:
++              - ''
++              - - mysql://glance:unset@
++                - *database_host
++                - /glance
++          debug: {get_param: Debug}
++          host: {get_input: controller_virtual_ip}
++          port: {get_param: GlancePort}
++          protocol: {get_param: GlanceProtocol}
++          service-password: {get_param: GlancePassword}
++          swift-store-user: service:glance
++          swift-store-key: {get_param: GlancePassword}
++          notifier-strategy: {get_param: GlanceNotifierStrategy}
++          log-file: {get_param: GlanceLogFile}
++        heat:
++          admin_password: {get_param: HeatPassword}
++          admin_tenant_name: service
++          admin_user: heat
++          auth_encryption_key: unset___________
++          db:
++            list_join:
++              - ''
++              - - mysql://heat:unset@
++                - *database_host
++                - /heat
++          debug: {get_param: Debug}
++          stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
++          watch_server_url: {get_input: heat.watch_server_url}
++          metadata_server_url: {get_input: heat.metadata_server_url}
++          waitcondition_server_url: {get_input: heat.waitcondition_server_url}
++        keystone:
++          db:
++            list_join:
++              - ''
++              - - mysql://keystone:unset@
++                - *database_host
++                - /keystone
++          debug: {get_param: Debug}
++          host: {get_input: controller_virtual_ip}
++          ca_certificate: {get_param: KeystoneCACertificate}
++          signing_key: {get_param: KeystoneSigningKey}
++          signing_certificate: {get_param: KeystoneSigningCertificate}
++        mysql:
++          innodb_buffer_pool_size: {get_param: MysqlInnodbBufferPoolSize}
++          local_bind: true
++          root-password: {get_param: MysqlRootPassword}
++          cluster_name:
++            str_replace:
++              template: tripleo-CLUSTER
++              params:
++                CLUSTER: {get_param: MysqlClusterUniquePart}
++        neutron:
++          debug: {get_param: Debug}
++          flat-networks: {get_param: NeutronFlatNetworks}
++          host: {get_input: controller_virtual_ip}
++          metadata_proxy_shared_secret: unset
++          ovs:
++            enable_tunneling: {get_input: neutron_enable_tunneling}
++            local_ip: {get_input: controller_host}
++            network_vlan_ranges: {get_param: NeutronNetworkVLANRanges}
++            bridge_mappings: {get_param: NeutronBridgeMappings}
++            public_interface: {get_param: NeutronPublicInterface}
++            public_interface_raw_device: {get_param: NeutronPublicInterfaceRawDevice}
++            public_interface_route: {get_param: NeutronPublicInterfaceDefaultRoute}
++            public_interface_tag: {get_param: NeutronPublicInterfaceTag}
++            physical_bridge: br-ex
++            tenant_network_type: {get_param: NeutronNetworkType}
++            tunnel_types: {get_param: NeutronTunnelTypes}
++          ovs_db:
++            list_join:
++              - ''
++              - - mysql://neutron:unset@
++                - *database_host
++                - /ovs_neutron?charset=utf8
++          service-password: {get_param: NeutronPassword}
++          dnsmasq-options: {get_param: NeutronDnsmasqOptions}
++        ceilometer:
++          db:
++            list_join:
++              - ''
++              - - mysql://ceilometer:unset@
++                - *database_host
++                - /ceilometer
++          debug: {get_param: Debug}
++          metering_secret: {get_param: CeilometerMeteringSecret}
++          service-password: {get_param: CeilometerPassword}
++        snmpd:
++          export_MIB: UCD-SNMP-MIB
++          readonly_user_name: {get_param: SnmpdReadonlyUserName}
++          readonly_user_password: {get_param: SnmpdReadonlyUserPassword}
++        nova:
++          compute_driver: libvirt.LibvirtDriver
++          db:
++            list_join:
++              - ''
++              - - mysql://nova:unset@
++                - *database_host
++                - /nova
++          default_floating_pool:
++            ext-net
++          host: {get_input: controller_virtual_ip}
++          metadata-proxy: true
++          service-password: {get_param: NovaPassword}
++        rabbit:
++          host: {get_input: controller_virtual_ip}
++          username: {get_param: RabbitUserName}
++          password: {get_param: RabbitPassword}
++          cookie: {get_param: RabbitCookie}
++        ntp:
++          servers:
++              - {server: {get_param: NtpServer}, fudge: "stratum 0"}
++        virtual_interfaces:
++          instances:
++            - vrrp_instance_name: VI_CONTROL
++              virtual_router_id: 51
++              keepalive_interface: {get_param: ControlVirtualInterface}
++              priority: 101
++              virtual_ips:
++              - ip: {get_param: VirtualIP}
++                interface: {get_param: ControlVirtualInterface}
++            - vrrp_instance_name: VI_PUBLIC
++              virtual_router_id: 52
++              keepalive_interface: {get_param: PublicVirtualInterface}
++              priority: 101
++              virtual_ips:
++              - ip: {get_param: PublicVirtualIP}
++                interface: {get_param: PublicVirtualInterface}
++          vrrp_sync_groups:
++            - name: VG1
++              members:
++                - VI_CONTROL
++                - VI_PUBLIC
++        keepalived:
++          keepalive_interface: {get_param: PublicVirtualInterface}
++          priority: 101
++        virtual_ips:
++            -
++              ip: {get_param: VirtualIP}
++              interface: {get_param: ControlVirtualInterface}
++            -
++              ip: {get_param: PublicVirtualIP}
++              interface: {get_param: PublicVirtualInterface}
++        haproxy:
++          net_binds:
++            - ip: {get_param: VirtualIP}
++          services:
++            - name: keystone_admin
++              port: 35357
++              net_binds: &public_binds
++                - ip: {get_param: VirtualIP}
++                - ip: {get_param: PublicVirtualIP}
++            - name: keystone_public
++              port: 5000
++              net_binds: *public_binds
++            - name: horizon
++              port: 80
++              net_binds: *public_binds
++            - name: neutron
++              port: 9696
++              net_binds: *public_binds
++            - name: cinder
++              port: 8776
++              net_binds: *public_binds
++            - name: glance_api
++              port: 9292
++              net_binds: *public_binds
++            - name: glance_registry
++              port: 9191
++              net_binds: *public_binds
++            - name: heat_api
++              port: 8004
++              net_binds: *public_binds
++            - name: heat_cloudwatch
++              port: 8003
++              net_binds: *public_binds
++            - name: heat_cfn
++              port: 8000
++              net_binds: *public_binds
++            - name: mysql
++              port: 3306
++              extra_server_params:
++                - backup
++              options:
++                - timeout client 0
++                - timeout server 0
++            - name: nova_ec2
++              port: 8773
++            - name: nova_osapi
++              port: 8774
++              net_binds: *public_binds
++            - name: nova_metadata
++              port: 8775
++              net_binds: *public_binds
++            - name: ceilometer
++              port: 8777
++              net_binds: *public_binds
++            - name: swift_proxy_server
++              port: 8080
++              net_binds: *public_binds
++            - name: rabbitmq
++              port: 5672
++              options:
++                - timeout client 0
++                - timeout server 0
++
++  controllerPassthrough:
++    type: OS::Heat::StructuredConfig
+     properties:
+-      Policies:
+-      - get_resource: AccessPolicy
+-    type: AWS::IAM::User
+-  controller0:
+-    metadata:
+-      admin-password:
+-        get_param: ServicePassword
+-      admin-token:
+-        get_param: AdminToken
+-      mysql:
+-        create-users:
+-          - database: keystone
+-            username: keystone
+-            password: {get_param: KeystoneDBPassword}
+-          - database: heat
+-            username: heat
+-            password: {get_param: HeatDBPassword}
+-          - database: glance
+-            username: glance
+-            password: {get_param: GlanceDBPassword}
+-          - database: nova
+-            username: nova
+-            password: {get_param: NovaDBPassword}
+-          - database: neutron
+-            username: neutron
+-            password: {get_param: NeutronDBPassword}
+-      glance:
+-        db:
+-          Fn::Join:
+-            - ''
+-            - - 'mysql://glance:'
+-              - {get_param: GlanceDBPassword}
+-              - '@127.0.0.1/glance'
+-          notifier-strategy:
+-            get_param: GlanceNotifierStrategy
+-          log-file:
+-            get_param: GlanceLogFile
+-      heat:
+-        db:
+-          Fn::Join:
+-            - ''
+-            - - 'mysql://heat:'
+-              - {get_param: HeatDBPassword}
+-              - '@127.0.0.1/heat'
+-        access_key_id:
+-          get_resource: controller0Key
+-        refresh:
+-        - resource: controller0
+-        secret_key:
+-          get_attr:
+-          - controller0Key
+-          - SecretAccessKey
+-        stack:
+-          name:
+-            get_param: AWS::StackName
+-          region:
+-            get_param: AWS::Region
+-        auth_encryption_key: unset
+-        stack_domain_admin_password: {get_param: HeatStackDomainAdminPassword}
+-      interfaces:
+-        control:
+-          get_param: NovaInterfaces
+-      keystone:
+-        host:
+-          '127.0.0.1'
+-        db:
+-          Fn::Join:
++      group: os-apply-config
++      config: {get_input: passthrough_config}
++
++  controllerPassthroughSpecific:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config: {get_input: passthrough_config_specific}
++
++  ControllerDeployment:
++    type: OS::Heat::StructuredDeployment
++    properties:
++      signal_transport: NO_SIGNAL
++      config: {get_resource: controllerConfig}
++      server: {get_resource: Controller}
++      input_values:
++        bootstack_nodeid: {get_attr: [Controller, name]}
++        controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
++        controller_virtual_ip: {get_param: VirtualIP}
++        neutron_enable_tunneling: {get_param: NeutronEnableTunnelling}
++        heat.watch_server_url:
++          list_join:
+             - ''
+-            - - 'mysql://keystone:'
+-              - {get_param: KeystoneDBPassword}
+-              - '@127.0.0.1/keystone'
+-      nova:
+-        db:
+-          Fn::Join:
++            - - 'http://'
++              - {get_param: VirtualIP}
++              - ':8003'
++        heat.metadata_server_url:
++          list_join:
+             - ''
+-            - - 'mysql://nova:'
+-              - {get_param: NovaDBPassword}
+-              - '@127.0.0.1/nova'
+-      neutron:
+-        host:
+-          '127.0.0.1'
+-        ovs_db:
+-          Fn::Join:
++            - - 'http://'
++              - {get_param: VirtualIP}
++              - ':8000'
++        heat.waitcondition_server_url:
++          list_join:
+             - ''
+-            - - 'mysql://neutron:'
+-              - {get_param: NeutronDBPassword}
+-              - '@127.0.0.1/ovs_neutron'
+-      rabbit:
+-        host:
+-          '127.0.0.1'
+-        username:
+-          get_param: RabbitUserName
+-        password:
+-          get_param: RabbitPassword
+-        users:
+-          username:
+-            get_param: RabbitUserName
+-          password:
+-            get_param: RabbitPassword
+-        cookie:
+-          get_attr:
+-          - RabbitCookie
+-          - value
+-      service-password:
+-        get_param: ServicePassword
++            - - 'http://'
++              - {get_param: VirtualIP}
++              - ':8000/v1/waitcondition'
++
++  SSLConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config:
++        ssl:
++          ca_certificate: {get_input: ssl_ca_certificate}
++        stunnel:
++          cert: {get_input: ssl_certificate}
++          key: {get_input: ssl_key}
++          cacert: {get_input: ssl_ca_certificate}
++          ports:
++           - name: 'ec2'
++             accept: 13773
++             connect: 8773
++             connect_host: {get_input: controller_host}
++           - name: 'image'
++             accept: 13292
++             connect: 9292
++             connect_host: {get_input: controller_host}
++           - name: 'identity'
++             accept: 13000
++             connect: 5000
++             connect_host: {get_input: controller_host}
++           - name: 'network'
++             accept: 13696
++             connect: 9696
++             connect_host: {get_input: controller_host}
++           - name: 'compute'
++             accept: 13774
++             connect: 8774
++             connect_host: {get_input: controller_host}
++           - name: 'swift-proxy'
++             accept: 13080
++             connect: 8080
++             connect_host: {get_input: controller_host}
++           - name: 'cinder'
++             accept: 13776
++             connect: 8776
++             connect_host: {get_input: controller_host}
++           - name: 'ceilometer'
++             accept: 13777
++             connect: 8777
++             connect_host: {get_input: controller_host}
++
++  ControllerSSLDeployment:
++    type: OS::Heat::StructuredDeployment
++    properties:
++      config: {get_resource: SSLConfig}
++      server: {get_resource: Controller}
++      signal_transport: NO_SIGNAL
++      input_values:
++        controller_host: {get_attr: [Controller, networks, ctlplane, 0]}
++        ssl_certificate: {get_param: SSLCertificate}
++        ssl_key: {get_param: SSLKey}
++        ssl_ca_certificate: {get_param: SSLCACertificate}
++
++  ControllerPassthrough:
++    type: OS::Heat::StructuredDeployment
++    properties:
++      config: {get_resource: controllerPassthrough}
++      server: {get_resource: Controller}
++      signal_transport: NO_SIGNAL
++      input_values:
++        passthrough_config: {get_param: ExtraConfig}
++
++  ControllerPassthroughSpecificDeployment:
++    depends_on: [ControllerPassthrough]
++    type: OS::Heat::StructuredDeployment
+     properties:
+-      ImageId:
+-        get_param: controllerImage
+-      InstanceType:
+-        get_param: InstanceType
+-      KeyName:
+-        get_param: KeyName
+-    type: AWS::EC2::Instance
++      config: {get_resource: controllerPassthroughSpecific}
++      server: {get_resource: Controller}
++      signal_transport: NO_SIGNAL
++      input_values:
++        passthrough_config_specific: {get_param: controllerExtraConfig}
++
++
++outputs:
++  ip_address:
++    description: IP address of the server in the ctlplane network
++    value: {get_attr: [Controller, networks, ctlplane, 0]}
++  hostname:
++    description: Hostname of the server
++    value: {get_attr: [Controller, name]}
++  corosync_node:
++    description: >
++      Node object in the format {ip: ..., name: ...} format that the corosync
++      element expects
++    value:
++      ip: {get_attr: [Controller, networks, ctlplane, 0]}
++      name: {get_attr: [Controller, name]}
++  hosts_entry:
++    description: >
++      Server's IP address and hostname in the /etc/hosts format
++    value:
++      str_replace:
++        template: IP HOST HOST.novalocal CLOUDNAME
++        params:
++          IP: {get_attr: [Controller, networks, ctlplane, 0]}
++          HOST: {get_attr: [Controller, name]}
++          CLOUDNAME: {get_param: CloudName}
++  nova_server_resource:
++    description: Heat resource handle for the Nova compute server
++    value:
++      {get_resource: Controller}
++  swift_device:
++    description: Swift device formatted for swift-ring-builder
++    value:
++      str_replace:
++        template: 'r1z1-IP:%PORT%/d1'
++        params:
++          IP: {get_attr: [Controller, networks, ctlplane, 0]}
++  swift_proxy_memcache:
++    description: Swift proxy-memcache value
++    value:
++      str_replace:
++        template: "IP:11211"
++        params:
++          IP: {get_attr: [Controller, networks, ctlplane, 0]}
+diff --git a/overcloud-resource-registry.yaml b/overcloud-resource-registry.yaml
+new file mode 100644
+index 0000000..29074fc
+--- /dev/null
++++ b/overcloud-resource-registry.yaml
+@@ -0,0 +1,3 @@
++resource_registry:
++  OS::TripleO::Compute: compute.yaml
++  OS::TripleO::Controller: controller.yaml
+diff --git a/overcloud.yaml b/overcloud.yaml
+new file mode 100644
+index 0000000..9e6fba1
+--- /dev/null
++++ b/overcloud.yaml
+@@ -0,0 +1,674 @@
++heat_template_version: 2014-10-16
++
++description: >
++  Nova API,Keystone,Heat Engine and API,Glance,Neutron,Dedicated MySQL
++  server,Dedicated RabbitMQ Server,Group of Nova Computes
++
++
++parameters:
++
++  # COMMON PARAMETERS (not specific to a role)
++  AdminPassword:
++    default: unset
++    description: The password for the keystone admin account, used for monitoring, querying neutron etc.
++    type: string
++    hidden: true
++  CeilometerMeteringSecret:
++    default: unset
++    description: Secret shared by the ceilometer services.
++    type: string
++    hidden: true
++  CeilometerPassword:
++    default: unset
++    description: The password for the ceilometer service account.
++    type: string
++    hidden: true
++  CloudName:
++    default: ''
++    description: The DNS name of this cloud. E.g. ci-overcloud.tripleo.org
++    type: string
++  ControlFixedIPs:
++    default: []
++    description: Should be used for arbitrary ips.
++    type: json
++  Debug:
++    default: ''
++    description: Set to True to enable debugging on all services.
++    type: string
++  DefaultSignalTransport:
++    default: CFN_SIGNAL
++    description: Transport to use for software-config signals.
++    type: string
++    constraints:
++      - allowed_values: [ CFN_SIGNAL, HEAT_SIGNAL, NO_SIGNAL ]
++  GlancePort:
++    default: "9292"
++    description: Glance port.
++    type: string
++  GlanceProtocol:
++    default: http
++    description: Protocol to use when connecting to glance, set to https for SSL.
++    type: string
++  ImageUpdatePolicy:
++    default: 'REBUILD_PRESERVE_EPHEMERAL'
++    description: What policy to use when reconstructing instances. REBUILD for rebuilds, REBUILD_PRESERVE_EPHEMERAL to preserve /mnt.
++    type: string
++  KeyName:
++    default: default
++    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
++    type: string
++  NeutronBridgeMappings:
++    description: >
++      The OVS logical->physical bridge mappings to use. See the Neutron
++      documentation for details. Defaults to mapping br-ex - the external
++      bridge on hosts - to a physical name 'datacentre' which can be used
++      to create provider networks (and we use this for the default floating
++      network) - if changing this either use different post-install network
++      scripts or be sure to keep 'datacentre' as a mapping network name.
++    type: string
++    default: "datacentre:br-ex"
++  NeutronControlPlaneID:
++    default: ''
++    type: string
++    description: Neutron ID for ctlplane network.
++  NeutronEnableTunnelling:
++    type: string
++    default: "True"
++  NeutronFlatNetworks:
++    type: string
++    default: 'datacentre'
++    description: >
++      If set, flat networks to configure in neutron plugins. Defaults to
++      'datacentre' to permit external network creation.
++  NeutronNetworkType:
++    default: 'gre'
++    description: The tenant network type for Neutron, either gre or vxlan.
++    type: string
++  NeutronPassword:
++    default: unset
++    description: The password for the neutron service account, used by neutron agents.
++    type: string
++    hidden: true
++  NeutronPublicInterface:
++    default: eth0
++    description: What interface to bridge onto br-ex for network nodes.
++    type: string
++  NeutronPublicInterfaceTag:
++    default: ''
++    description: >
++      VLAN tag for creating a public VLAN. The tag will be used to
++      create an access port on the exterior bridge for each control plane node,
++      and that port will be given the IP address returned by neutron from the
++      public network. Set CONTROLEXTRA=overcloud-vlan-port.yaml when compiling
++      overcloud.yaml to include the deployment of VLAN ports to the control
++      plane.
++    type: string
++  NeutronTunnelTypes:
++    default: 'gre'
++    description: |
++        The tunnel types for the Neutron tenant network. To specify multiple
++        values, use a comma separated string, like so: 'gre,vxlan'
++    type: string
++  NovaPassword:
++    default: unset
++    description: The password for the nova service account, used by nova-api.
++    type: string
++    hidden: true
++  NtpServer:
++    type: string
++    default: ''
++  PublicVirtualFixedIPs:
++    default: []
++    description: >
++        Control the IP allocation for the PublicVirtualInterface port. E.g.
++        [{'ip_address':'1.2.3.4'}]
++    type: json
++  PublicVirtualNetwork:
++    default: 'ctlplane'
++    type: string
++    description: >
++        Neutron network to allocate public virtual IP port on.
++  RabbitCookieSalt:
++    type: string
++    default: unset
++    description: Salt for the rabbit cookie, change this to force the randomly generated rabbit cookie to change.
++  RabbitUserName:
++    default: guest
++    description: The username for RabbitMQ
++    type: string
++  RabbitPassword:
++    default: guest
++    description: The password for RabbitMQ
++    type: string
++    hidden: true
++  SnmpdReadonlyUserName:
++    default: ro_snmp_user
++    description: The user name for SNMPd with readonly rights running on all Overcloud nodes
++    type: string
++  SnmpdReadonlyUserPassword:
++    default: unset
++    description: The user password for SNMPd with readonly rights running on all Overcloud nodes
++    type: string
++    hidden: true
++
++
++  # CONTROLLER-SPECIFIC PARAMS
++  AdminToken:
++    default: unset
++    description: The keystone auth secret.
++    type: string
++    hidden: true
++  CinderLVMLoopDeviceSize:
++    default: 5000
++    description: The size of the loopback file used by the cinder LVM driver.
++    type: number
++  CinderPassword:
++    default: unset
++    description: The password for the cinder service account, used by cinder-api.
++    type: string
++    hidden: true
++  CinderISCSIHelper:
++    default: tgtadm
++    description: The iSCSI helper to use with cinder.
++    type: string
++  ControllerCount:
++    type: number
++    default: 1
++  controllerExtraConfig:
++    default: {}
++    description: |
++      Controller specific configuration to inject into the cluster. Same
++      structure as ExtraConfig.
++    type: json
++  controllerImage:
++    type: string
++    default: overcloud-control
++  ControllerFlavor:
++    default: baremetal
++    description: Flavor for control nodes to request when deploying.
++    type: string
++  ControlVirtualInterface:
++    default: 'br-ex'
++    description: Interface where virtual ip will be assigned.
++    type: string
++  ExtraConfig:
++    default: {}
++    description: |
++      Additional configuration to inject into the cluster. The JSON should have
++      the following structure:
++        {"FILEKEY":
++          {"config":
++            [{"section": "SECTIONNAME",
++              "values":
++                [{"option": "OPTIONNAME",
++                  "value": "VALUENAME"
++                 }
++                ]
++             }
++            ]
++          }
++        }
++      For instance:
++        {"nova":
++          {"config":
++            [{"section": "default",
++              "values":
++                [{"option": "force_config_drive",
++                  "value": "always"
++                 }
++                ]
++             },
++             {"section": "cells",
++              "values":
++                [{"option": "driver",
++                  "value": "nova.cells.rpc_driver.CellsRPCDriver"
++                 }
++                ]
++             }
++            ]
++          }
++        }
++    type: json
++  GlanceLogFile:
++    description: The filepath of the file to use for logging messages from Glance.
++    type: string
++    default: ''
++  GlanceNotifierStrategy:
++    description: Strategy to use for Glance notification queue
++    type: string
++    default: noop
++  GlancePassword:
++    default: unset
++    description: The password for the glance service account, used by the glance services.
++    type: string
++    hidden: true
++  HeatPassword:
++    default: unset
++    description: The password for the Heat service account, used by the Heat services.
++    type: string
++    hidden: true
++  HeatStackDomainAdminPassword:
++    description: Password for heat_domain_admin user.
++    type: string
++    default: ''
++    hidden: true
++  KeystoneCACertificate:
++    default: ''
++    description: Keystone self-signed certificate authority certificate.
++    type: string
++  KeystoneSigningCertificate:
++    default: ''
++    description: Keystone certificate for verifying token validity.
++    type: string
++  KeystoneSigningKey:
++    default: ''
++    description: Keystone key for signing tokens.
++    type: string
++    hidden: true
++  MysqlInnodbBufferPoolSize:
++    description: >
++        Specifies the size of the buffer pool in megabytes. Setting to
++        zero should be interpreted as "no value" and will defer to the
++        lower level default.
++    type: number
++    default: 0
++  NeutronDnsmasqOptions:
++    default: 'dhcp-option-force=26,1400'
++    description: Dnsmasq options for neutron-dhcp-agent. The default value here forces MTU to be set to 1400 to account for the tunnel overhead.
++    type: string
++  NeutronPublicInterfaceDefaultRoute:
++    default: ''
++    description: A custom default route for the NeutronPublicInterface.
++    type: string
++  NeutronPublicInterfaceIP:
++    default: ''
++    description: A custom IP address to put onto the NeutronPublicInterface.
++    type: string
++  NeutronPublicInterfaceRawDevice:
++    default: ''
++    description: If set, the public interface is a vlan with this device as the raw device.
++    type: string
++  PublicVirtualInterface:
++    default: 'br-ex'
++    description: >
++        Specifies the interface where the public-facing virtual ip will be assigned.
++        This should be int_public when a VLAN is being used.
++    type: string
++  SSLCertificate:
++    default: ''
++    description: If set, the contents of an SSL certificate .crt file for encrypting SSL endpoints.
++    type: string
++    hidden: true
++  SSLKey:
++    default: ''
++    description: If set, the contents of an SSL certificate .key file for encrypting SSL endpoints.
++    type: string
++    hidden: true
++  SSLCACertificate:
++    default: ''
++    description: If set, the contents of an SSL certificate authority file.
++    type: string
++  SwiftHashSuffix:
++    default: unset
++    description: A random string to be used as a salt when hashing to determine mappings in the ring.
++    type: string
++    hidden: true
++  SwiftPassword:
++    default: unset
++    description: The password for the swift service account, used by the swift proxy services.
++    type: string
++    hidden: true
++  SwiftPartPower:
++    default: 10
++    description: Partition Power to use when building Swift rings
++    type: number
++  SwiftReplicas:
++    type: number
++    default: 1
++    description: How many replicas to use in the swift rings.
++
++# COMPUTE-SPECIFIC PARAMS
++  CeilometerComputeAgent:
++    description: Indicates whether the Compute agent is present and expects nova-compute to be configured accordingly
++    type: string
++    default: ''
++    constraints:
++    - allowed_values: ['', Present]
++  ComputeCount:
++    type: number
++    default: 1
++  HypervisorNeutronPhysicalBridge:
++    default: 'br-ex'
++    description: >
++      An OVS bridge to create on each hypervisor. This defaults to br-ex the
++      same as the control plane nodes, as we have a uniform configuration of
++      the openvswitch agent. Typically should not need to be changed.
++    type: string
++  HypervisorNeutronPublicInterface:
++    default: 'eth0'
++    description: What interface to add to the HypervisorNeutronPhysicalBridge.
++    type: string
++  LiveUpdateComputeImage:
++    type: string
++    description: The image ID for live-updates to the overcloud compute nodes.
++    default: ''
++  LiveUpdateHost:
++    type: string
++    description: The IP address for the undercloud Glance API.
++    default: ''
++  LiveUpdatePassword:
++    type: string
++    default: ''
++    description: The live-update password for the undercloud Glance API.
++    hidden: true
++  LiveUpdateTenantName:
++    type: string
++    description: The live-update tenant name for the undercloud Glance API.
++    default: ''
++  LiveUpdateUserName:
++    type: string
++    description: The live-update username for the undercloud Glance API.
++    default: ''
++  NeutronNetworkVLANRanges:
++    default: 'datacentre'
++    description: >
++      The Neutron ML2 and OpenVSwitch vlan mapping range to support. See the
++      Neutron documentation for permitted values. Defaults to permitting any
++      VLAN on the 'datacentre' physical network (See NeutronBridgeMappings).
++    type: string
++  NovaComputeDriver:
++    type: string
++    default: libvirt.LibvirtDriver
++  NovaComputeExtraConfig:
++    default: {}
++    description: |
++      NovaCompute specific configuration to inject into the cluster. Same
++      structure as ExtraConfig.
++    type: json
++  NovaComputeLibvirtType:
++    default: ''
++    type: string
++  NovaImage:
++    type: string
++    default: overcloud-compute
++  OvercloudComputeFlavor:
++    description: Use this flavor
++    type: string
++    default: baremetal
++
++
++resources:
++
++  Controller:
++    type: OS::Heat::ResourceGroup
++    properties:
++      count: {get_param: ControllerCount}
++      resource_def:
++        type: OS::TripleO::Controller
++        properties:
++          AdminPassword: {get_param: AdminPassword}
++          AdminToken: {get_param: AdminToken}
++          CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
++          CeilometerPassword: {get_param: CeilometerPassword}
++          CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
++          CinderPassword: {get_param: CinderPassword}
++          CinderISCSIHelper: {get_param: CinderISCSIHelper}
++          CloudName: {get_param: CloudName}
++          ControlVirtualInterface: {get_param: ControlVirtualInterface}
++          controllerExtraConfig: {get_param: controllerExtraConfig}
++          ExtraConfig: {get_param: ExtraConfig}
++          Flavor: {get_param: ControllerFlavor}
++          GlancePort: {get_param: GlancePort}
++          GlanceProtocol: {get_param: GlanceProtocol}
++          GlancePassword: {get_param: GlancePassword}
++          GlanceNotifierStrategy: {get_param: GlanceNotifierStrategy}
++          GlanceLogFile: {get_param: GlanceLogFile}
++          HeatPassword: {get_param: HeatPassword}
++          HeatStackDomainAdminPassword: {get_param: HeatStackDomainAdminPassword}
++          Image: {get_param: controllerImage}
++          ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
++          KeyName: {get_param: KeyName}
++          KeystoneCACertificate: {get_param: KeystoneCACertificate}
++          KeystoneSigningCertificate: {get_param: KeystoneSigningCertificate}
++          KeystoneSigningKey: {get_param: KeystoneSigningKey}
++          MysqlClusterUniquePart: {get_attr: [MysqlClusterUniquePart, value]}
++          MysqlInnodbBufferPoolSize: {get_param: MysqlInnodbBufferPoolSize}
++          MysqlRootPassword: {get_attr: [MysqlRootPassword, value]}
++          NeutronPublicInterfaceIP: {get_param: NeutronPublicInterfaceIP}
++          NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
++          NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
++          NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
++          NeutronPublicInterface: {get_param: NeutronPublicInterface}
++          NeutronPublicInterfaceDefaultRoute: {get_param: NeutronPublicInterfaceDefaultRoute}
++          NeutronPublicInterfaceRawDevice: {get_param: NeutronPublicInterfaceRawDevice}
++          NeutronPassword: {get_param: NeutronPassword}
++          NeutronDnsmasqOptions: {get_param: NeutronDnsmasqOptions}
++          NovaPassword: {get_param: NovaPassword}
++          NtpServer: {get_param: NtpServer}
++          PublicVirtualInterface: {get_param: PublicVirtualInterface}
++          RabbitUserName: {get_param: RabbitUserName}
++          RabbitPassword: {get_param: RabbitPassword}
++          RabbitCookie: {get_attr: [RabbitCookie, value]}
++          SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
++          SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
++          SSLCertificate: {get_param: SSLCertificate}
++          SSLKey: {get_param: SSLKey}
++          SSLCACertificate: {get_param: SSLCACertificate}
++          VirtualIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          PublicVirtualIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
++
++  Compute:
++    type: OS::Heat::ResourceGroup
++    properties:
++      count: {get_param: ComputeCount}
++      resource_def:
++        type: OS::TripleO::Compute
++        properties:
++          AdminPassword: {get_param: AdminPassword}
++          CeilometerComputeAgent: {get_param: CeilometerComputeAgent}
++          CeilometerMeteringSecret: {get_param: CeilometerMeteringSecret}
++          CeilometerPassword: {get_param: CeilometerPassword}
++          ExtraConfig: {get_param: ExtraConfig}
++          Flavor: {get_param: OvercloudComputeFlavor}
++          GlanceHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          GlancePort: {get_param: GlancePort}
++          GlanceProtocol: {get_param: GlanceProtocol}
++          Image: {get_param: NovaImage}
++          ImageUpdatePolicy: {get_param: ImageUpdatePolicy}
++          KeyName: {get_param: KeyName}
++          KeystoneHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          LiveUpdateComputeImage: {get_param: LiveUpdateComputeImage}
++          LiveUpdateHost: {get_param: LiveUpdateHost}
++          LiveUpdatePassword: {get_param: LiveUpdatePassword}
++          LiveUpdateTenantName: {get_param: LiveUpdateTenantName}
++          LiveUpdateUserName: {get_param: LiveUpdateUserName}
++          NeutronBridgeMappings: {get_param: NeutronBridgeMappings}
++          NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
++          NeutronFlatNetworks: {get_param: NeutronFlatNetworks}
++          NeutronHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          NeutronNetworkType: {get_param: NeutronNetworkType}
++          NeutronTunnelTypes: {get_param: NeutronTunnelTypes}
++          NeutronNetworkVLANRanges: {get_param: NeutronNetworkVLANRanges}
++          NeutronPassword: {get_param: NeutronPassword}
++          NeutronPhysicalBridge: {get_param: HypervisorNeutronPhysicalBridge}
++          NeutronPublicInterface: {get_param: HypervisorNeutronPublicInterface}
++          NovaApiHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          NovaComputeDriver: {get_param: NovaComputeDriver}
++          NovaComputeExtraConfig: {get_param: NovaComputeExtraConfig}
++          NovaComputeLibvirtType: {get_param: NovaComputeLibvirtType}
++          NovaPublicIP: {get_attr: [PublicVirtualIP, fixed_ips, 0, ip_address]}
++          NovaPassword: {get_param: NovaPassword}
++          NtpServer: {get_param: NtpServer}
++          RabbitHost: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          RabbitPassword: {get_param: RabbitPassword}
++          RabbitUserName: {get_param: RabbitUserName}
++          SnmpdReadonlyUserName: {get_param: SnmpdReadonlyUserName}
++          SnmpdReadonlyUserPassword: {get_param: SnmpdReadonlyUserPassword}
++          NovaDSN:
++            list_join:
++              - ''
++              - - mysql://nova:unset@
++                - &compute_database_host {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++                - /nova
++          CeilometerDSN:
++            list_join:
++              - ''
++              - - mysql://ceilometer:unset@
++                - *compute_database_host
++                - /ceilometer
++          NeutronDSN:
++            list_join:
++              - ''
++              - - mysql://neutron:unset@
++                - *compute_database_host
++                - /ovs_neutron
++
++  allNodesConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      config:
++        completion-signal: {get_input: deploy_signal_id}
++        hosts:
++          list_join:
++          - "\n"
++          - - list_join:
++              - "\n"
++              - {get_attr: [Compute, hosts_entry]}
++            - list_join:
++              - "\n"
++              - {get_attr: [Controller, hosts_entry]}
++              # TODO: ADD BLOCK STORAGE ENTRY HERE
++              # TODO: ADD SWIFT STORAGE ENTRY HERE
++        rabbit:
++          nodes:
++            list_join:
++            - ','
++            - {get_attr: [Controller, hostname]}
++
++  MysqlRootPassword:
++    type: OS::Heat::RandomString
++    properties:
++      length: 10
++
++  MysqlClusterUniquePart:
++    type: OS::Heat::RandomString
++    properties:
++      length: 10
++
++  RabbitCookie:
++    type: OS::Heat::RandomString
++    properties:
++      length: 20
++      salt: {get_param: RabbitCookieSalt}
++
++  ControlVirtualIP:
++    type: OS::Neutron::Port
++    properties:
++      name: control_virtual_ip
++      network_id: {get_param: NeutronControlPlaneID}
++      fixed_ips: {get_param: ControlFixedIPs}
++
++  PublicVirtualIP:
++    type: OS::Neutron::Port
++    properties:
++      name: public_virtual_ip
++      network: {get_param: PublicVirtualNetwork}
++      fixed_ips: {get_param: PublicVirtualFixedIPs}
++
++  ControllerBootstrapNodeConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config:
++        bootstrap_host:
++          bootstrap_nodeid: {get_attr: [Controller, resource.0.hostname]}
++
++  ControllerBootstrapNodeDeployment:
++    type: OS::Heat::StructuredDeployments
++    properties:
++      config: {get_resource: ControllerBootstrapNodeConfig}
++      servers: {get_attr: [Controller, attributes, nova_server_resource]}
++      signal_transport: NO_SIGNAL
++
++  ControllerSwiftDeployment:
++    type: OS::Heat::StructuredDeployments
++    properties:
++      config: {get_resource: ControllerSwiftConfig}
++      servers: {get_attr: [Controller, attributes, nova_server_resource]}
++      signal_transport: NO_SIGNAL
++      input_values:
++        swift_hash_suffix: {get_param: SwiftHashSuffix}
++        swift_password: {get_param: SwiftPassword}
++        swift_part_power: {get_param: SwiftPartPower}
++        swift_replicas: { get_param: SwiftReplicas}
++
++  ControllerSwiftConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config:
++        swift:
++          devices:
++            list_join:
++            - ", "
++            - - list_join:
++                - ", "
++                - {get_attr: [Controller, swift_device]}
++              - list_join:
++                - ", "
++                # TODO: replace the empty list with this:
++                # - {get_attr: [ObjectStorage, swift_device]}
++                # Once we have the swift/object-storage role
++                - []
++          hash: { get_input: swift_hash_suffix }
++          part-power: { get_input: swift_part_power }
++          proxy-memcache:
++            list_join:
++            - ","
++            - {get_attr: [Controller, swift_proxy_memcache]}
++          replicas: {get_input: swift_replicas }
++          service-password: { get_input: swift_password }
++
++  ControllerClusterConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      config:
++        corosync:
++          nodes: {get_attr: [Controller, corosync_node]}
++        horizon:
++          caches:
++            memcached:
++              nodes: {get_attr: [Controller, hostname]}
++        mysql:
++          nodes: {get_attr: [Controller, corosync_node]}
++        haproxy:
++          nodes: {get_attr: [Controller, corosync_node]}
++
++  ControlerClusterDeployment:
++    type: OS::Heat::StructuredDeployments
++    properties:
++      config: {get_resource: ControllerClusterConfig}
++      servers: {get_attr: [Controller, attributes, nova_server_resource]}
++      signal_transport: NO_SIGNAL
++
++  ControllerAllNodesDeployment:
++    type: OS::Heat::StructuredDeployments
++    properties:
++      config: {get_resource: allNodesConfig}
++      servers: {get_attr: [Controller, attributes, nova_server_resource]}
++
++  ComputeAllNodesDeployment:
++    type: OS::Heat::StructuredDeployments
++    properties:
++      config: {get_resource: allNodesConfig}
++      servers: {get_attr: [Compute, attributes, nova_server_resource]}
++
++outputs:
++  KeystoneURL:
++    description: URL for the Overcloud Keystone service
++    value:
++      list_join:
++      - ''
++      - - http://
++        - {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++        - :5000/v2.0/
diff --git a/0002-Add-converted-version-of-block-and-object-storage.patch b/0002-Add-converted-version-of-block-and-object-storage.patch
new file mode 100644
index 0000000..a70951e
--- /dev/null
+++ b/0002-Add-converted-version-of-block-and-object-storage.patch
@@ -0,0 +1,441 @@
+From 98d3444f406c54156561b225c1e1c0d656d671ea Mon Sep 17 00:00:00 2001
+From: Peter Belanyi <pbelanyi at redhat.com>
+Date: Wed, 24 Sep 2014 07:51:13 -0400
+Subject: [PATCH] Add converted version of block and object storage
+
+This patch extends the previous 'Don't use merge.py for overcloud'
+commit with the cinder-storage.yaml and swift-storage.yaml templates.
+
+Requirements for this to deploy:
+
+1. Block and object storage images have to be built
+(overcloud-cinder-volume and overcloud-swift-storage)
+
+2. The images have to be loaded by devtest_overcloud.sh
+OVERCLOUD_CINDER_ID=$(load-image -d $TRIPLEO_ROOT/overcloud-cinder-volume.qcow2)
+OVERCLOUD_SWIFT_ID=$(load-image -d $TRIPLEO_ROOT/overcloud-swift-storage.qcow2)
+
+Change-Id: I45f9d9f051970a83e26c0fd924d7c98276958113
+---
+ cinder-storage.yaml              | 141 +++++++++++++++++++++++++++++++++++++++
+ overcloud-resource-registry.yaml |   2 +
+ overcloud.yaml                   |  89 +++++++++++++++++++++++-
+ swift-storage.yaml               | 137 +++++++++++++++++++++++++++++++++++++
+ 4 files changed, 367 insertions(+), 2 deletions(-)
+ create mode 100644 cinder-storage.yaml
+ create mode 100644 swift-storage.yaml
+
+diff --git a/cinder-storage.yaml b/cinder-storage.yaml
+new file mode 100644
+index 0000000..31a7ccf
+--- /dev/null
++++ b/cinder-storage.yaml
+@@ -0,0 +1,141 @@
++heat_template_version: 2014-10-16
++description: 'Common Block Storage Configuration'
++parameters:
++  AdminPassword:
++    default: ''
++    type: string
++  BlockStorageImage:
++    default: overcloud-cinder-volume
++    type: string
++  CinderISCSIHelper:
++    default: tgtadm
++    description: The iSCSI helper to use with cinder.
++    type: string
++  CinderLVMLoopDeviceSize:
++    default: 5000
++    description: The size of the loopback file used by the cinder LVM driver.
++    type: number
++  CinderPassword:
++    default: unset
++    description: The password for the cinder service account, used by cinder-api.
++    hidden: true
++    type: string
++  ControllerIP:
++    default: ''
++    type: string
++  GlancePort:
++    default: 9292
++    description: Glance port.
++    type: string
++  KeyName:
++    default: default
++    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
++    type: string
++  NeutronEnableTunnelling:
++    default: true
++    type: string
++  NeutronNetworkType:
++    default: gre
++    type: string
++  NeutronPassword:
++    default: ''
++    type: string
++  NeutronPublicInterface:
++    default: ''
++    type: string
++  OvercloudBlockStorageFlavor:
++    default: baremetal
++    description: Flavor for block storage nodes to request when deploying.
++    type: string
++  RabbitPassword:
++    default: ''
++    type: string
++  RabbitUserName:
++    default: ''
++    type: string
++resources:
++  BlockStorage:
++    type: OS::Nova::Server
++    properties:
++      image:
++        {get_param: BlockStorageImage}
++      flavor: {get_param: OvercloudBlockStorageFlavor}
++      key_name: {get_param: KeyName}
++      user_data_format: SOFTWARE_CONFIG
++      networks:
++        - network: ctlplane
++  BlockStorageDeployment:
++    type: OS::Heat::StructuredDeployment
++    properties:
++      server: {get_resource: BlockStorage}
++      config: {get_resource: BlockStorageConfig}
++      input_values:
++        controller_host: {get_param: ControllerIP}
++        cinder_dsn: {list_join: ['', ['mysql://cinder:unset@', {get_param: ControllerIP} , '/cinder']]}
++        neutron_local_ip: {get_attr: [BlockStorage , networks, ctlplane, 0]}
++      signal_transport: NO_SIGNAL
++  BlockStorageConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config:
++        admin-password: {get_param: AdminPassword}
++        keystone:
++          host: {get_input: controller_host}
++        cinder:
++          db: {get_input: cinder_dsn}
++          volume_size_mb:
++            get_param: CinderLVMLoopDeviceSize
++          service-password:
++            get_param: CinderPassword
++          iscsi-helper:
++            get_param: CinderISCSIHelper
++        rabbit:
++          host: {get_input: controller_host}
++          username: {get_param: RabbitUserName}
++          password: {get_param: RabbitPassword}
++        glance:
++          host: {get_input: controller_host}
++          port: {get_param: GlancePort}
++        interfaces:
++          control: {get_param: NeutronPublicInterface}
++        neutron:
++          ovs:
++            local_ip: {get_input: neutron_local_ip}
++            tenant_network_type: {get_param: NeutronNetworkType}
++            enable_tunneling: {get_param: NeutronEnableTunnelling}
++          service-password:
++            get_param: NeutronPassword
++        config:
++          keystone:
++            host: {get_input: controller_host}
++          cinder:
++            db: {get_input: cinder_dsn}
++            volume_size_mb:
++              get_param: CinderLVMLoopDeviceSize
++            service-password:
++              get_param: CinderPassword
++            iscsi-helper:
++              get_param: CinderISCSIHelper
++          admin-password: {get_param: AdminPassword}
++          rabbit:
++            host: {get_input: controller_host}
++            username: {get_param: RabbitUserName}
++            password: {get_param: RabbitPassword}
++          interfaces:
++            control: {get_param: NeutronPublicInterface}
++          neutron:
++            ovs:
++              local_ip: { get_input: neutron_local_ip }
++              tenant_network_type: {get_param: NeutronNetworkType}
++              enable_tunneling: {get_param: NeutronEnableTunnelling}
++            service-password:
++              get_param: NeutronPassword
++outputs:
++  hosts_entry:
++    value:
++      str_replace:
++        template: "IP HOST HOST.novalocal"
++        params:
++          IP: {get_attr: [BlockStorage, networks, ctlplane, 0]}
++          HOST: {get_attr: [BlockStorage, name]}
+diff --git a/overcloud-resource-registry.yaml b/overcloud-resource-registry.yaml
+index 29074fc..822d987 100644
+--- a/overcloud-resource-registry.yaml
++++ b/overcloud-resource-registry.yaml
+@@ -1,3 +1,5 @@
+ resource_registry:
++  OS::TripleO::BlockStorage: cinder-storage.yaml
+   OS::TripleO::Compute: compute.yaml
+   OS::TripleO::Controller: controller.yaml
++  OS::TripleO::ObjectStorage: swift-storage.yaml
+diff --git a/overcloud.yaml b/overcloud.yaml
+index 9e6fba1..7fd685a 100644
+--- a/overcloud.yaml
++++ b/overcloud.yaml
+@@ -396,6 +396,48 @@ parameters:
+     type: string
+     default: baremetal
+ 
++# BLOCK STORAGE SPECIFIC PARAMS
++  BlockStorageCount:
++    type: number
++    default: 1
++  BlockStorageImage:
++    default: overcloud-cinder-volume
++    type: string
++  CinderISCSIHelper:
++    default: tgtadm
++    description: The iSCSI helper to use with cinder.
++    type: string
++  CinderLVMLoopDeviceSize:
++    default: 5000
++    description: The size of the loopback file used by the cinder LVM driver.
++    type: number
++  CinderPassword:
++    default: unset
++    description: The password for the cinder service account, used by cinder-api.
++    hidden: true
++    type: string
++  NeutronNetworkType:
++    default: gre
++    type: string
++  OvercloudBlockStorageFlavor:
++    default: baremetal
++    description: Flavor for block storage nodes to request when deploying.
++    type: string
++
++# OBJECT STORAGE SPECIFIC PARAMS
++  ObjectStorageCount:
++    type: number
++    default: 1
++  NeutronNetworkType:
++    default: gre
++    type: string
++  OvercloudSwiftStorageFlavor:
++    default: baremetal
++    description: Flavor for Swift storage nodes to request when deploying.
++    type: string
++  SwiftStorageImage:
++    default: overcloud-swift-storage
++    type: string
+ 
+ resources:
+ 
+@@ -523,6 +565,45 @@ resources:
+                 - *compute_database_host
+                 - /ovs_neutron
+ 
++  BlockStorage:
++    type: OS::Heat::ResourceGroup
++    properties:
++      count: {get_param: BlockStorageCount}
++      resource_def:
++        type: OS::TripleO::BlockStorage
++        properties:
++          AdminPassword: {get_param: AdminPassword}
++          BlockStorageImage: {get_param: BlockStorageImage}
++          CinderISCSIHelper: {get_param: CinderISCSIHelper}
++          CinderLVMLoopDeviceSize: {get_param: CinderLVMLoopDeviceSize}
++          CinderPassword: {get_param: CinderPassword}
++          ControllerIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          KeyName: {get_param: KeyName}
++          NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
++          NeutronNetworkType: {get_param: NeutronNetworkType}
++          NeutronPassword: {get_param: NeutronPassword}
++          NeutronPublicInterface: {get_param: NeutronPublicInterface}
++          OvercloudBlockStorageFlavor: {get_param: OvercloudBlockStorageFlavor}
++          RabbitPassword: {get_param: RabbitPassword}
++          RabbitUserName: {get_param: RabbitUserName}
++
++  ObjectStorage:
++    type: OS::Heat::ResourceGroup
++    properties:
++      count: {get_param: ObjectStorageCount}
++      resource_def:
++        type: OS::TripleO::ObjectStorage
++        properties:
++          ControllerIP: {get_attr: [ControlVirtualIP, fixed_ips, 0, ip_address]}
++          KeyName: {get_param: KeyName}
++          NeutronEnableTunnelling: {get_param: NeutronEnableTunnelling}
++          NeutronNetworkType: {get_param: NeutronNetworkType}
++          OvercloudSwiftStorageFlavor: {get_param: OvercloudSwiftStorageFlavor}
++          SwiftHashSuffix: {get_param: SwiftHashSuffix}
++          SwiftPassword: {get_param: SwiftPassword}
++          SwiftStorageImage: {get_param: SwiftStorageImage}
++
++
+   allNodesConfig:
+     type: OS::Heat::StructuredConfig
+     properties:
+@@ -537,8 +618,12 @@ resources:
+             - list_join:
+               - "\n"
+               - {get_attr: [Controller, hosts_entry]}
+-              # TODO: ADD BLOCK STORAGE ENTRY HERE
+-              # TODO: ADD SWIFT STORAGE ENTRY HERE
++            - list_join:
++              - "\n"
++              - {get_attr: [BlockStorage, hosts_entry]}
++            - list_join:
++              - "\n"
++              - {get_attr: [ObjectStorage, hosts_entry]}
+         rabbit:
+           nodes:
+             list_join:
+diff --git a/swift-storage.yaml b/swift-storage.yaml
+new file mode 100644
+index 0000000..94856e8
+--- /dev/null
++++ b/swift-storage.yaml
+@@ -0,0 +1,137 @@
++heat_template_version: 2014-10-16
++description: 'Common Swift Storage Configuration'
++parameters:
++  ControllerIP:
++    default: ''
++    type: string
++  KeyName:
++    default: default
++    description: Name of an existing EC2 KeyPair to enable SSH access to the instances
++    type: string
++  NeutronEnableTunnelling:
++    default: true
++    type: string
++  NeutronNetworkType:
++    default: gre
++    type: string
++  OvercloudSwiftStorageFlavor:
++    default: baremetal
++    description: Flavor for Swift storage nodes to request when deploying.
++    type: string
++  SwiftHashSuffix:
++    default: unset
++    description: A random string to be used as a salt when hashing to determine mappings
++      in the ring.
++    hidden: true
++    type: string
++  SwiftPartPower:
++    default: 10
++    description: Partition Power to use when building Swift rings
++    type: number
++  SwiftPassword:
++    default: unset
++    description: The password for the swift service account, used by the swift proxy
++      services.
++    hidden: true
++    type: string
++  SwiftStorageImage:
++    default: overcloud-swift-storage
++    type: string
++resources:
++  SwiftConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      group: os-apply-config
++      config:
++        swift:
++          devices: { get_input: swift_devices }
++          hash: { get_input: swift_hash_suffix }
++          part-power: { get_input: swift_part_power }
++          proxy-memcache: { get_input: swift_proxy_memcache }
++          replicas: {get_input: swift_replicas }
++          service-password: { get_input: swift_password }
++        neutron:
++          enable_tunnelling: {get_param: NeutronEnableTunnelling}
++          tenant_network_type: {get_param: NeutronNetworkType}
++          ovs:
++            local_ip: { get_input: neutron_local_ip }
++  SwiftStorage:
++    type: OS::Nova::Server
++    properties:
++      image: {get_param: SwiftStorageImage}
++      flavor: {get_param: OvercloudSwiftStorageFlavor}
++      key_name: {get_param: KeyName}
++      user_data_format: SOFTWARE_CONFIG
++      networks:
++        - network: ctlplane
++  SwiftKeystoneConfig:
++    type: OS::Heat::StructuredConfig
++    properties:
++      config:
++        keystone:
++          host: {get_input: keystone_host}
++  SwiftStorageKeystone:
++    type: OS::Heat::StructuredDeployment
++    properties:
++      server: {get_resource: SwiftStorage}
++      config: {get_resource: SwiftKeystoneConfig}
++      signal_transport: NO_SIGNAL
++      input_values:
++        keystone_host: {get_param: ControllerIP}
++  SwiftStorageDeploy:
++    type: OS::Heat::StructuredDeployment
++    properties:
++      server: {get_resource: SwiftStorage}
++      config: {get_resource: SwiftConfig}
++      signal_transport: NO_SIGNAL
++      input_values:
++        neutron_local_ip: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
++        swift_hash_suffix: {get_param: SwiftHashSuffix}
++        swift_password: {get_param: SwiftPassword}
++        swift_part_power: {get_param: SwiftPartPower}
++        swift_devices:
++          str_replace:
++            template: 'r1z1-IP:%PORT%/d1'
++            params:
++              IP: {get_param: ControllerIP}
++          # TODO: FIGURE OUT HOW TO PASS THIS TO ALL NODES IN THE RESOURCE GROUP
++          # list_join:
++          # - ', '
++          # - Merge::Map:
++          #     controller0:
++          #       list_join:
++          #       - ''
++          #       - - 'r1z1-'
++          #         - {get_attr: [controller0, networks, ctlplane, 0]}
++          #         - ':%PORT%/d1'
++          #     SwiftStorage0:
++          #       list_join:
++          #       - ''
++          #       - - 'r1z1-'
++          #         - {get_attr: [SwiftStorage0, networks, ctlplane, 0]}
++          #         - ':%PORT%/d1'
++        swift_proxy_memcache:
++          str_replace:
++            template: "IP:11211"
++            params:
++              IP: {get_param: ControllerIP}
++          # TODO: FIGURE OUT HOW TO PASS THIS TO ALL NODES IN THE RESOURCE GROUP
++          # list_join:
++          #   - ','
++          #   - Merge::Map:
++          #       controller0:
++          #         list_join:
++          #           - ', '
++          #           - - list_join:
++          #               - ''
++          #               - - {get_attr: [controller0, networks, ctlplane, 0]}
++          #                 - ':11211'
++
++outputs:
++  hosts_entry:
++    value:
++      str_replace:
++        template: "IP HOST HOST.novalocal"
++        params:
++          IP: {get_attr: [SwiftStorage, networks, ctlplane, 0]}
++          HOST: {get_attr: [SwiftStorage, name]}
diff --git a/openstack-tripleo-heat-templates.spec b/openstack-tripleo-heat-templates.spec
index c483cae..e5ebf86 100644
--- a/openstack-tripleo-heat-templates.spec
+++ b/openstack-tripleo-heat-templates.spec
@@ -7,6 +7,9 @@ Group:		System Environment/Base
 URL:		https://wiki.openstack.org/wiki/TripleO
 Source0:	http://tarballs.openstack.org/tripleo-heat-templates/tripleo-heat-templates-%{version}.tar.gz
 
+Patch0001: 0001-Compute-and-controller-templates-without-merge.py.patch
+Patch0002: 0002-Add-converted-version-of-block-and-object-storage.patch
+
 BuildArch:	noarch
 BuildRequires:	python2-devel
 BuildRequires:	python-setuptools
@@ -22,6 +25,9 @@ building Heat Templates to do deployments of OpenStack.
 %prep
 %setup -q -n tripleo-heat-templates-%{version}
 
+%patch0001 -p1
+%patch0002 -p1
+
 %build
 %{__python2} setup.py build
 


More information about the scm-commits mailing list