public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Matt Thode" <prometheanfire@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] dev/prometheanfire:master commit in: www-apps/horizon/files/, dev-python/python-swift3/, sys-auth/swift-keystone2/, ...
Date: Fri, 26 Oct 2012 20:35:11 +0000 (UTC)	[thread overview]
Message-ID: <1351283707.8338fdecf0bc0a3305b95bc69ca07028e432d9b8.prometheanfire@gentoo> (raw)

commit:     8338fdecf0bc0a3305b95bc69ca07028e432d9b8
Author:     Matthew Thode <mthode <AT> mthode <DOT> org>
AuthorDate: Fri Oct 26 20:35:07 2012 +0000
Commit:     Matt Thode <prometheanfire <AT> gentoo <DOT> org>
CommitDate: Fri Oct 26 20:35:07 2012 +0000
URL:        http://git.overlays.gentoo.org/gitweb/?p=dev/prometheanfire.git;a=commit;h=8338fdec

adding first try of openstack

---
 app-admin/glance/Manifest                          |    6 +
 app-admin/glance/files/glance-swift-authv2.patch   |  914 ++++++++++++++++++++
 app-admin/glance/files/glance.confd                |    1 +
 app-admin/glance/files/glance.initd                |   51 ++
 app-admin/glance/glance-2012.1.2.ebuild            |   44 +
 app-admin/glance/glance-9999.ebuild                |   44 +
 dev-python/nova-adminclient/Manifest               |    2 +
 .../nova-adminclient/nova-adminclient-0.1.8.ebuild |   25 +
 dev-python/passlib/Manifest                        |    2 +
 dev-python/passlib/passlib-1.3.1.ebuild            |   34 +
 dev-python/python-cloudfiles/Manifest              |    2 +
 .../python-cloudfiles-1.7.10.ebuild                |   27 +
 .../python-cloudfiles-9999.ebuild                  |   25 +
 dev-python/python-keystoneclient/Manifest          |    7 +
 .../python-keystoneclient-2012.1.ebuild            |   35 +
 .../python-keystoneclient-2012.1_rc1.ebuild        |   37 +
 .../python-keystoneclient-2012.1_rc2.ebuild        |   37 +
 .../python-keystoneclient-9999.ebuild              |   36 +
 dev-python/python-novaclient/Manifest              |    8 +
 .../python-novaclient-2012.1.ebuild                |   28 +
 .../python-novaclient-2012.1_rc1.ebuild            |   30 +
 .../python-novaclient-2012.1_rc3.ebuild            |   30 +
 .../python-novaclient-2012.1_rc4.ebuild            |   30 +
 dev-python/python-quantumclient/Manifest           |    1 +
 .../python-quantumclient-9999.ebuild               |   30 +
 dev-python/python-swift3/Manifest                  |    1 +
 .../python-swift3/python-swift3-1.5.0.ebuild       |   27 +
 net-dns/dnsmasq/Manifest                           |    5 +
 net-dns/dnsmasq/dnsmasq-2.63.ebuild                |  129 +++
 .../dnsmasq/files/dnsmasq-2.47-fbsd-config.patch   |   16 +
 net-dns/dnsmasq/files/dnsmasq-init-r2              |   25 +
 net-dns/dnsmasq/files/dnsmasq.confd-r1             |    4 +
 net-misc/quantum/Manifest                          |    4 +
 net-misc/quantum/files/quantum-server.confd        |    2 +
 net-misc/quantum/files/quantum-server.initd        |   43 +
 .../files/server-setup-disable-initd-install.patch |   21 +
 net-misc/quantum/quantum-9999.ebuild               |   51 ++
 sys-auth/keystone/Manifest                         |   13 +
 sys-auth/keystone/files/keystone.confd             |    2 +
 sys-auth/keystone/files/keystone.initd             |   53 ++
 sys-auth/keystone/keystone-2012.1.2.ebuild         |   40 +
 sys-auth/keystone/keystone-9999.ebuild             |   32 +
 sys-auth/swift-keystone2/Manifest                  |    1 +
 .../swift-keystone2/swift-keystone2-9999.ebuild    |   26 +
 sys-cluster/nova/Manifest                          |   16 +
 sys-cluster/nova/files/nova.confd                  |    4 +
 sys-cluster/nova/files/nova.initd                  |   54 ++
 sys-cluster/nova/nova-2012.1.2.ebuild              |   64 ++
 sys-cluster/nova/nova-9999.ebuild                  |   63 ++
 sys-cluster/swift/Manifest                         |   15 +
 .../swift/files/swift-1.5.0-client-authv2.patch    |   22 +
 sys-cluster/swift/files/swift-proxy-server.initd   |   64 ++
 sys-cluster/swift/files/swift-storage-server.confd |    5 +
 sys-cluster/swift/files/swift-storage-server.initd |   60 ++
 sys-cluster/swift/swift-1.5.0.ebuild               |   52 ++
 sys-cluster/swift/swift-9999.ebuild                |   48 +
 www-apps/horizon/Manifest                          |   12 +
 www-apps/horizon/files/horizon_vhost.conf          |   14 +
 www-apps/horizon/files/revert-bugfix-974916.patch  |  125 +++
 www-apps/horizon/horizon-2012.1.1-r1.ebuild        |   74 ++
 www-apps/horizon/horizon-9999.ebuild               |   59 ++
 www-apps/noVNC/Manifest                            |    3 +
 www-apps/noVNC/files/noVNC.confd                   |    4 +
 www-apps/noVNC/files/noVNC.initd                   |   49 +
 www-apps/noVNC/noVNC-9999.ebuild                   |   63 ++
 www-misc/websockify/Manifest                       |    1 +
 www-misc/websockify/websockify-9999.ebuild         |   25 +
 67 files changed, 2877 insertions(+), 0 deletions(-)

diff --git a/app-admin/glance/Manifest b/app-admin/glance/Manifest
new file mode 100644
index 0000000..3abf039
--- /dev/null
+++ b/app-admin/glance/Manifest
@@ -0,0 +1,6 @@
+AUX glance-swift-authv2.patch 38569 SHA256 651afe783f515121d28cbbb94c7d14de5a5c3f7616edba8bf83e941c2c0eb4b4 SHA512 5038c473052b316a524f60f5be6fbf90bec565f74f8f8f44e1c55d5b8e079d68057551998470ee5b8f2da13a865d308dd52504128129f91ec141c846b590b4c3 WHIRLPOOL b077b62101be3b674256ffbd96064441b79c2fefb003011a5f8343e228b133982ecedbf750617e886f5291ca8727df361ce74b7809f8ba6feb156acff541f190
+AUX glance.confd 25 SHA256 5a53dcf1eece81a06a2dd0856b15f8abe20eb1072361b110f752e396e86a7843 SHA512 13e671d4544e58d7397c1a87eb1048ed4bb9561587fcd63783e377b2d25e810222ca3944e0c8cf13c524e64f94c435b456a0d6f7cacfb148e275377699a11ca9 WHIRLPOOL 862a310fbdd7b68f132c45797210011b607d9b5c8937d60c9f5933a4d625bc985ad0277fea26804681b7e0a674dc9da15fbef40502c4052d6742ef0a94e88f3d
+AUX glance.initd 1101 SHA256 6fe85f10513646263755a2b2e232385dfc8dccb1be4f24b5c7e4f8879fb4f288 SHA512 674c68f13566ebd3443af9d6756f4cf4ebf6a17037a03ea93cb89d39f4f5a0141e572576890e481723b82e857040bfe075238d8c919e7a5fb33e1086e2a1e93a WHIRLPOOL 404e53d29f2f01218e445ce6dcdcdf6620ed6a9f245f2dc9020bd059ca461e1b72a692e7cd9c488daaaacb246160a8ca3a07e9481e536386891c07f3ee79b774
+DIST glance-2012.1.2.tar.gz 299991 SHA256 df03f968feb28ad301e5764070776d9e31cf08e4c85ce793e5079fe9b9d3e705
+EBUILD glance-2012.1.2.ebuild 1108 SHA256 17b956c34cb2b151854a843125a2beb1048a89e2906e443685dfbf3eebf2e7e4 SHA512 e012a54ebe91d238008dd53356918b062f606049a0aa4527e24478ebf07c914560378c5f524f75f0ec3b21d87ddcd114f0580bf0e6b75b149167306f4c83e129 WHIRLPOOL f7154e36dfb5d5150e91a8a86123ddb61b951fa3ba229181198cbeeccd288215c6db987e436f4ba76c835fc7433c1bfd598244613c6e891ff75adc99b63cb550
+EBUILD glance-9999.ebuild 1099 SHA256 74c444acb23496e45d1577d27277ecca481b77ff53b2113defa881c0a4b22812 SHA512 a5cce4fcaea0937e8289ea8439a08f17facdfc608d4dda999213008147c7c4caaf2e293938bcb216a771d65bfc80abad119fedab67fdf9329037b4c9e3976193 WHIRLPOOL ffe2ea0250f451f3f97cc07272ba4104d17584a78446a6aa94282dd6be2f8a3a2813619cdc619d54d38cb39ae90cb31608e0aadc258cffeccf03e024d40c1074

diff --git a/app-admin/glance/files/glance-swift-authv2.patch b/app-admin/glance/files/glance-swift-authv2.patch
new file mode 100644
index 0000000..7c8f507
--- /dev/null
+++ b/app-admin/glance/files/glance-swift-authv2.patch
@@ -0,0 +1,914 @@
+diff -urN glance-2012.1.orig/Authors glance-2012.1/Authors
+--- glance-2012.1.orig/Authors	2012-03-21 10:51:12.000000000 +0100
++++ glance-2012.1/Authors	2012-03-28 17:48:31.000000000 +0200
+@@ -27,6 +27,7 @@
+ Johannes Erdfelt <johannes.erdfelt@rackspace.com>
+ Josh Durgin <josh.durgin@dreamhost.com>
+ Josh Kearney <josh@jk0.org>
++Juerg Haefliger <juerg.haefliger@hp.com>
+ Justin Santa Barbara <justin@fathomdb.com>
+ Justin Shepherd <jshepher@rackspace.com>
+ Ken Pepple <ken.pepple@gmail.com>
+diff -urN glance-2012.1.orig/Authors.orig glance-2012.1/Authors.orig
+--- glance-2012.1.orig/Authors.orig	1970-01-01 01:00:00.000000000 +0100
++++ glance-2012.1/Authors.orig	2012-03-21 10:51:12.000000000 +0100
+@@ -0,0 +1,62 @@
++Adam Gandelman <adam.gandelman@canonical.com>
++Alex Meade <alex.meade@rackspace.com>
++Andrew Hutchings <andrew@linuxjedi.co.uk>
++Andrey Brindeyev <abrindeyev@griddynamics.com>
++Brian Lamar <brian.lamar@rackspace.com>
++Brian Waldon <brian.waldon@rackspace.com>
++Chris Behrens <cbehrens@codestud.com>
++Christopher MacGown <chris@pistoncloud.com>
++Chuck Short <chuck.short@canonical.com>
++Cory Wright <corywright@gmail.com>
++Dan Prince <dprince@redhat.com>
++Dean Troyer <dtroyer@gmail.com>
++Derek Higgins <derekh@redhat.com>
++Donal Lafferty <donal.lafferty@citrix.com>
++Eldar Nugaev <enugaev@griddynamics.com>
++Eoghan Glynn <eglynn@redhat.com>
++Ewan Mellor <ewan.mellor@citrix.com>
++Gabriel Hurley <gabriel@strikeawe.com>
++Hengqing Hu <hudayou@hotmail.com>
++Isaku Yamahata <yamahata@valinux.co.jp>
++Jason Koelker <jason@koelker.net>
++Jay Pipes <jaypipes@gmail.com>
++James E. Blair <jeblair@hp.com>
++Jesse Andrews <anotherjesse@gmail.com>
++Jinwoo 'Joseph' Suh <jsuh@isi.edu>
++Joe Gordon <jogo@cloudscaling.com>
++Johannes Erdfelt <johannes.erdfelt@rackspace.com>
++Josh Durgin <josh.durgin@dreamhost.com>
++Josh Kearney <josh@jk0.org>
++Justin Santa Barbara <justin@fathomdb.com>
++Justin Shepherd <jshepher@rackspace.com>
++Ken Pepple <ken.pepple@gmail.com>
++Ken Thomas <krt@yahoo-inc.com>
++Kevin L. Mitchell <kevin.mitchell@rackspace.com>
++Lorin Hochstein <lorin@isi.edu>
++Major Hayden <major@mhtx.net>
++Mark McLoughlin <markmc@redhat.com>
++Mark Washenberger <mark.washenberger@rackspace.com>
++Maru Newby <mnewby@internap.com>
++Matt Dietz <matt.dietz@rackspace.com>
++Mike Lundy <mike@pistoncloud.com>
++Monty Taylor <mordred@inaugust.com>
++Pádraig Brady <P@draigBrady.com>
++Paul Bourke <paul-david.bourke@hp.com>
++Pavan Kumar Sunkara <pavan.sss1991@gmail.com>
++Peng Yong <ppyy@pubyun.com>
++Pete Zaitcev <zaitcev@kotori.zaitcev.us>
++Rick Clark <rick@openstack.org>
++Rick Harris <rconradharris@gmail.com>
++Reynolds Chin <benzwt@gmail.com>
++Russell Bryant <rbryant@redhat.com>
++Soren Hansen <soren.hansen@rackspace.com>
++Stuart McLaren <stuart.mclaren@hp.com>
++Taku Fukushima <tfukushima@dcl.info.waseda.ac.jp>
++Thierry Carrez <thierry@openstack.org>
++Tom Hancock <tom.hancock@hp.com>
++Wayne A. Walls <wayne.walls@rackspace.com>
++William Wolf <throughnothing@gmail.com>
++Vishvananda Ishaya <vishvananda@gmail.com>
++Yaguang Tang <heut2008@gmail.com>
++Yuriy Taraday <yorik.sar@gmail.com>
++Zhongyue Luo <lzyeval@gmail.com>
+diff -urN glance-2012.1.orig/etc/glance-api.conf glance-2012.1/etc/glance-api.conf
+--- glance-2012.1.orig/etc/glance-api.conf	2012-03-21 10:51:12.000000000 +0100
++++ glance-2012.1/etc/glance-api.conf	2012-03-28 17:48:31.000000000 +0200
+@@ -130,10 +130,15 @@
+ 
+ # ============ Swift Store Options =============================
+ 
++# Version of the authentication service to use
++# Valid versions are '2' for keystone and '1' for swauth and rackspace
++swift_store_auth_version = 2
++
+ # Address where the Swift authentication service lives
+ # Valid schemes are 'http://' and 'https://'
+ # If no scheme specified,  default to 'https://'
+-swift_store_auth_address = 127.0.0.1:8080/v1.0/
++# For swauth, use something like '127.0.0.1:8080/v1.0/'
++swift_store_auth_address = 127.0.0.1:35357/v2.0/
+ 
+ # User to authenticate against the Swift authentication service
+ # If you use Swift authentication service, set it to 'account':'user'
+diff -urN glance-2012.1.orig/glance/store/swift.py glance-2012.1/glance/store/swift.py
+--- glance-2012.1.orig/glance/store/swift.py	2012-03-21 10:51:12.000000000 +0100
++++ glance-2012.1/glance/store/swift.py	2012-03-28 17:50:34.000000000 +0200
+@@ -192,9 +192,10 @@
+         cfg.StrOpt('swift_store_auth_address'),
+         cfg.StrOpt('swift_store_user'),
+         cfg.StrOpt('swift_store_key'),
++        cfg.StrOpt('swift_store_auth_version', default='2'),
+         cfg.StrOpt('swift_store_container',
+                    default=DEFAULT_CONTAINER),
+-        cfg.IntOpt('swift_store_large_object_size',
++            cfg.IntOpt('swift_store_large_object_size',
+                    default=DEFAULT_LARGE_OBJECT_SIZE),
+         cfg.IntOpt('swift_store_large_object_chunk_size',
+                    default=DEFAULT_LARGE_OBJECT_CHUNK_SIZE),
+@@ -204,6 +205,7 @@
+     def configure(self):
+         self.conf.register_opts(self.opts)
+         self.snet = self.conf.swift_enable_snet
++        self.auth_version = self._option_get('swift_store_auth_version')
+ 
+     def configure_add(self):
+         """
+@@ -300,11 +302,14 @@
+         Creates a connection using the Swift client library.
+         """
+         snet = self.snet
++        auth_version = self.auth_version
+         logger.debug(_("Creating Swift connection with "
+                      "(auth_address=%(auth_url)s, user=%(user)s, "
+-                     "snet=%(snet)s)") % locals())
++                     "snet=%(snet)s, auth_version=%(auth_version)s)") %
++                     locals())
+         return swift_client.Connection(
+-            authurl=auth_url, user=user, key=key, snet=snet)
++            authurl=auth_url, user=user, key=key, snet=snet,
++            auth_version=auth_version)
+ 
+     def _option_get(self, param):
+         result = getattr(self.conf, param)
+diff -urN glance-2012.1.orig/glance/store/swift.py.orig glance-2012.1/glance/store/swift.py.orig
+--- glance-2012.1.orig/glance/store/swift.py.orig	1970-01-01 01:00:00.000000000 +0100
++++ glance-2012.1/glance/store/swift.py.orig	2012-03-21 10:51:12.000000000 +0100
+@@ -0,0 +1,560 @@
++# vim: tabstop=4 shiftwidth=4 softtabstop=4
++
++# Copyright 2010-2011 OpenStack, LLC
++# All Rights Reserved.
++#
++#    Licensed under the Apache License, Version 2.0 (the "License"); you may
++#    not use this file except in compliance with the License. You may obtain
++#    a copy of the License at
++#
++#         http://www.apache.org/licenses/LICENSE-2.0
++#
++#    Unless required by applicable law or agreed to in writing, software
++#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
++#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
++#    License for the specific language governing permissions and limitations
++#    under the License.
++
++"""Storage backend for SWIFT"""
++
++from __future__ import absolute_import
++
++import hashlib
++import httplib
++import logging
++import math
++import urlparse
++
++from glance.common import cfg
++from glance.common import exception
++import glance.store
++import glance.store.base
++import glance.store.location
++
++try:
++    from swift.common import client as swift_client
++except ImportError:
++    pass
++
++DEFAULT_CONTAINER = 'glance'
++DEFAULT_LARGE_OBJECT_SIZE = 5 * 1024  # 5GB
++DEFAULT_LARGE_OBJECT_CHUNK_SIZE = 200  # 200M
++ONE_MB = 1000 * 1024
++
++logger = logging.getLogger('glance.store.swift')
++
++
++class StoreLocation(glance.store.location.StoreLocation):
++
++    """
++    Class describing a Swift URI. A Swift URI can look like any of
++    the following:
++
++        swift://user:pass@authurl.com/container/obj-id
++        swift://account:user:pass@authurl.com/container/obj-id
++        swift+http://user:pass@authurl.com/container/obj-id
++        swift+https://user:pass@authurl.com/container/obj-id
++
++    The swift+http:// URIs indicate there is an HTTP authentication URL.
++    The default for Swift is an HTTPS authentication URL, so swift:// and
++    swift+https:// are the same...
++    """
++
++    def process_specs(self):
++        self.scheme = self.specs.get('scheme', 'swift+https')
++        self.user = self.specs.get('user')
++        self.key = self.specs.get('key')
++        self.authurl = self.specs.get('authurl')
++        self.container = self.specs.get('container')
++        self.obj = self.specs.get('obj')
++
++    def _get_credstring(self):
++        if self.user:
++            return '%s:%s@' % (self.user, self.key)
++        return ''
++
++    def get_uri(self):
++        authurl = self.authurl
++        if authurl.startswith('http://'):
++            authurl = authurl[7:]
++        elif authurl.startswith('https://'):
++            authurl = authurl[8:]
++
++        credstring = self._get_credstring()
++        authurl = authurl.strip('/')
++        container = self.container.strip('/')
++        obj = self.obj.strip('/')
++
++        return '%s://%s%s/%s/%s' % (self.scheme, credstring, authurl,
++                                    container, obj)
++
++    def parse_uri(self, uri):
++        """
++        Parse URLs. This method fixes an issue where credentials specified
++        in the URL are interpreted differently in Python 2.6.1+ than prior
++        versions of Python. It also deals with the peculiarity that new-style
++        Swift URIs have where a username can contain a ':', like so:
++
++            swift://account:user:pass@authurl.com/container/obj
++        """
++        # Make sure that URIs that contain multiple schemes, such as:
++        # swift://user:pass@http://authurl.com/v1/container/obj
++        # are immediately rejected.
++        if uri.count('://') != 1:
++            reason = _(
++                    "URI cannot contain more than one occurrence of a scheme."
++                    "If you have specified a URI like "
++                    "swift://user:pass@http://authurl.com/v1/container/obj"
++                    ", you need to change it to use the swift+http:// scheme, "
++                    "like so: "
++                    "swift+http://user:pass@authurl.com/v1/container/obj"
++                    )
++            raise exception.BadStoreUri(uri, reason)
++
++        pieces = urlparse.urlparse(uri)
++        assert pieces.scheme in ('swift', 'swift+http', 'swift+https')
++        self.scheme = pieces.scheme
++        netloc = pieces.netloc
++        path = pieces.path.lstrip('/')
++        if netloc != '':
++            # > Python 2.6.1
++            if '@' in netloc:
++                creds, netloc = netloc.split('@')
++            else:
++                creds = None
++        else:
++            # Python 2.6.1 compat
++            # see lp659445 and Python issue7904
++            if '@' in path:
++                creds, path = path.split('@')
++            else:
++                creds = None
++            netloc = path[0:path.find('/')].strip('/')
++            path = path[path.find('/'):].strip('/')
++        if creds:
++            cred_parts = creds.split(':')
++
++            # User can be account:user, in which case cred_parts[0:2] will be
++            # the account and user. Combine them into a single username of
++            # account:user
++            if len(cred_parts) == 1:
++                reason = (_("Badly formed credentials '%(creds)s' in Swift "
++                            "URI") % locals())
++                raise exception.BadStoreUri(uri, reason)
++            elif len(cred_parts) == 3:
++                user = ':'.join(cred_parts[0:2])
++            else:
++                user = cred_parts[0]
++            key = cred_parts[-1]
++            self.user = user
++            self.key = key
++        else:
++            self.user = None
++        path_parts = path.split('/')
++        try:
++            self.obj = path_parts.pop()
++            self.container = path_parts.pop()
++            if not netloc.startswith('http'):
++                # push hostname back into the remaining to build full authurl
++                path_parts.insert(0, netloc)
++                self.authurl = '/'.join(path_parts)
++        except IndexError:
++            reason = _("Badly formed Swift URI")
++            raise exception.BadStoreUri(uri, reason)
++
++    @property
++    def swift_auth_url(self):
++        """
++        Creates a fully-qualified auth url that the Swift client library can
++        use. The scheme for the auth_url is determined using the scheme
++        included in the `location` field.
++
++        HTTPS is assumed, unless 'swift+http' is specified.
++        """
++        if self.scheme in ('swift+https', 'swift'):
++            auth_scheme = 'https://'
++        else:
++            auth_scheme = 'http://'
++
++        full_url = ''.join([auth_scheme, self.authurl])
++        return full_url
++
++
++class Store(glance.store.base.Store):
++    """An implementation of the swift backend adapter."""
++
++    EXAMPLE_URL = "swift://<USER>:<KEY>@<AUTH_ADDRESS>/<CONTAINER>/<FILE>"
++
++    CHUNKSIZE = 65536
++
++    opts = [
++        cfg.BoolOpt('swift_enable_snet', default=False),
++        cfg.StrOpt('swift_store_auth_address'),
++        cfg.StrOpt('swift_store_user'),
++        cfg.StrOpt('swift_store_key'),
++        cfg.StrOpt('swift_store_container',
++                   default=DEFAULT_CONTAINER),
++        cfg.IntOpt('swift_store_large_object_size',
++                   default=DEFAULT_LARGE_OBJECT_SIZE),
++        cfg.IntOpt('swift_store_large_object_chunk_size',
++                   default=DEFAULT_LARGE_OBJECT_CHUNK_SIZE),
++        cfg.BoolOpt('swift_store_create_container_on_put', default=False),
++        ]
++
++    def configure(self):
++        self.conf.register_opts(self.opts)
++        self.snet = self.conf.swift_enable_snet
++
++    def configure_add(self):
++        """
++        Configure the Store to use the stored configuration options
++        Any store that needs special configuration should implement
++        this method. If the store was not able to successfully configure
++        itself, it should raise `exception.BadStoreConfiguration`
++        """
++        self.auth_address = self._option_get('swift_store_auth_address')
++        self.user = self._option_get('swift_store_user')
++        self.key = self._option_get('swift_store_key')
++        self.container = self.conf.swift_store_container
++        try:
++            # The config file has swift_store_large_object_*size in MB, but
++            # internally we store it in bytes, since the image_size parameter
++            # passed to add() is also in bytes.
++            self.large_object_size = \
++                self.conf.swift_store_large_object_size * ONE_MB
++            self.large_object_chunk_size = \
++                self.conf.swift_store_large_object_chunk_size * ONE_MB
++        except cfg.ConfigFileValueError, e:
++            reason = _("Error in configuration conf: %s") % e
++            logger.error(reason)
++            raise exception.BadStoreConfiguration(store_name="swift",
++                                                  reason=reason)
++
++        self.scheme = 'swift+https'
++        if self.auth_address.startswith('http://'):
++            self.scheme = 'swift+http'
++            self.full_auth_address = self.auth_address
++        elif self.auth_address.startswith('https://'):
++            self.full_auth_address = self.auth_address
++        else:  # Defaults https
++            self.full_auth_address = 'https://' + self.auth_address
++
++    def get(self, location):
++        """
++        Takes a `glance.store.location.Location` object that indicates
++        where to find the image file, and returns a tuple of generator
++        (for reading the image file) and image_size
++
++        :param location `glance.store.location.Location` object, supplied
++                        from glance.store.location.get_location_from_uri()
++        :raises `glance.exception.NotFound` if image does not exist
++        """
++        loc = location.store_location
++        swift_conn = self._make_swift_connection(
++            auth_url=loc.swift_auth_url, user=loc.user, key=loc.key)
++
++        try:
++            (resp_headers, resp_body) = swift_conn.get_object(
++                container=loc.container, obj=loc.obj,
++                resp_chunk_size=self.CHUNKSIZE)
++        except swift_client.ClientException, e:
++            if e.http_status == httplib.NOT_FOUND:
++                uri = location.get_store_uri()
++                raise exception.NotFound(_("Swift could not find image at "
++                                         "uri %(uri)s") % locals())
++            else:
++                raise
++
++        class ResponseIndexable(glance.store.Indexable):
++            def another(self):
++                try:
++                    return self.wrapped.next()
++                except StopIteration:
++                    return ''
++
++        length = resp_headers.get('content-length')
++        return (ResponseIndexable(resp_body, length), length)
++
++    def get_size(self, location):
++        """
++        Takes a `glance.store.location.Location` object that indicates
++        where to find the image file, and returns the image_size (or 0
++        if unavailable)
++
++        :param location `glance.store.location.Location` object, supplied
++                        from glance.store.location.get_location_from_uri()
++        """
++        loc = location.store_location
++        swift_conn = self._make_swift_connection(
++            auth_url=loc.swift_auth_url, user=loc.user, key=loc.key)
++
++        try:
++            resp_headers = swift_conn.head_object(container=loc.container,
++                                                  obj=loc.obj)
++            return resp_headers.get('content-length', 0)
++        except Exception:
++            return 0
++
++    def _make_swift_connection(self, auth_url, user, key):
++        """
++        Creates a connection using the Swift client library.
++        """
++        snet = self.snet
++        logger.debug(_("Creating Swift connection with "
++                     "(auth_address=%(auth_url)s, user=%(user)s, "
++                     "snet=%(snet)s)") % locals())
++        return swift_client.Connection(
++            authurl=auth_url, user=user, key=key, snet=snet)
++
++    def _option_get(self, param):
++        result = getattr(self.conf, param)
++        if not result:
++            reason = (_("Could not find %(param)s in configuration "
++                        "options.") % locals())
++            logger.error(reason)
++            raise exception.BadStoreConfiguration(store_name="swift",
++                                                  reason=reason)
++        return result
++
++    def add(self, image_id, image_file, image_size):
++        """
++        Stores an image file with supplied identifier to the backend
++        storage system and returns an `glance.store.ImageAddResult` object
++        containing information about the stored image.
++
++        :param image_id: The opaque image identifier
++        :param image_file: The image data to write, as a file-like object
++        :param image_size: The size of the image data to write, in bytes
++
++        :retval `glance.store.ImageAddResult` object
++        :raises `glance.common.exception.Duplicate` if the image already
++                existed
++
++        Swift writes the image data using the scheme:
++            ``swift://<USER>:<KEY>@<AUTH_ADDRESS>/<CONTAINER>/<ID>`
++        where:
++            <USER> = ``swift_store_user``
++            <KEY> = ``swift_store_key``
++            <AUTH_ADDRESS> = ``swift_store_auth_address``
++            <CONTAINER> = ``swift_store_container``
++            <ID> = The id of the image being added
++
++        :note Swift auth URLs by default use HTTPS. To specify an HTTP
++              auth URL, you can specify http://someurl.com for the
++              swift_store_auth_address config option
++
++        :note Swift cannot natively/transparently handle objects >5GB
++              in size. So, if the image is greater than 5GB, we write
++              chunks of image data to Swift and then write an manifest
++              to Swift that contains information about the chunks.
++              This same chunking process is used by default for images
++              of an unknown size, as pushing them directly to swift would
++              fail if the image turns out to be greater than 5GB.
++        """
++        swift_conn = self._make_swift_connection(
++            auth_url=self.full_auth_address, user=self.user, key=self.key)
++
++        create_container_if_missing(self.container, swift_conn, self.conf)
++
++        obj_name = str(image_id)
++        location = StoreLocation({'scheme': self.scheme,
++                                  'container': self.container,
++                                  'obj': obj_name,
++                                  'authurl': self.auth_address,
++                                  'user': self.user,
++                                  'key': self.key})
++
++        logger.debug(_("Adding image object '%(obj_name)s' "
++                       "to Swift") % locals())
++        try:
++            if image_size > 0 and image_size < self.large_object_size:
++                # Image size is known, and is less than large_object_size.
++                # Send to Swift with regular PUT.
++                obj_etag = swift_conn.put_object(self.container, obj_name,
++                                                 image_file,
++                                                 content_length=image_size)
++            else:
++                # Write the image into Swift in chunks.
++                chunk_id = 1
++                if image_size > 0:
++                    total_chunks = str(int(
++                        math.ceil(float(image_size) /
++                                  float(self.large_object_chunk_size))))
++                else:
++                    # image_size == 0 is when we don't know the size
++                    # of the image. This can occur with older clients
++                    # that don't inspect the payload size.
++                    logger.debug(_("Cannot determine image size. Adding as a "
++                                   "segmented object to Swift."))
++                    total_chunks = '?'
++
++                checksum = hashlib.md5()
++                combined_chunks_size = 0
++                while True:
++                    chunk_size = self.large_object_chunk_size
++                    if image_size == 0:
++                        content_length = None
++                    else:
++                        left = image_size - combined_chunks_size
++                        if left == 0:
++                            break
++                        if chunk_size > left:
++                            chunk_size = left
++                        content_length = chunk_size
++
++                    chunk_name = "%s-%05d" % (obj_name, chunk_id)
++                    reader = ChunkReader(image_file, checksum, chunk_size)
++                    chunk_etag = swift_conn.put_object(
++                        self.container, chunk_name, reader,
++                        content_length=content_length)
++                    bytes_read = reader.bytes_read
++                    logger.debug(_("Wrote chunk %(chunk_id)d/"
++                                   "%(total_chunks)s of length %(bytes_read)d "
++                                   "to Swift returning MD5 of content: "
++                                   "%(chunk_etag)s")
++                                 % locals())
++
++                    if bytes_read == 0:
++                        # Delete the last chunk, because it's of zero size.
++                        # This will happen if image_size == 0.
++                        logger.debug(_("Deleting final zero-length chunk"))
++                        swift_conn.delete_object(self.container, chunk_name)
++                        break
++
++                    chunk_id += 1
++                    combined_chunks_size += bytes_read
++
++                # In the case we have been given an unknown image size,
++                # set the image_size to the total size of the combined chunks.
++                if image_size == 0:
++                    image_size = combined_chunks_size
++
++                # Now we write the object manifest and return the
++                # manifest's etag...
++                manifest = "%s/%s" % (self.container, obj_name)
++                headers = {'ETag': hashlib.md5("").hexdigest(),
++                           'X-Object-Manifest': manifest}
++
++                # The ETag returned for the manifest is actually the
++                # MD5 hash of the concatenated checksums of the strings
++                # of each chunk...so we ignore this result in favour of
++                # the MD5 of the entire image file contents, so that
++                # users can verify the image file contents accordingly
++                swift_conn.put_object(self.container, obj_name,
++                                      None, headers=headers)
++                obj_etag = checksum.hexdigest()
++
++            # NOTE: We return the user and key here! Have to because
++            # location is used by the API server to return the actual
++            # image data. We *really* should consider NOT returning
++            # the location attribute from GET /images/<ID> and
++            # GET /images/details
++
++            return (location.get_uri(), image_size, obj_etag)
++        except swift_client.ClientException, e:
++            if e.http_status == httplib.CONFLICT:
++                raise exception.Duplicate(_("Swift already has an image at "
++                                          "location %s") % location.get_uri())
++            msg = (_("Failed to add object to Swift.\n"
++                   "Got error from Swift: %(e)s") % locals())
++            logger.error(msg)
++            raise glance.store.BackendException(msg)
++
++    def delete(self, location):
++        """
++        Takes a `glance.store.location.Location` object that indicates
++        where to find the image file to delete
++
++        :location `glance.store.location.Location` object, supplied
++                  from glance.store.location.get_location_from_uri()
++
++        :raises NotFound if image does not exist
++        """
++        loc = location.store_location
++        swift_conn = self._make_swift_connection(
++            auth_url=loc.swift_auth_url, user=loc.user, key=loc.key)
++
++        try:
++            # We request the manifest for the object. If one exists,
++            # that means the object was uploaded in chunks/segments,
++            # and we need to delete all the chunks as well as the
++            # manifest.
++            manifest = None
++            try:
++                headers = swift_conn.head_object(loc.container, loc.obj)
++                manifest = headers.get('x-object-manifest')
++            except swift_client.ClientException, e:
++                if e.http_status != httplib.NOT_FOUND:
++                    raise
++            if manifest:
++                # Delete all the chunks before the object manifest itself
++                obj_container, obj_prefix = manifest.split('/', 1)
++                for segment in swift_conn.get_container(obj_container,
++                                                        prefix=obj_prefix)[1]:
++                    # TODO(jaypipes): This would be an easy area to parallelize
++                    # since we're simply sending off parallelizable requests
++                    # to Swift to delete stuff. It's not like we're going to
++                    # be hogging up network or file I/O here...
++                    swift_conn.delete_object(obj_container, segment['name'])
++
++            else:
++                swift_conn.delete_object(loc.container, loc.obj)
++
++        except swift_client.ClientException, e:
++            if e.http_status == httplib.NOT_FOUND:
++                uri = location.get_store_uri()
++                raise exception.NotFound(_("Swift could not find image at "
++                                         "uri %(uri)s") % locals())
++            else:
++                raise
++
++
++class ChunkReader(object):
++    def __init__(self, fd, checksum, total):
++        self.fd = fd
++        self.checksum = checksum
++        self.total = total
++        self.bytes_read = 0
++
++    def read(self, i):
++        left = self.total - self.bytes_read
++        if i > left:
++            i = left
++        result = self.fd.read(i)
++        self.bytes_read += len(result)
++        self.checksum.update(result)
++        return result
++
++
++def create_container_if_missing(container, swift_conn, conf):
++    """
++    Creates a missing container in Swift if the
++    ``swift_store_create_container_on_put`` option is set.
++
++    :param container: Name of container to create
++    :param swift_conn: Connection to Swift
++    :param conf: Option mapping
++    """
++    try:
++        swift_conn.head_container(container)
++    except swift_client.ClientException, e:
++        if e.http_status == httplib.NOT_FOUND:
++            if conf.swift_store_create_container_on_put:
++                try:
++                    swift_conn.put_container(container)
++                except swift_client.ClientException, e:
++                    msg = _("Failed to add container to Swift.\n"
++                           "Got error from Swift: %(e)s") % locals()
++                    raise glance.store.BackendException(msg)
++            else:
++                msg = (_("The container %(container)s does not exist in "
++                       "Swift. Please set the "
++                       "swift_store_create_container_on_put option"
++                       "to add container to Swift automatically.")
++                       % locals())
++                raise glance.store.BackendException(msg)
++        else:
++            raise
++
++
++glance.store.register_store(__name__, ['swift', 'swift+http', 'swift+https'])
+diff -urN glance-2012.1.orig/glance/store/swift.py.rej glance-2012.1/glance/store/swift.py.rej
+--- glance-2012.1.orig/glance/store/swift.py.rej	1970-01-01 01:00:00.000000000 +0100
++++ glance-2012.1/glance/store/swift.py.rej	2012-03-28 17:48:31.000000000 +0200
+@@ -0,0 +1,16 @@
++***************
++*** 192,197 ****
++          cfg.StrOpt('swift_store_auth_address'),
++          cfg.StrOpt('swift_store_user', secret=True),
++          cfg.StrOpt('swift_store_key', secret=True),
++          cfg.StrOpt('swift_store_container',
++                     default=DEFAULT_CONTAINER),
++          cfg.IntOpt('swift_store_large_object_size',
++--- 192,198 ----
++          cfg.StrOpt('swift_store_auth_address'),
++          cfg.StrOpt('swift_store_user', secret=True),
++          cfg.StrOpt('swift_store_key', secret=True),
+++         cfg.StrOpt('swift_store_auth_version', default='2'),
++          cfg.StrOpt('swift_store_container',
++                     default=DEFAULT_CONTAINER),
++          cfg.IntOpt('swift_store_large_object_size',
+diff -urN glance-2012.1.orig/glance/tests/unit/test_swift_store.py glance-2012.1/glance/tests/unit/test_swift_store.py
+--- glance-2012.1.orig/glance/tests/unit/test_swift_store.py	2012-03-21 10:51:12.000000000 +0100
++++ glance-2012.1/glance/tests/unit/test_swift_store.py	2012-03-28 17:48:31.000000000 +0200
+@@ -52,7 +52,7 @@
+ # We stub out as little as possible to ensure that the code paths
+ # between glance.store.swift and swift.common.client are tested
+ # thoroughly
+-def stub_out_swift_common_client(stubs):
++def stub_out_swift_common_client(stubs, conf):
+ 
+     fixture_containers = ['glance']
+     fixture_headers = {'glance/%s' % FAKE_UUID:
+@@ -158,9 +158,13 @@
+     def fake_http_connection(*args, **kwargs):
+         return None
+ 
+-    def fake_get_auth(url, *args, **kwargs):
++    def fake_get_auth(url, user, key, snet, auth_version, **kwargs):
+         if 'http' in url and '://' not in url:
+             raise ValueError('Invalid url %s' % url)
++        # Check the auth version against the configured value
++        if conf['swift_store_auth_version'] != auth_version:
++            msg = 'AUTHENTICATION failed (version mismatch)'
++            raise swift.common.client.ClientException(msg)
+         return None, None
+ 
+     stubs.Set(swift.common.client,
+@@ -181,17 +185,16 @@
+               'http_connection', fake_http_connection)
+ 
+ 
+-class TestStore(unittest.TestCase):
++class SwiftTests(object):
+ 
+-    def setUp(self):
+-        """Establish a clean test environment"""
+-        self.stubs = stubout.StubOutForTesting()
+-        stub_out_swift_common_client(self.stubs)
+-        self.store = Store(test_utils.TestConfigOpts(SWIFT_CONF))
+-
+-    def tearDown(self):
+-        """Clear the test environment"""
+-        self.stubs.UnsetAll()
++    def test_get_size(self):
++        """
++        Test that we can get the size of an object in the swift store
++        """
++        uri = "swift://user:key@auth_address/glance/%s" % FAKE_UUID
++        loc = get_location_from_uri(uri)
++        image_size = self.store.get_size(loc)
++        self.assertEqual(image_size, 5120)
+ 
+     def test_get(self):
+         """Test a "normal" retrieval of an image in chunks"""
+@@ -298,15 +301,14 @@
+             expected_swift_contents = "*" * expected_swift_size
+             expected_checksum = \
+                     hashlib.md5(expected_swift_contents).hexdigest()
+-            new_conf = SWIFT_CONF.copy()
+-            new_conf['swift_store_auth_address'] = variation
++            self.conf['swift_store_auth_address'] = variation
+ 
+             image_swift = StringIO.StringIO(expected_swift_contents)
+ 
+             global SWIFT_PUT_OBJECT_CALLS
+             SWIFT_PUT_OBJECT_CALLS = 0
+ 
+-            self.store = Store(test_utils.TestConfigOpts(new_conf))
++            self.store = Store(test_utils.TestConfigOpts(self.conf))
+             location, size, checksum = self.store.add(image_id, image_swift,
+                                                       expected_swift_size)
+ 
+@@ -328,11 +330,10 @@
+         Tests that adding an image with a non-existing container
+         raises an appropriate exception
+         """
+-        conf = SWIFT_CONF.copy()
+-        conf['swift_store_create_container_on_put'] = 'False'
+-        conf['swift_store_container'] = 'noexist'
++        self.conf['swift_store_create_container_on_put'] = 'False'
++        self.conf['swift_store_container'] = 'noexist'
+         image_swift = StringIO.StringIO("nevergonnamakeit")
+-        self.store = Store(test_utils.TestConfigOpts(conf))
++        self.store = Store(test_utils.TestConfigOpts(self.conf))
+ 
+         global SWIFT_PUT_OBJECT_CALLS
+         SWIFT_PUT_OBJECT_CALLS = 0
+@@ -355,9 +356,8 @@
+         Tests that adding an image with a non-existing container
+         creates the container automatically if flag is set
+         """
+-        conf = SWIFT_CONF.copy()
+-        conf['swift_store_create_container_on_put'] = 'True'
+-        conf['swift_store_container'] = 'noexist'
++        self.conf['swift_store_create_container_on_put'] = 'True'
++        self.conf['swift_store_container'] = 'noexist'
+         expected_swift_size = FIVE_KB
+         expected_swift_contents = "*" * expected_swift_size
+         expected_checksum = hashlib.md5(expected_swift_contents).hexdigest()
+@@ -369,7 +369,7 @@
+         global SWIFT_PUT_OBJECT_CALLS
+         SWIFT_PUT_OBJECT_CALLS = 0
+ 
+-        self.store = Store(test_utils.TestConfigOpts(conf))
++        self.store = Store(test_utils.TestConfigOpts(self.conf))
+         location, size, checksum = self.store.add(expected_image_id,
+                                                   image_swift,
+                                                   expected_swift_size)
+@@ -394,8 +394,7 @@
+         and then verify that there have been a number of calls to
+         put_object()...
+         """
+-        conf = SWIFT_CONF.copy()
+-        conf['swift_store_container'] = 'glance'
++        self.conf['swift_store_container'] = 'glance'
+         expected_swift_size = FIVE_KB
+         expected_swift_contents = "*" * expected_swift_size
+         expected_checksum = hashlib.md5(expected_swift_contents).hexdigest()
+@@ -407,7 +406,7 @@
+         global SWIFT_PUT_OBJECT_CALLS
+         SWIFT_PUT_OBJECT_CALLS = 0
+ 
+-        self.store = Store(test_utils.TestConfigOpts(conf))
++        self.store = Store(test_utils.TestConfigOpts(self.conf))
+         orig_max_size = self.store.large_object_size
+         orig_temp_size = self.store.large_object_chunk_size
+         try:
+@@ -446,8 +445,7 @@
+ 
+         Bug lp:891738
+         """
+-        conf = SWIFT_CONF.copy()
+-        conf['swift_store_container'] = 'glance'
++        self.conf['swift_store_container'] = 'glance'
+ 
+         # Set up a 'large' image of 5KB
+         expected_swift_size = FIVE_KB
+@@ -463,7 +461,7 @@
+ 
+         # Temporarily set Swift MAX_SWIFT_OBJECT_SIZE to 1KB and add our image,
+         # explicitly setting the image_length to 0
+-        self.store = Store(test_utils.TestConfigOpts(conf))
++        self.store = Store(test_utils.TestConfigOpts(self.conf))
+         orig_max_size = self.store.large_object_size
+         orig_temp_size = self.store.large_object_chunk_size
+         global MAX_SWIFT_OBJECT_SIZE
+@@ -507,11 +505,10 @@
+                           FAKE_UUID, image_swift, 0)
+ 
+     def _option_required(self, key):
+-        conf = SWIFT_CONF.copy()
+-        del conf[key]
++        del self.conf[key]
+ 
+         try:
+-            self.store = Store(test_utils.TestConfigOpts(conf))
++            self.store = Store(test_utils.TestConfigOpts(self.conf))
+             return self.store.add == self.store.add_disabled
+         except:
+             return False
+@@ -554,6 +551,32 @@
+         self.assertRaises(exception.NotFound, self.store.delete, loc)
+ 
+ 
++class TestStoreAuthV1(unittest.TestCase, SwiftTests):
++
++    def setUp(self):
++        """Establish a clean test environment"""
++        self.conf = SWIFT_CONF.copy()
++        self.conf['swift_store_auth_version'] = '1'
++        self.stubs = stubout.StubOutForTesting()
++        stub_out_swift_common_client(self.stubs, self.conf)
++        self.store = Store(test_utils.TestConfigOpts(self.conf))
++
++    def tearDown(self):
++        """Clear the test environment"""
++        self.stubs.UnsetAll()
++
++
++class TestStoreAuthV2(TestStoreAuthV1):
++
++    def setUp(self):
++        """Establish a clean test environment"""
++        self.conf = SWIFT_CONF.copy()
++        self.conf['swift_store_auth_version'] = '2'
++        self.stubs = stubout.StubOutForTesting()
++        stub_out_swift_common_client(self.stubs, self.conf)
++        self.store = Store(test_utils.TestConfigOpts(self.conf))
++
++
+ class TestChunkReader(unittest.TestCase):
+ 
+     def test_read_all_data(self):

diff --git a/app-admin/glance/files/glance.confd b/app-admin/glance/files/glance.confd
new file mode 100644
index 0000000..4eb2893
--- /dev/null
+++ b/app-admin/glance/files/glance.confd
@@ -0,0 +1 @@
+PID_PATH=/var/run/glance

diff --git a/app-admin/glance/files/glance.initd b/app-admin/glance/files/glance.initd
new file mode 100644
index 0000000..1000e32
--- /dev/null
+++ b/app-admin/glance/files/glance.initd
@@ -0,0 +1,51 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+depend() {
+	need net
+}
+
+BASENAME=$(echo $SVCNAME | cut -d '-' -f 1)
+SERVERNAME=$(echo $SVCNAME | cut -d '-' -f 2)
+
+checkconfig() {
+	if [ ! -r /etc/conf.d/$BASENAME ]; then
+		eerror "No glance conf.dfile found: /etc/conf.d/$BASENAME)"
+		return 1
+	fi
+	if [ ! -r /etc/glance/${SVCNAME}.conf ]; then
+		eerror "No ${BASENAME} config file found: /etc/glance/${SVCNAME}.conf)"
+		return 1
+	fi
+	return 0
+}
+
+
+start() {
+	checkconfig || return $?
+	. /etc/conf.d/$BASENAME
+	
+	ebegin "Starting ${SVCNAME}"
+	
+	start-stop-daemon --start --quiet --pidfile "${PID_PATH}/${SVCENAME}.pid" \
+					  --exec /usr/bin/glance-control -- ${SERVERNAME} start
+	
+	eend $? "Failed to start ${SVCNAME}"
+}
+
+stop() {
+	checkconfig || return $?
+	. /etc/conf.d/$BASENAME
+	
+	ebegin "Stopping ${SVCNAME}"
+	
+	start-stop-daemon --stop --quiet --pidfile "${PID_PATH}/${SVCNAME}.pid" \
+					  --exec /usr/bin/glance-control -- ${SERVERNAME} stop
+	eend $? "Failed to stop ${SVCNAME}"
+}
+
+#restart() {
+#
+#}

diff --git a/app-admin/glance/glance-2012.1.2.ebuild b/app-admin/glance/glance-2012.1.2.ebuild
new file mode 100644
index 0000000..7ebcfd7
--- /dev/null
+++ b/app-admin/glance/glance-2012.1.2.ebuild
@@ -0,0 +1,44 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPENDS="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="Provides services for discovering, registering, and retrieving
+virtual machine images. Glance has a RESTful API that allows querying of VM
+image metadata as well as retrieval of the actual image."
+HOMEPAGE="https://launchpad.net/glance"
+SRC_URI="http://launchpad.net/${PN}/essex/${PV}/+download/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+		 dev-python/webob
+		 dev-python/httplib2
+		 dev-python/routes
+		 dev-python/paste
+		 dev-python/pastedeploy
+		 dev-python/pyxattr
+		 dev-python/kombu"
+
+src_install() {
+	distutils_src_install
+	newconfd "${FILESDIR}/glance.confd" glance
+	newinitd "${FILESDIR}/glance.initd" glance
+
+	for function in api registry scrubber; do
+		dosym /etc/init.d/glance /etc/init.d/glance-${function}
+	done
+
+	diropts -m 0750
+	dodir /var/run/glance /var/log/nova /var/lock/nova
+}

diff --git a/app-admin/glance/glance-9999.ebuild b/app-admin/glance/glance-9999.ebuild
new file mode 100644
index 0000000..a7957fe
--- /dev/null
+++ b/app-admin/glance/glance-9999.ebuild
@@ -0,0 +1,44 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPENDS="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="Provides services for discovering, registering, and retrieving
+virtual machine images. Glance has a RESTful API that allows querying of VM
+image metadata as well as retrieval of the actual image."
+HOMEPAGE="https://launchpad.net/glance"
+EGIT_REPO_URI="https://github.com/openstack/glance.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+		 dev-python/webob
+		 dev-python/httplib2
+		 dev-python/routes
+		 dev-python/paste
+		 dev-python/pastedeploy
+		 dev-python/pyxattr
+		 dev-python/kombu"
+
+src_install() {
+	distutils_src_install
+	newconfd "${FILESDIR}/glance.confd" glance
+	newinitd "${FILESDIR}/glance.initd" glance
+
+	for function in api registry scrubber; do
+		dosym /etc/init.d/glance /etc/init.d/glance-${function}
+	done
+
+	diropts -m 0750
+	dodir /var/run/glance /var/log/nova /var/lock/nova
+}

diff --git a/dev-python/nova-adminclient/Manifest b/dev-python/nova-adminclient/Manifest
new file mode 100644
index 0000000..0510470
--- /dev/null
+++ b/dev-python/nova-adminclient/Manifest
@@ -0,0 +1,2 @@
+DIST nova-adminclient-0.1.8.tar.gz 8100 RMD160 531a272ce5b57a757ebf917e759344d819c65b61 SHA1 c718de783fac8598d1c587575b869e121474a9d7 SHA256 ebf1efac43b9cb0269d4a54583c1051fa59ea67c52f71c6b45e8d3cf6792a9b6
+EBUILD nova-adminclient-0.1.8.ebuild 563 RMD160 c07311928558ecb4da9fd825c8566b4062148685 SHA1 545c922291c7b78128eb67275ccf886879bc4e09 SHA256 029aca91ea7a22f7ff962e6902be31d92e68005da3c6811cb2eab25691a24fa6

diff --git a/dev-python/nova-adminclient/nova-adminclient-0.1.8.ebuild b/dev-python/nova-adminclient/nova-adminclient-0.1.8.ebuild
new file mode 100644
index 0000000..6c1d3e4
--- /dev/null
+++ b/dev-python/nova-adminclient/nova-adminclient-0.1.8.ebuild
@@ -0,0 +1,25 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a python client library for consuming the OpenStack Nova
+admin API"
+HOMEPAGE="https://launchpad.net/nova-adminclient"
+SRC_URI="http://pypi.python.org/packages/source/${PN:0:1}/${PN}/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+        dev-python/boto"
+RDEPEND="${DEPEND}"
+

diff --git a/dev-python/passlib/Manifest b/dev-python/passlib/Manifest
new file mode 100644
index 0000000..fe8b762
--- /dev/null
+++ b/dev-python/passlib/Manifest
@@ -0,0 +1,2 @@
+DIST passlib-1.3.1.tar.gz 151494 SHA256 4cb312e18ee2c0f107a36799107dfd2e05c51faa54c5678397c38d89f35f1328
+EBUILD passlib-1.3.1.ebuild 685 SHA256 b62338ec3da7910242353a39338009dcdc2ff4f50731c0f525b8c10e74551b0d SHA512 75bf3f14e12071b006fa762e3f8da15dca60f00a9be16b6155df9a61c48c25962b0d06864c3beef92d44253ef97aa18e7b721d39d8925f9bd9c638c379d44e19 WHIRLPOOL 5258a5a8b564de99373e7e9b961ee3db18d24b84cdaac1f0b94b67d6166a91f303c9f586c205500d3d4dcde6e9054ea272b31cdade11f36f0218f030f03c39c5

diff --git a/dev-python/passlib/passlib-1.3.1.ebuild b/dev-python/passlib/passlib-1.3.1.ebuild
new file mode 100644
index 0000000..eda6d5c
--- /dev/null
+++ b/dev-python/passlib/passlib-1.3.1.ebuild
@@ -0,0 +1,34 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+# Ebuild generated by g-pypi 0.2.2 (rev. 214)
+
+EAPI=3
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+
+DESCRIPTION="comprehensive password hashing framework supporting over 20 schemes"
+HOMEPAGE="http://code.google.com/p/passlib/"
+SRC_URI="mirror://pypi/${PN}/${P}.tar.gz"
+LICENSE="BSD-2"
+KEYWORDS="~amd64 ~x86"
+SLOT="0"
+IUSE="test doc"
+DEPEND="dev-python/setuptools
+	test? ( dev-python/nose )"
+
+
+src_install() {
+	distutils_src_install
+	if use doc; then
+		dodoc "${S}"/docs/*
+	fi
+
+}
+
+src_test() {
+	PYTHONPATH=. "${python}" setup.py nosetests || die "tests failed"
+}
+

diff --git a/dev-python/python-cloudfiles/Manifest b/dev-python/python-cloudfiles/Manifest
new file mode 100644
index 0000000..9861ec4
--- /dev/null
+++ b/dev-python/python-cloudfiles/Manifest
@@ -0,0 +1,2 @@
+EBUILD python-cloudfiles-1.7.10.ebuild 576 RMD160 918dff94ad32c76230b10deeedab2e1dad99af70 SHA1 f4c5eaf7ce9355016b13f69562b8f50b77b2d5b8 SHA256 6f72670e23237c08df920c7d7f180697c3c09170a961be4eee351f5b610b0682
+EBUILD python-cloudfiles-9999.ebuild 542 RMD160 8e1a75967e9562cb3475fd90f6f99b3cec450e9f SHA1 ac364dc7f2da20d004791f1fe6159d5e51d17a0e SHA256 6535c4c7a01bc348159668ace4bf2ec2baa7739cd2d90c5f041043a5d0f882b4

diff --git a/dev-python/python-cloudfiles/python-cloudfiles-1.7.10.ebuild b/dev-python/python-cloudfiles/python-cloudfiles-1.7.10.ebuild
new file mode 100644
index 0000000..f40a2ed
--- /dev/null
+++ b/dev-python/python-cloudfiles/python-cloudfiles-1.7.10.ebuild
@@ -0,0 +1,27 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="CloudFiles client library for Python"
+HOMEPAGE="http://pypi.python.org/pypi/python-cloudfiles/"
+EGIT_REPO_URI="https://github.com/rackspace/python-cloudfiles.git"
+# 1.7.10
+EGIT_COMMIT="f420278622"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+        dev-python/nose
+		dev-python/epydoc"
+RDEPEND="${DEPEND}"
+

diff --git a/dev-python/python-cloudfiles/python-cloudfiles-9999.ebuild b/dev-python/python-cloudfiles/python-cloudfiles-9999.ebuild
new file mode 100644
index 0000000..de8c43b
--- /dev/null
+++ b/dev-python/python-cloudfiles/python-cloudfiles-9999.ebuild
@@ -0,0 +1,25 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="CloudFiles client library for Python"
+HOMEPAGE="http://pypi.python.org/pypi/python-cloudfiles/"
+EGIT_REPO_URI="https://github.com/rackspace/python-cloudfiles.git"
+
+LICENSE="MIT"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+        dev-python/nose
+		dev-python/epydoc"
+RDEPEND="${DEPEND}"
+

diff --git a/dev-python/python-keystoneclient/Manifest b/dev-python/python-keystoneclient/Manifest
new file mode 100644
index 0000000..bf48d45
--- /dev/null
+++ b/dev-python/python-keystoneclient/Manifest
@@ -0,0 +1,7 @@
+DIST python-keystoneclient-2012.1.tar.gz 48335 RMD160 c62fe318d5c28c1441288200202791cedd83de7a SHA1 3dc7e248b7668278fa0a4a315a1ce18a3ecc2b29 SHA256 4ed73ac8bdaec01ccc1b9c6e740826324798565f2472ee3ff9d4a767d0993549
+DIST python-keystoneclient-2012.1~rc1.tar.gz 42487 RMD160 210b897ce7cac3599c2a254e0bf431e9153bbbd2 SHA1 7b041c0bf0480437b59e208d60ad926ebea1383f SHA256 bc8fc4d958ff6a680f30577cb7f2c43b90518d6f3e773c94b2b09b490c4f5a60
+DIST python-keystoneclient-2012.1~rc2.tar.gz 48335 RMD160 c62fe318d5c28c1441288200202791cedd83de7a SHA1 3dc7e248b7668278fa0a4a315a1ce18a3ecc2b29 SHA256 4ed73ac8bdaec01ccc1b9c6e740826324798565f2472ee3ff9d4a767d0993549
+EBUILD python-keystoneclient-2012.1.ebuild 943 RMD160 2214374697026577fce6c886e6ab498ea6ae15bd SHA1 79bb28d805ed814affe4621d9e318cdeafbc8880 SHA256 76364a286c48195470c2b114cce4491a3d4b167ed10b4fa77ab485866c86fb30
+EBUILD python-keystoneclient-2012.1_rc1.ebuild 978 RMD160 76eb127e00e4d6a7b45445c0f69853ce1d59bc82 SHA1 01df90e5ea7125e9a895d7e4170ffa0a4dc9ff79 SHA256 a06a52f158855749110ff23325f1fbfd1ec5239297fb40fa92d59a119004d5e8
+EBUILD python-keystoneclient-2012.1_rc2.ebuild 978 RMD160 af08516d48c00dff325b0d09e9ed05e462040c2f SHA1 94abc59d00f73b7e0dba8a3c41b4bc51a06e22d2 SHA256 f799ecacafce5bde28734c1be13014b311a9ffa2b8c42bcff4fa0f39052a3aef
+EBUILD python-keystoneclient-9999.ebuild 967 RMD160 de8a0c747409226e5addf7c9c12040b3f9c1296e SHA1 535835a6f67087684a7f5f45f1e8be93f6fc00ad SHA256 b3dd1bce8f0270b0447cf01d6b505f94d4fa1ec39f8322b334b8dc946d0ba5fe

diff --git a/dev-python/python-keystoneclient/python-keystoneclient-2012.1.ebuild b/dev-python/python-keystoneclient/python-keystoneclient-2012.1.ebuild
new file mode 100644
index 0000000..566400d
--- /dev/null
+++ b/dev-python/python-keystoneclient/python-keystoneclient-2012.1.ebuild
@@ -0,0 +1,35 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a client for the OpenStack Keystone API. There's a Python
+API (the keystoneclient module), and a command-line script (keystone). The
+Keystone 2.0 API is still a moving target, so this module will remain in 'Beta'
+status until the API is finalized and fully implemented."
+HOMEPAGE="https://github.com/openstack/python-keystoneclient"
+SRC_URI="http://launchpad.net/keystone/essex/${PV}/+download/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/argparse
+		dev-python/coverage
+		dev-python/httplib2
+		dev-python/mock
+		dev-python/mox
+        dev-python/nose
+		dev-python/pep8
+		dev-python/prettytable
+		dev-python/simplejson"
+RDEPEND="${DEPEND}"
+

diff --git a/dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc1.ebuild b/dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc1.ebuild
new file mode 100644
index 0000000..89392c5
--- /dev/null
+++ b/dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc1.ebuild
@@ -0,0 +1,37 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a client for the OpenStack Keystone API. There's a Python
+API (the keystoneclient module), and a command-line script (keystone). The
+Keystone 2.0 API is still a moving target, so this module will remain in 'Beta'
+status until the API is finalized and fully implemented."
+HOMEPAGE="https://github.com/openstack/python-keystoneclient"
+SRC_URI="http://launchpad.net/keystone/essex/essex-rc1/+download/${P/_*/}~rc1.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/argparse
+		dev-python/coverage
+		dev-python/httplib2
+		dev-python/mock
+		dev-python/mox
+        dev-python/nose
+		dev-python/pep8
+		dev-python/prettytable
+		dev-python/simplejson"
+RDEPEND="${DEPEND}"
+
+S=${WORKDIR}/${P/_*/}
+

diff --git a/dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc2.ebuild b/dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc2.ebuild
new file mode 100644
index 0000000..ed13a64
--- /dev/null
+++ b/dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc2.ebuild
@@ -0,0 +1,37 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a client for the OpenStack Keystone API. There's a Python
+API (the keystoneclient module), and a command-line script (keystone). The
+Keystone 2.0 API is still a moving target, so this module will remain in 'Beta'
+status until the API is finalized and fully implemented."
+HOMEPAGE="https://github.com/openstack/python-keystoneclient"
+SRC_URI="http://launchpad.net/keystone/essex/essex-rc2/+download/${P/_*/}~rc2.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/argparse
+		dev-python/coverage
+		dev-python/httplib2
+		dev-python/mock
+		dev-python/mox
+        dev-python/nose
+		dev-python/pep8
+		dev-python/prettytable
+		dev-python/simplejson"
+RDEPEND="${DEPEND}"
+
+S=${WORKDIR}/${P/_*/}
+

diff --git a/dev-python/python-keystoneclient/python-keystoneclient-9999.ebuild b/dev-python/python-keystoneclient/python-keystoneclient-9999.ebuild
new file mode 100644
index 0000000..81259f0
--- /dev/null
+++ b/dev-python/python-keystoneclient/python-keystoneclient-9999.ebuild
@@ -0,0 +1,36 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="This is a client for the OpenStack Keystone API. There's a Python
+API (the keystoneclient module), and a command-line script (keystone). The
+Keystone 2.0 API is still a moving target, so this module will remain in 'Beta'
+status until the API is finalized and fully implemented."
+HOMEPAGE="https://github.com/openstack/python-keystoneclient"
+EGIT_REPO_URI="https://github.com/openstack/python-keystoneclient.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/argparse
+		dev-python/coverage
+		dev-python/httplib2
+		dev-python/mock
+		dev-python/mox
+        dev-python/nose
+		dev-python/pep8
+		dev-python/prettytable
+		dev-python/simplejson
+		!sys-auth/keystone"
+RDEPEND="${DEPEND}"
+

diff --git a/dev-python/python-novaclient/Manifest b/dev-python/python-novaclient/Manifest
new file mode 100644
index 0000000..877a227
--- /dev/null
+++ b/dev-python/python-novaclient/Manifest
@@ -0,0 +1,8 @@
+DIST python-novaclient-2012.1.tar.gz 85322 RMD160 980c009cc77210462eb4590c0fa9927d562023ab SHA1 afbeb4832f6742a650903563021a4652de0d523c SHA256 6b6cb8a806e1df78eda42e7d1030ed5435f417bfbbb122f790ad1b3fe8863143
+DIST python-novaclient-2012.1~rc1.tar.gz 80448 RMD160 34d71e8b6305c6cc83383d55d2eba0ed9fa6da10 SHA1 cfae4e0000f7219874a5a74044b01c1278169480 SHA256 a35122215c3c9c7608dda80929b37c1ebb5b1463eb916e3a32be16489aeb8447
+DIST python-novaclient-2012.1~rc3.tar.gz 85322 RMD160 980c009cc77210462eb4590c0fa9927d562023ab SHA1 afbeb4832f6742a650903563021a4652de0d523c SHA256 6b6cb8a806e1df78eda42e7d1030ed5435f417bfbbb122f790ad1b3fe8863143
+DIST python-novaclient-2012.1~rc4.tar.gz 85322 RMD160 980c009cc77210462eb4590c0fa9927d562023ab SHA1 afbeb4832f6742a650903563021a4652de0d523c SHA256 6b6cb8a806e1df78eda42e7d1030ed5435f417bfbbb122f790ad1b3fe8863143
+EBUILD python-novaclient-2012.1.ebuild 694 RMD160 bbed06d11b4bcd2a2718424f9778bed8d3ccc478 SHA1 79a6db5a604fcffdfda7bb17bfc93dc6906cc139 SHA256 4920ea5b1fbbcf4d511a8c84e5521071bcf26daf3db91ac7db2aaeb92b4401a3
+EBUILD python-novaclient-2012.1_rc1.ebuild 729 RMD160 6748836fad447a91960ee16ac25bb77a2ce80dd9 SHA1 4a598b0da5b424ace50dd610a37906a5a9dd4b37 SHA256 bb8109e7059f9339724833a0c0f75839ee7a2ca149051f9d652938bc797ccabb
+EBUILD python-novaclient-2012.1_rc3.ebuild 729 RMD160 070b5f8c57b82533d7bdcdc934304521f533e72c SHA1 b6d789e7270398ed081e2f8a372e8269fe61ddc3 SHA256 4167ae00720a96a46750bb459fe0f126d445a4e249631ad1c0437e585f49ec43
+EBUILD python-novaclient-2012.1_rc4.ebuild 729 RMD160 7ae125ec8ec5070eae89f02bdd704148f3b47b36 SHA1 496befa02181d5fbe7e996c6ee38aa85132abf16 SHA256 64380123c746baa6ecda43e3d4bd1db7b071a8f63c8fed7c376b559df3b85439

diff --git a/dev-python/python-novaclient/python-novaclient-2012.1.ebuild b/dev-python/python-novaclient/python-novaclient-2012.1.ebuild
new file mode 100644
index 0000000..f27502e
--- /dev/null
+++ b/dev-python/python-novaclient/python-novaclient-2012.1.ebuild
@@ -0,0 +1,28 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a client for the OpenStack Nova API. There's a Python API
+(the novaclient module), and a command-line script (nova). Each implements 100%
+of the OpenStack Nova API."
+HOMEPAGE="https://launchpad.net/nova"
+SRC_URI="http://launchpad.net/nova/essex/${PV}/+download/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+		 dev-python/argparse
+		 dev-python/httplib2
+		 dev-python/prettytable"
+

diff --git a/dev-python/python-novaclient/python-novaclient-2012.1_rc1.ebuild b/dev-python/python-novaclient/python-novaclient-2012.1_rc1.ebuild
new file mode 100644
index 0000000..582c5d3
--- /dev/null
+++ b/dev-python/python-novaclient/python-novaclient-2012.1_rc1.ebuild
@@ -0,0 +1,30 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a client for the OpenStack Nova API. There's a Python API
+(the novaclient module), and a command-line script (nova). Each implements 100%
+of the OpenStack Nova API."
+HOMEPAGE="https://launchpad.net/nova"
+SRC_URI="http://launchpad.net/nova/essex/essex-rc1/+download/${P/_*/}~rc1.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+		 dev-python/argparse
+		 dev-python/httplib2
+		 dev-python/prettytable"
+
+S=${WORKDIR}/${P/_*/}
+

diff --git a/dev-python/python-novaclient/python-novaclient-2012.1_rc3.ebuild b/dev-python/python-novaclient/python-novaclient-2012.1_rc3.ebuild
new file mode 100644
index 0000000..c525aa6
--- /dev/null
+++ b/dev-python/python-novaclient/python-novaclient-2012.1_rc3.ebuild
@@ -0,0 +1,30 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a client for the OpenStack Nova API. There's a Python API
+(the novaclient module), and a command-line script (nova). Each implements 100%
+of the OpenStack Nova API."
+HOMEPAGE="https://launchpad.net/nova"
+SRC_URI="http://launchpad.net/nova/essex/essex-rc3/+download/${P/_*/}~rc3.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+		 dev-python/argparse
+		 dev-python/httplib2
+		 dev-python/prettytable"
+
+S=${WORKDIR}/${P/_*/}
+

diff --git a/dev-python/python-novaclient/python-novaclient-2012.1_rc4.ebuild b/dev-python/python-novaclient/python-novaclient-2012.1_rc4.ebuild
new file mode 100644
index 0000000..f8a1ae1
--- /dev/null
+++ b/dev-python/python-novaclient/python-novaclient-2012.1_rc4.ebuild
@@ -0,0 +1,30 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="This is a client for the OpenStack Nova API. There's a Python API
+(the novaclient module), and a command-line script (nova). Each implements 100%
+of the OpenStack Nova API."
+HOMEPAGE="https://launchpad.net/nova"
+SRC_URI="http://launchpad.net/nova/essex/essex-rc4/+download/${P/_*/}~rc4.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+		 dev-python/argparse
+		 dev-python/httplib2
+		 dev-python/prettytable"
+
+S=${WORKDIR}/${P/_*/}
+

diff --git a/dev-python/python-quantumclient/Manifest b/dev-python/python-quantumclient/Manifest
new file mode 100644
index 0000000..ab9bca1
--- /dev/null
+++ b/dev-python/python-quantumclient/Manifest
@@ -0,0 +1 @@
+EBUILD python-quantumclient-9999.ebuild 652 RMD160 e8f902fce5a484215afa7a609fca435928bcff81 SHA1 b26feee2ea67e97a25f46164f0ee2811ab07b955 SHA256 2d5ccf8242d6ff88bf41f61e572b2a8f32a2a32a434a81e803fa093d66784162

diff --git a/dev-python/python-quantumclient/python-quantumclient-9999.ebuild b/dev-python/python-quantumclient/python-quantumclient-9999.ebuild
new file mode 100644
index 0000000..6b10104
--- /dev/null
+++ b/dev-python/python-quantumclient/python-quantumclient-9999.ebuild
@@ -0,0 +1,30 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+
+inherit git-2 distutils
+
+DESCRIPTION="This is the client API library for Quantum."
+HOMEPAGE="http://wiki.openstack.org/Quantum"
+EGIT_REPO_URI="https://github.com/openstack/python-quantumclient.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/pep8 
+		dev-python/nosexcover 
+		dev-python/nose
+		dev-python/coverage
+		dev-python/paste 
+		dev-python/pastedeploy 
+		dev-python/python-gflags 
+		dev-python/webob 
+		net-misc/quantum"
+RDEPEND="${DEPEND}"

diff --git a/dev-python/python-swift3/Manifest b/dev-python/python-swift3/Manifest
new file mode 100644
index 0000000..d02d87f
--- /dev/null
+++ b/dev-python/python-swift3/Manifest
@@ -0,0 +1 @@
+EBUILD python-swift3-1.5.0.ebuild 579 RMD160 1a1ffabf282299db741754cd819a6720f50adbbe SHA1 986c76557a0862b90bf9316d34d84ea175c19ac2 SHA256 8b6cb2eda30e0480af6caf1b968bfe0847a39811165064485d089f64f8ee496d

diff --git a/dev-python/python-swift3/python-swift3-1.5.0.ebuild b/dev-python/python-swift3/python-swift3-1.5.0.ebuild
new file mode 100644
index 0000000..b60ef8c
--- /dev/null
+++ b/dev-python/python-swift3/python-swift3-1.5.0.ebuild
@@ -0,0 +1,27 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+PYTHON_DEPEND=2
+SUPPORT_PYTHON_ABIS=1
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="Openstack Swift S3 library for Python"
+HOMEPAGE="https://github.com/fujita/swift3"
+#EGIT_REPO_URI="https://github.com/fujita/swift3.git"
+EGIT_REPO_URI="https://github.com/hyves-org/swift3.git"
+# 1.5.0
+EGIT_COMMIT="7f0b466"
+
+LICENSE=""
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+        dev-python/nose"
+RDEPEND="${DEPEND}"
+

diff --git a/net-dns/dnsmasq/Manifest b/net-dns/dnsmasq/Manifest
new file mode 100644
index 0000000..a6d8427
--- /dev/null
+++ b/net-dns/dnsmasq/Manifest
@@ -0,0 +1,5 @@
+AUX dnsmasq-2.47-fbsd-config.patch 505 SHA256 4e05e46b59254e718550cda505986b9b572a0716636fb6a5405a54df25cfa84a SHA512 9d2476c60b87f4515473e5b790ca3c6dd96105ecbda55fa385ce88290acbe8a16b6c48f9a6cbcc535662765aa4f07d182c0f5ebb4ffff1c98bb0cf6a8f4dd528 WHIRLPOOL e314020c11bc902f1dc29464785098ef0d10ebf14d8092fc1b8b673cea3d64e5212f82b85597ffe2d2bc150fbf51f27f560744a7ea12f2359c698e5ca80898cb
+AUX dnsmasq-init-r2 655 SHA256 6c8cf3c414a3eb3f57cc96a19ae24f228cd3a82c3fc7ae3504dd888848d777e8 SHA512 89f114a11a92ed31a5a59fe83844ef48b5f62c73444d9c657c84eccc7455d77899c6105f1daf1e97e97af03c2ab6c9909278606f928ff2fcb185c00bd8cedb25 WHIRLPOOL 3ac0e1fca4bcbe41d4460d47111cf8ca2f79849d24f93de18549cc82aa3303b05ff37ea31451dd72c7650a3ac5e36226f01f29dd6a2d1240e46da267d55ffd80
+AUX dnsmasq.confd-r1 170 SHA256 51c0672a70d5d6793d295d82db666d372fb081e8627318f67c88e48d08d254b5 SHA512 9a401bfc408bf1638645c61b8ca734bea0a09ef79fb36648ec7ef21666257234254bbe6c73c82cc23aa1779ddcdda0e6baa2c041866f16dfb9c4e0ba9133eab8 WHIRLPOOL 86f364adcb5576bfb2cc84d13dd087bef987cae70eee1ae7816f0febc58ec637a97fea357c506456781eab116e257d06b1e45f7e2bbd81849251c15067a347ab
+DIST dnsmasq-2.63.tar.xz 378148 SHA256 f5eb1c2dfd47a2c75b0d40a60f85dce2e84c6af6d1cd5318fbe8cd69845ed2d8 SHA512 be057e19062b2eed46fd4677f1419048d4546e0de93a9b0b889417c240a5f7930329d659de41105670c23ca612ce53285875ed64ac56a0cf94ff01d522194cb1 WHIRLPOOL 7e1279efa347c8d69d56c240477f6acc1664b90f05de6a7053f8264d74200afad16389e33ea710e371c0c19c0d7ea9bfdec8d0089ca0fba341bf5e265d4ea783
+EBUILD dnsmasq-2.63.ebuild 2861 SHA256 8e8dbe6009cca25f19479b40ed6a0a5660893eb708538de845eb5a6a2a650fd1 SHA512 ea884df04668d7b39d1fa8465e63beedeb9551b8582ab2867af7b549ad5c495e0b1e742997058afe2b22cb9fd372eb69f810e9e91e19f43fceb4933b361f7fb4 WHIRLPOOL 65b328c0f5cca638d3e6bf79e04572c3629704f8818cd9ad9e71f25402b9cf9378a28a3729be6fa41d7a901f5552d2f452f6ad456f8c31a17d27751e98c2e08d

diff --git a/net-dns/dnsmasq/dnsmasq-2.63.ebuild b/net-dns/dnsmasq/dnsmasq-2.63.ebuild
new file mode 100644
index 0000000..7152fce
--- /dev/null
+++ b/net-dns/dnsmasq/dnsmasq-2.63.ebuild
@@ -0,0 +1,129 @@
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: /var/cvsroot/gentoo-x86/net-dns/dnsmasq/dnsmasq-2.63.ebuild,v 1.7 2012/10/07 14:20:05 armin76 Exp $
+
+EAPI=4
+
+inherit eutils toolchain-funcs flag-o-matic user systemd
+
+DESCRIPTION="Small forwarding DNS server"
+HOMEPAGE="http://www.thekelleys.org.uk/dnsmasq/"
+SRC_URI="http://www.thekelleys.org.uk/dnsmasq/${P}.tar.xz"
+
+LICENSE="|| ( GPL-2 GPL-3 )"
+SLOT="0"
+KEYWORDS="alpha amd64 arm hppa ia64 ~mips ppc ppc64 s390 sh sparc x86 ~sparc-fbsd ~x86-fbsd"
+IUSE="conntrack dbus +dhcp idn ipv6 lua nls script tftp"
+DM_LINGUAS="de es fi fr id it no pl pt_BR ro"
+for dm_lingua in ${DM_LINGUAS}; do
+	IUSE+=" linguas_${dm_lingua}"
+done
+
+RDEPEND="dbus? ( sys-apps/dbus )
+	idn? ( net-dns/libidn )
+	lua? ( dev-lang/lua )
+	conntrack? ( net-libs/libnetfilter_conntrack )
+	nls? (
+		sys-devel/gettext
+		net-dns/libidn
+	)"
+
+DEPEND="${RDEPEND}
+	virtual/pkgconfig
+	app-arch/xz-utils"
+
+REQUIRED_USE="lua? ( script )"
+
+use_have() {
+	local NO_ONLY=""
+	if [ $1 == '-n' ]; then
+		NO_ONLY=1
+		shift
+	fi
+
+	local UWORD=${2:-$1}
+	UWORD=${UWORD^^*}
+
+	if ! use ${1}; then
+		echo " -DNO_${UWORD}"
+	elif [ -z "${NO_ONLY}" ]; then
+		echo " -DHAVE_${UWORD}"
+	fi
+}
+
+pkg_setup() {
+	enewgroup dnsmasq
+	enewuser dnsmasq -1 -1 /dev/null dnsmasq
+}
+
+src_prepare() {
+	# dnsmasq on FreeBSD wants the config file in a silly location, this fixes
+	epatch "${FILESDIR}/${PN}-2.47-fbsd-config.patch"
+	sed -i -r 's:lua5.[0-9]+:lua:' Makefile
+}
+
+src_configure() {
+	COPTS="$(use_have conntrack)"
+	COPTS+="$(use_have dbus)"
+	COPTS+="$(use_have -n dhcp)"
+	COPTS+="$(use_have idn)"
+	COPTS+="$(use_have -n ipv6)"
+	COPTS+="$(use_have lua luascript)"
+	COPTS+="$(use_have -n script)"
+	COPTS+="$(use_have -n tftp)"
+	COPTS+="$(use ipv6 && use dhcp || echo " -DNO_DHCP6")"
+}
+
+src_compile() {
+	emake \
+		PREFIX=/usr \
+		CC="$(tc-getCC)" \
+		CFLAGS="${CFLAGS}" \
+		LDFLAGS="${LDFLAGS}" \
+		COPTS="${COPTS}" \
+		all$(use nls && echo "-i18n")
+
+	cd ${S}/contrib/wrt
+	emake \
+		PREFIX=/usr \
+		CC="$(tc-getCC)" \
+		CFLAGS="${CFLAGS}" \
+		COPTS="${COPTS}" \
+		all$(use nls)
+}
+
+src_install() {
+	emake \
+		PREFIX=/usr \
+		MANDIR=/usr/share/man \
+		DESTDIR="${D}" \
+		install$(use nls && echo "-i18n")
+
+	exeinto /usr/sbin
+	doexe ${S}/contrib/wrt/dhcp_release
+
+	local lingua
+	for lingua in ${DM_LINGUAS}; do
+		use linguas_${lingua} || rm -rf "${D}"/usr/share/locale/${lingua}
+	done
+	rmdir --ignore-fail-on-non-empty "${D}"/usr/share/locale/
+
+	dodoc CHANGELOG CHANGELOG.archive FAQ
+	dodoc -r logo
+
+	dodoc CHANGELOG FAQ
+	dohtml *.html
+
+	newinitd "${FILESDIR}"/dnsmasq-init-r2 dnsmasq
+	newconfd "${FILESDIR}"/dnsmasq.confd-r1 dnsmasq
+
+	insinto /etc
+	newins dnsmasq.conf.example dnsmasq.conf
+
+	if use dbus ; then
+		insinto /etc/dbus-1/system.d
+		doins dbus/dnsmasq.conf
+	fi
+
+	systemd_dounit "${FILESDIR}"/dnsmasq.service
+}

diff --git a/net-dns/dnsmasq/files/dnsmasq-2.47-fbsd-config.patch b/net-dns/dnsmasq/files/dnsmasq-2.47-fbsd-config.patch
new file mode 100644
index 0000000..38a3679
--- /dev/null
+++ b/net-dns/dnsmasq/files/dnsmasq-2.47-fbsd-config.patch
@@ -0,0 +1,16 @@
+diff -ur dnsmasq-2.47.orig/src/config.h dnsmasq-2.47/src/config.h
+--- dnsmasq-2.47.orig/src/config.h	2009-02-05 07:14:24.000000000 -0500
++++ dnsmasq-2.47/src/config.h	2009-03-30 00:04:52.000000000 -0400
+@@ -50,11 +50,7 @@
+ #endif
+ 
+ #ifndef CONFFILE
+-#   if defined(__FreeBSD__)
+-#      define CONFFILE "/usr/local/etc/dnsmasq.conf"
+-#   else
+-#      define CONFFILE "/etc/dnsmasq.conf"
+-#   endif
++#   define CONFFILE "/etc/dnsmasq.conf"
+ #endif
+ 
+ #define DEFLEASE 3600 /* default lease time, 1 hour */

diff --git a/net-dns/dnsmasq/files/dnsmasq-init-r2 b/net-dns/dnsmasq/files/dnsmasq-init-r2
new file mode 100644
index 0000000..08e747d
--- /dev/null
+++ b/net-dns/dnsmasq/files/dnsmasq-init-r2
@@ -0,0 +1,25 @@
+#!/sbin/runscript
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License, v2 or later
+# $Header: /var/cvsroot/gentoo-x86/net-dns/dnsmasq/files/dnsmasq-init-r2,v 1.1 2012/03/07 21:59:19 chutzpah Exp $
+
+extra_started_commands="reload"
+
+pidfile="/var/run/dnsmasq.pid"
+command="/usr/sbin/dnsmasq"
+command_args="-x ${pidfile} ${DNSMASQ_OPTS}"
+start_stop_daemon_args="--retry TERM/3/TERM/5"
+
+depend() {
+	provide dns
+	need localmount net
+	after bootmisc
+	use logger
+}
+
+reload() {
+	ebegin "Reloading ${SVCNAME}"
+	start-stop-daemon --stop --oknodo --signal HUP \
+		--exec ${command} --pidfile ${pidfile}
+	eend $?
+}

diff --git a/net-dns/dnsmasq/files/dnsmasq.confd-r1 b/net-dns/dnsmasq/files/dnsmasq.confd-r1
new file mode 100644
index 0000000..0e94463
--- /dev/null
+++ b/net-dns/dnsmasq/files/dnsmasq.confd-r1
@@ -0,0 +1,4 @@
+# /etc/conf.d/dnsmasq: config file for /etc/init.d/dnsmasq
+
+# See the dnsmasq(8) man page for possible options to put here.
+DNSMASQ_OPTS="--user=dnsmasq --group=dnsmasq"

diff --git a/net-misc/quantum/Manifest b/net-misc/quantum/Manifest
new file mode 100644
index 0000000..3ea61ef
--- /dev/null
+++ b/net-misc/quantum/Manifest
@@ -0,0 +1,4 @@
+AUX quantum-server.confd 52 RMD160 346646e4e57f49c5f122702bd9c6a00355716c61 SHA1 e74578ef4be722bf7a3df9d566a99a592b6d47c3 SHA256 1a7ca03a655e34f82bccd9fc695f614b60a2bbdc3d2606e4535fcb8891456d39
+AUX quantum-server.initd 917 RMD160 e4ac130a281893414ccb7730bc42dbd95614e807 SHA1 5dd1a7b0950046127f105ca4baa3fdc31fb46a32 SHA256 d6bddd3ab93cc98b9fbb550f4e8828e4f7c46b19d4d0cd7201eb6dcc2d67ac44
+AUX server-setup-disable-initd-install.patch 762 RMD160 d5199ad5a8b61a5edd2d0b56bf85699de7d01001 SHA1 c798697bfbcebc5e086b6b18ec8fbb9dd301869c SHA256 4be67baa17793ff647cdfdde8de9fbffd0be031539cc7349858cf7a0a1d60450
+EBUILD quantum-9999.ebuild 1164 RMD160 4a4a933e363a6e85e80a3b0de84dc6ca0a07ce7d SHA1 e145a11db25cc3f532bcca4283edf307223b99d4 SHA256 56f788bc05989afd745de897ba5c6f560be2654d155e403d8260ebc527282b20

diff --git a/net-misc/quantum/files/quantum-server.confd b/net-misc/quantum/files/quantum-server.confd
new file mode 100644
index 0000000..eb78930
--- /dev/null
+++ b/net-misc/quantum/files/quantum-server.confd
@@ -0,0 +1,2 @@
+PID_PATH=/var/run/quantum
+LOG_PATH=/var/log/quantum

diff --git a/net-misc/quantum/files/quantum-server.initd b/net-misc/quantum/files/quantum-server.initd
new file mode 100644
index 0000000..f4319d5
--- /dev/null
+++ b/net-misc/quantum/files/quantum-server.initd
@@ -0,0 +1,43 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+depend() {
+	need net
+}
+
+checkconfig() {
+	if [ ! -r /etc/conf.d/quantum-server ]; then
+		eerror "No Quantum Config found: /etc/conf.d/quantum-server)"
+		return 1
+	fi
+	# FIXME: might be nice to add some checks for proper /etc/quantum config files
+	return 0
+}
+
+
+start() {
+	checkconfig || return $?
+	ebegin "Starting ${SVCNAME}"
+	
+	start-stop-daemon --start --background --make-pidfile \
+			  --pidfile "${PID_PATH}/${SVCNAME}.pid" \
+			  --exec /usr/bin/${SVCNAME} -- \
+			  --log-file=${LOG_PATH}/${SVCNAME}.log
+	
+	eend $? "Failed to start ${SVCNAME}"
+}
+
+stop() {
+	checkconfig || return $?
+	ebegin "Stopping ${SVCNAME}"
+	
+	start-stop-daemon --stop --pidfile "${PID_PATH}/${SVCNAME}.pid" \
+			  --exec /usr/bin/${SVCNAME} 
+	eend $? "Failed to stop ${SVCNAME}"
+}
+
+#restart() {
+#
+#}

diff --git a/net-misc/quantum/files/server-setup-disable-initd-install.patch b/net-misc/quantum/files/server-setup-disable-initd-install.patch
new file mode 100644
index 0000000..83a05b8
--- /dev/null
+++ b/net-misc/quantum/files/server-setup-disable-initd-install.patch
@@ -0,0 +1,21 @@
+--- setup.py.orig	2012-02-02 12:26:50.000000000 +0100
++++ setup.py	2012-02-02 13:05:46.000000000 +0100
+@@ -66,15 +66,13 @@
+ ProjectScripts = [
+ ]
+ 
+-config_path = 'etc/quantum/'
+-init_path = 'etc/init.d'
+-ovs_plugin_config_path = 'etc/quantum/plugins/openvswitch'
+-cisco_plugin_config_path = 'etc/quantum/plugins/cisco'
++config_path = '/etc/quantum/'
++ovs_plugin_config_path = '/etc/quantum/plugins/openvswitch'
++cisco_plugin_config_path = '/etc/quantum/plugins/cisco'
+ 
+ DataFiles = [
+     (config_path,
+         ['etc/quantum.conf', 'etc/quantum.conf.test', 'etc/plugins.ini']),
+-    (init_path, ['etc/init.d/quantum-server']),
+     (ovs_plugin_config_path,
+         ['etc/quantum/plugins/openvswitch/ovs_quantum_plugin.ini']),
+     (cisco_plugin_config_path,

diff --git a/net-misc/quantum/quantum-9999.ebuild b/net-misc/quantum/quantum-9999.ebuild
new file mode 100644
index 0000000..00949fa
--- /dev/null
+++ b/net-misc/quantum/quantum-9999.ebuild
@@ -0,0 +1,51 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+
+inherit git-2 distutils eutils
+
+DESCRIPTION="Quantum is an incubated OpenStack project to provide 'network
+connectivity as a service' between interface devices (e.g., vNICs) managed by
+other Openstack services (e.g., nova). "
+HOMEPAGE="http://wiki.openstack.org/Quantum"
+EGIT_REPO_URI="https://github.com/openstack/quantum.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/pep8
+		dev-python/nosexcover
+		dev-python/eventlet
+		dev-python/routes
+		dev-python/paste
+		dev-python/pastedeploy
+		dev-python/python-gflags
+		dev-python/simplejson
+		dev-python/sqlalchemy
+		dev-python/webob
+		dev-python/webtest
+		dev-python/pip"
+RDEPEND="${DEPEND}"
+
+src_prepare() {
+	epatch "${FILESDIR}/server-setup-disable-initd-install.patch"
+}
+
+src_install() {
+	distutils_src_install
+
+	newconfd "${FILESDIR}/quantum-server.confd" quantum-server
+	newinitd "${FILESDIR}/quantum-server.initd" quantum-server
+
+	diropts -m 0750
+	dodir /var/run/quantum /var/log/quantum
+
+	dodoc README
+}

diff --git a/sys-auth/keystone/Manifest b/sys-auth/keystone/Manifest
new file mode 100644
index 0000000..96ef3b2
--- /dev/null
+++ b/sys-auth/keystone/Manifest
@@ -0,0 +1,13 @@
+AUX keystone.confd 67 RMD160 c4555c0fe6772a087b2d72f6c31099dff50e3d1f SHA1 1dac9f842554f9a1a794acbd750b906a78e88d25 SHA256 8faa32d3354df30b1d1c98cf481be162c27583b84e387f8da57611b689bc2448
+AUX keystone.initd 1069 RMD160 1c1c70442c424f859fc3bc8da099b3b1750fd9c8 SHA1 50a7c4f031d6e8b2d48b5523ebe4ffb0c3523458 SHA256 70cbe2d37f139f4e7d99ac128b89d399e291cabd38b9db6e25e9d462f61b3602
+DIST keystone-2011.3.tar.gz 1582804 RMD160 f0abe18c59784232985dcfe82396997fd0a35a7c SHA1 7c8df4086ba075c7cadab84d1b20158977ed5062 SHA256 771c27440e6c55d72834db187ee114af54cf91fc49cd05ac7497653115e943f5
+DIST keystone-2012.1.2.tar.gz 447876 RMD160 02696e814a58c94feac1c14108121578d2047140 SHA1 093d05618943da9adf073b87797ad96b1a9ddb59 SHA256 0634eac122f38af11f73e7e8ef67d4dbb27e4179a23e78682f6b5212f6619c90
+DIST keystone-2012.1.tar.gz 186851 RMD160 89a1448c68015e32e7fa809c825e5fae76637531 SHA1 7fcca1e145372a2d454aaff8669447d28fac99ad SHA256 c480a28be3d3f0425a25a6aec141b5b505b8cf5a25b8883a20b89b0561c5dbe0
+DIST keystone-2012.1~rc1.tar.gz 184724 RMD160 e921de53d13849c84bf5022b985986b991371e94 SHA1 f7ff7fc4e0b623b596297f89b5140aed28a7f14f SHA256 f854a70a78c3977f87e64a53fc8787af17e215b12129e07a1d1a3ab56ad2c546
+DIST keystone-2012.1~rc2.tar.gz 186851 RMD160 89a1448c68015e32e7fa809c825e5fae76637531 SHA1 7fcca1e145372a2d454aaff8669447d28fac99ad SHA256 c480a28be3d3f0425a25a6aec141b5b505b8cf5a25b8883a20b89b0561c5dbe0
+EBUILD keystone-2011.3.ebuild 841 RMD160 f302428fc4e72c495e22b1ad771dab2c3cf905fb SHA1 b993869c60515e30f253d9a34eeb9fa97f1a752e SHA256 10b3d849baa5f0666e0ce7590f8ced78c5c3f846a25f266b21a16b9b1ea1be08
+EBUILD keystone-2012.1.2.ebuild 971 RMD160 f4fb9135edae8a4aa7d0bd037355c9200c191334 SHA1 4c991ce5bf035eedbe9a5552fe5e96046be4c5ba SHA256 1eaa61ec485d75546468656142978ac44b392756baec363f4df621d239cb3255
+EBUILD keystone-2012.1.ebuild 971 RMD160 f4fb9135edae8a4aa7d0bd037355c9200c191334 SHA1 4c991ce5bf035eedbe9a5552fe5e96046be4c5ba SHA256 1eaa61ec485d75546468656142978ac44b392756baec363f4df621d239cb3255
+EBUILD keystone-2012.1_rc1.ebuild 1006 RMD160 b02a82fd2403b063b5954600cb21653b53b3590a SHA1 3ae390184688d3204f57cee279c4c6ccc0660a0b SHA256 7a942dd272903ecc0c2b8701df3138e692df34a8feaa3cdc47d0424d2a124538
+EBUILD keystone-2012.1_rc2.ebuild 1006 RMD160 03155be1c36b1476e2df74bbcc3c054c60db1aec SHA1 c0e13d439c80cc70e1e0ab398a12663624ea92c7 SHA256 0560a5076eb9cc2e67d991fb3200854d383fe1f195aa44925ba5aa88bed1406a
+EBUILD keystone-9999.ebuild 794 RMD160 3c88e71b4fa32e3ae88e989b751d16162ff788eb SHA1 50d2ee919a98853998942f0baa0b8209c2a34e47 SHA256 fdf7b485f6aeb7903b3a454f69ba5deb06227354ac3514cbaa60d57c8a9fc7bd

diff --git a/sys-auth/keystone/files/keystone.confd b/sys-auth/keystone/files/keystone.confd
new file mode 100644
index 0000000..7bc6565
--- /dev/null
+++ b/sys-auth/keystone/files/keystone.confd
@@ -0,0 +1,2 @@
+CONFIG_FILE=/etc/keystone/keystone.conf
+PID_PATH=/var/run/keystone

diff --git a/sys-auth/keystone/files/keystone.initd b/sys-auth/keystone/files/keystone.initd
new file mode 100644
index 0000000..dde18b0
--- /dev/null
+++ b/sys-auth/keystone/files/keystone.initd
@@ -0,0 +1,53 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+depend() {
+	need net
+}
+
+BASENAME=$(echo $SVCNAME | cut -d '-' -f 1)
+
+checkconfig() {
+	if [ ! -r /etc/conf.d/$BASENAME ]; then
+		eerror "No keystone service confd file found: /etc/conf.d/$BASENAME)"
+		return 1
+	fi
+	. /etc/conf.d/$BASENAME
+
+	if [ ! -r ${CONFIG_FILE} ]; then
+		eerror "No keystone config file found: ${CONFIG_FILE})"
+		return 1
+	fi
+
+	return 0
+}
+
+
+start() {
+	checkconfig || return $?
+	. /etc/conf.d/$BASENAME
+	
+	ebegin "Starting ${SVCNAME}"
+	
+	start-stop-daemon --start --quiet --make-pidfile --pidfile "${PID_PATH}/${SVCNAME}.pid" \
+					  --exec /usr/bin/${SVCNAME}-all --background -- --config-file=${CONFIG_FILE}
+	
+	eend $? "Failed to start ${SVCNAME}"
+}
+
+stop() {
+	checkconfig || return $?
+	. /etc/conf.d/$BASENAME
+	
+	ebegin "Stopping ${SVCNAME}"
+	
+	start-stop-daemon --stop --pidfile "${PID_PATH}/${SVCNAME}.pid" \
+					  --exec /usr/bin/${SVCNAME}-all
+	eend $? "Failed to stop ${SVCNAME}"
+}
+
+#restart() {
+#
+#}

diff --git a/sys-auth/keystone/keystone-2012.1.2.ebuild b/sys-auth/keystone/keystone-2012.1.2.ebuild
new file mode 100644
index 0000000..582510c
--- /dev/null
+++ b/sys-auth/keystone/keystone-2012.1.2.ebuild
@@ -0,0 +1,40 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTIOn="Keystone is a cloud identity service written in Python, which
+provides authentication, authorization, and an OpenStack service catalog. It
+implements OpenStac's Identity API."
+HOMEPAGE="https://launchpad.net/keystone"
+SRC_URI="http://launchpad.net/${PN}/essex/${PV}/+download/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/pep8
+		dev-python/lxml
+		dev-python/python-daemon"
+RDEPEND="${DEPEND}
+		 dev-python/python-novaclient
+		 dev-python/python-ldap
+		 dev-python/passlib"
+
+src_install() {
+	distutils_src_install
+	newconfd "${FILESDIR}/keystone.confd" keystone
+	newinitd "${FILESDIR}/keystone.initd" keystone
+
+	diropts -m 0750
+	dodir /var/run/keystone /var/log/keystone
+}

diff --git a/sys-auth/keystone/keystone-9999.ebuild b/sys-auth/keystone/keystone-9999.ebuild
new file mode 100644
index 0000000..a09d3d9
--- /dev/null
+++ b/sys-auth/keystone/keystone-9999.ebuild
@@ -0,0 +1,32 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTIOn="Keystone is a cloud identity service written in Python, which
+provides authentication, authorization, and an OpenStack service catalog. It
+implements OpenStac's Identity API."
+HOMEPAGE="https://launchpad.net/keystone"
+EGIT_REPO_URI="https://github.com/openstack/keystone.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="dev-python/setuptools
+		dev-python/pep8
+		dev-python/lxml
+		dev-python/python-daemon
+		!dev-python/keystoneclient"
+RDEPEND="${DEPEND}
+		 dev-python/python-novaclient
+		 dev-python/python-ldap
+		 dev-python/passlib"

diff --git a/sys-auth/swift-keystone2/Manifest b/sys-auth/swift-keystone2/Manifest
new file mode 100644
index 0000000..7e3053c
--- /dev/null
+++ b/sys-auth/swift-keystone2/Manifest
@@ -0,0 +1 @@
+EBUILD swift-keystone2-9999.ebuild 616 RMD160 cce917936402a8700e29a39a18f29c555c07bfd5 SHA1 66fbffdac52cb2996dda774b8184f7646bae94c5 SHA256 4cbaf92edca02ba91aeb6ad24da9a89ae1c8c7326a0c785b9bd4c9dc42bf0280

diff --git a/sys-auth/swift-keystone2/swift-keystone2-9999.ebuild b/sys-auth/swift-keystone2/swift-keystone2-9999.ebuild
new file mode 100644
index 0000000..97c7908
--- /dev/null
+++ b/sys-auth/swift-keystone2/swift-keystone2-9999.ebuild
@@ -0,0 +1,26 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="Keystone to Swift authentication and authorization system."
+HOMEPAGE="https://launchpad.net/swift"
+EGIT_REPO_URI="https://github.com/cloudbuilders/swift-keystone2.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="sys-cluster/swift"
+RDEPEND="${DEPEND}"
+
+# Can only use this when python.eclass is using EAPI4
+#REQUIRED_USE="|| ( storage-server proxy-server )"

diff --git a/sys-cluster/nova/Manifest b/sys-cluster/nova/Manifest
new file mode 100644
index 0000000..dbaaf4c
--- /dev/null
+++ b/sys-cluster/nova/Manifest
@@ -0,0 +1,16 @@
+AUX nova.confd 108 RMD160 e6ca2fa9454983ae2760a8474271d5829f140957 SHA1 157215430039e3c2da2f04c1fb8818c1ec690cb7 SHA256 b23978f2d41ac014e7ec7315608e3b3bdc2f4ea834c42a526784eb2fa7f97014
+AUX nova.initd 1152 RMD160 5764d66dfc94ee435276d63346ab0165e2a70a91 SHA1 066ae8198d52c7283cd2259d78401fdd464b5158 SHA256 0a6c7cd12b412a52048c99bbb89e23c10d27358b1269c4ac121078107f8e253c
+DIST nova-2011.3.tar.gz 3865204 RMD160 cbc336aa8da0a9ec1c635922139e400ef17d6488 SHA1 e6851c0adf97c3772e576c534c6c3ab7177a121f SHA256 3eeb9a1ee9bdcd52ca0c937bd4f83dd8b52e8f71b82753ba3f2f98f7859ef321
+DIST nova-2012.1.2.tar.gz 5754615 RMD160 839bc0b7f2158e67d91180cedc3289c316de03c8 SHA1 509ba09c4ecdce460da9e055de4d121f44a070df SHA256 b8383e4bc40facf0c50fe181702bcfb9cff053ad79979ca07134882e5b85eb5b
+DIST nova-2012.1.tar.gz 4359338 RMD160 ee86d911a1027d7d4df48461fd610ff5067d3931 SHA1 ff3c35561be362382218edfe4411b2b8279fb24e SHA256 2784292f8e7255a5246835382f745651a944407f15c2b77911072207dbadd24e
+DIST nova-2012.1~rc1.tar.gz 4247946 RMD160 a3e0b1b49bf5da6ca13aa4c6b01174ef8b210ca8 SHA1 9bc6f8efe7513ae7b645200d351a07119afffbd6 SHA256 10f1cc26909343fa425d89221c3b13aa45157921f6611d2fb52db9a7ce33af6b
+DIST nova-2012.1~rc3.tar.gz 4300506 RMD160 480ff0ff37b22f82c363aed8b7e7a168279b72e3 SHA1 fc2c61b4a1df2b7f3cec88cee7f7677276d69a1c SHA256 7f64933de717872854563926bfcda85be199cb7c3f015fbeb1edfce40bde1ad8
+DIST nova-2012.1~rc4.tar.gz 4359338 RMD160 ee86d911a1027d7d4df48461fd610ff5067d3931 SHA1 ff3c35561be362382218edfe4411b2b8279fb24e SHA256 2784292f8e7255a5246835382f745651a944407f15c2b77911072207dbadd24e
+EBUILD nova-2011.3.ebuild 1080 RMD160 1fb972e75b954e458df3f46d686f966e23f38b2d SHA1 f1898a8aa385cc897d6eacb957a20f473a45b561 SHA256 d4c3664035b1640f8c6a645bd925297de2c89c658bcb32370288dfc099595329
+EBUILD nova-2012.1.2.ebuild 1708 RMD160 d2981d9659cc5245e02bfa9a4099e76b6ef3fc8d SHA1 fdcc99a358e6741f0078626612b046aa483e64a3 SHA256 33716b05608f2d4375fe73b17d5bf17f23210e222d0022a5cd25b65cae06ee88
+EBUILD nova-2012.1.ebuild 1708 RMD160 d2981d9659cc5245e02bfa9a4099e76b6ef3fc8d SHA1 fdcc99a358e6741f0078626612b046aa483e64a3 SHA256 33716b05608f2d4375fe73b17d5bf17f23210e222d0022a5cd25b65cae06ee88
+EBUILD nova-2012.1_rc1-r1.ebuild 1746 RMD160 fb200cf353591461978614bc8a047824b25a4ac5 SHA1 9297fd864bb252bf424fb45d577372ee8a4fe19a SHA256 31ec14e86c02e024bd4967e6d6b1f1316da4322219a24060564131eb80df8f67
+EBUILD nova-2012.1_rc1.ebuild 1741 RMD160 f26a291775a69a13eee31edc4a1ba93b71c899c6 SHA1 5f20ca04b5fd3986e5b0189d13887a86b262d782 SHA256 4d569d1509da8a4cec96ca9f51681e7f36e1ee996199faa269a5fe1760d3e311
+EBUILD nova-2012.1_rc3.ebuild 1746 RMD160 e86d10e3e2130b70460584af5686eb53b71f89e4 SHA1 a2a6aa4e0bee014c487974f2b9b7f357f1908c3c SHA256 a4ae621c430894b784c80d84ee4f064cdf1d00bdc79738f2295543aadb2d57b3
+EBUILD nova-2012.1_rc4.ebuild 1746 RMD160 ad3c29503dfa7d9ff5e9a4c6767c53ce8bc2b318 SHA1 a766fe879affe3e47159dde1d7392ac6bca4711e SHA256 63ca458ae408bac95119258255eef6d90db92264bf75c2a4f098b1066c287d7e
+EBUILD nova-9999.ebuild 1508 RMD160 a62b346967bfd093eff6d5798fa7f763f41443f2 SHA1 0dca417970547da571253d6e5a968d9abe0fe388 SHA256 70bd4ba85b57f74126754a9d1521760c0398dafff00905a054fda90f2c8552d2

diff --git a/sys-cluster/nova/files/nova.confd b/sys-cluster/nova/files/nova.confd
new file mode 100644
index 0000000..ed3bc5c
--- /dev/null
+++ b/sys-cluster/nova/files/nova.confd
@@ -0,0 +1,4 @@
+FLAG_FILE=/etc/nova/nova.conf
+PID_PATH=/var/run/nova
+LOG_PATH=/var/log/nova
+NOVA_TMP_PATH=/var/lib/nova/tmp

diff --git a/sys-cluster/nova/files/nova.initd b/sys-cluster/nova/files/nova.initd
new file mode 100644
index 0000000..b115c48
--- /dev/null
+++ b/sys-cluster/nova/files/nova.initd
@@ -0,0 +1,54 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+depend() {
+	need net
+}
+
+BASENAME=$(echo $SVCNAME | cut -d '-' -f 1)
+
+checkconfig() {
+	if [ ! -r /etc/conf.d/$BASENAME ]; then
+		eerror "No nova flagfile found: /etc/conf.d/$BASENAME)"
+		return 1
+	fi
+	if [ ${SVCNAME} == "nova-api" ]; then
+		if [ ! -r /etc/nova/api-paste.ini ]; then
+			eerror "No api-paste file found: /etc/nova/api-paste.ini)"
+			return 1
+		fi
+	fi
+	return 0
+}
+
+
+start() {
+	checkconfig || return $?
+	. /etc/conf.d/$BASENAME
+	
+	ebegin "Starting ${SVCNAME}"
+
+	export TMPDIR=${NOVA_TMP_PATH}
+	start-stop-daemon --start --quiet --make-pidfile --pidfile "${PID_PATH}/${SVCNAME}.pid" \
+					  --exec /usr/bin/${SVCNAME} --background -- --flagfile=${FLAG_FILE} \
+					  --logfile=${LOG_PATH}/${SVCNAME}.log
+	
+	eend $? "Failed to start ${SVCNAME}"
+}
+
+stop() {
+	checkconfig || return $?
+	. /etc/conf.d/$BASENAME
+	
+	ebegin "Stopping ${SVCNAME}"
+	
+	start-stop-daemon --stop --pidfile "${PID_PATH}/${SVCNAME}.pid" \
+					  --exec /usr/bin/${SVCNAME} 
+	eend $? "Failed to stop ${SVCNAME}"
+}
+
+#restart() {
+#
+#}

diff --git a/sys-cluster/nova/nova-2012.1.2.ebuild b/sys-cluster/nova/nova-2012.1.2.ebuild
new file mode 100644
index 0000000..ef846cb
--- /dev/null
+++ b/sys-cluster/nova/nova-2012.1.2.ebuild
@@ -0,0 +1,64 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils
+
+DESCRIPTION="Nova is a cloud computing fabric controller (the main part of an
+IaaS system). It is written in Python."
+HOMEPAGE="https://launchpad.net/nova"
+SRC_URI="http://launchpad.net/${PN}/essex/${PV}/+download/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="controller"
+
+DEPEND="dev-python/setuptools
+        dev-python/lockfile
+        dev-python/netaddr
+        dev-python/eventlet
+        dev-python/python-gflags
+        dev-python/nosexcover
+        dev-python/sqlalchemy-migrate
+        dev-python/pylint
+        dev-python/mox
+        dev-python/pep8
+        dev-python/cheetah
+        dev-python/carrot
+        dev-python/lxml
+        dev-python/python-daemon
+        dev-python/wsgiref
+        dev-python/sphinx
+        dev-python/suds
+        dev-python/paramiko
+        dev-python/feedparser"
+RDEPEND="${DEPEND}
+         dev-python/m2crypto
+         app-admin/glance
+         dev-python/python-novaclient
+         dev-python/nova-adminclient
+         dev-python/boto
+         dev-python/prettytable
+         dev-python/mysql-python
+		 dev-python/iso8601
+         controller? ( net-misc/rabbitmq-server )"
+
+src_install() {
+	distutils_src_install
+	newconfd "${FILESDIR}/nova.confd" nova
+	newinitd "${FILESDIR}/nova.initd" nova
+
+	for function in api cert compute consoleauth network objectstore scheduler volume xvpvncproxy; do
+		dosym /etc/init.d/nova /etc/init.d/nova-${function}
+	done
+
+	diropts -m 0750
+	dodir /var/run/nova /var/log/nova /var/lock/nova
+}

diff --git a/sys-cluster/nova/nova-9999.ebuild b/sys-cluster/nova/nova-9999.ebuild
new file mode 100644
index 0000000..ca8a101
--- /dev/null
+++ b/sys-cluster/nova/nova-9999.ebuild
@@ -0,0 +1,63 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="Nova is a cloud computing fabric controller (the main part of an
+IaaS system). It is written in Python."
+HOMEPAGE="https://launchpad.net/nova"
+EGIT_REPO_URI="https://github.com/openstack/nova.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="controller"
+
+DEPEND="dev-python/setuptools
+        dev-python/lockfile
+		dev-python/netaddr
+		dev-python/eventlet
+		dev-python/python-gflags
+		dev-python/nosexcover
+		dev-python/sqlalchemy-migrate
+		dev-python/pylint
+		dev-python/mox
+		dev-python/pep8
+		dev-python/cheetah
+		dev-python/carrot
+		dev-python/lxml
+		dev-python/python-daemon
+		dev-python/wsgiref
+		dev-python/sphinx
+		dev-python/suds
+		dev-python/paramiko
+		dev-python/feedparser"
+RDEPEND="${DEPEND}
+		 dev-python/m2crypto
+		 app-admin/glance
+		 dev-python/python-novaclient
+		 dev-python/nova-adminclient
+		 dev-python/boto
+		 dev-python/prettytable
+		 dev-python/mysql-python
+		 controller? ( net-misc/rabbitmq-server )"
+
+src_install() {
+	distutils_src_install
+	newconfd "${FILESDIR}/nova.confd" nova
+	newinitd "${FILESDIR}/nova.initd" nova
+
+	for function in api compute network objectstore scheduler volume xvpvncproxy; do
+		dosym /etc/init.d/nova /etc/init.d/nova-${function}
+	done
+
+	diropts -m 0750
+	dodir /var/run/nova /var/log/nova /var/lock/nova
+}

diff --git a/sys-cluster/swift/Manifest b/sys-cluster/swift/Manifest
new file mode 100644
index 0000000..ceb8496
--- /dev/null
+++ b/sys-cluster/swift/Manifest
@@ -0,0 +1,15 @@
+AUX swift-1.5.0-client-authv2.patch 866 RMD160 60577406c1dc2f44cfddd0a1d7f86039c732a746 SHA1 081e4cf2243a68110c9bfbfec3653caaedcca78b SHA256 e7d422ccc5cbfcd19acf65727b62a8e5a4295ca081abfd0bae1893ff8bee4742
+AUX swift-proxy-server.initd 1491 RMD160 3e7869beb28f32106385cfff211e494a6dffd0d3 SHA1 54059efecf34bda8acb9ceb01f0c3ee20b109fa3 SHA256 6c6de4c0f320ad23f337b2df57db3f457f4ad90731f4f458ad37861baa3a34fd
+AUX swift-storage-server.confd 182 RMD160 6b0a6c3c539c06af077932cfc5ca4d33640413ec SHA1 90cf5c560e7e1a3b6c5c3ebd0bccbef74de939f5 SHA256 4a6d5cecadcf3e915ff88266b99b3d9c008daf88d0a940753be590eb4271c4d1
+AUX swift-storage-server.initd 1497 RMD160 c0ae10d9946413ab6ec9eed75339c60032d22092 SHA1 64ea41e023d188b5fa4c9739689953c9d4ace191 SHA256 1026950280b5e9894a8b81f81a8b3ecc09aeaec79a61fb3a228cc10a58eeba41
+DIST swift-1.4.3.tar.gz 355583 RMD160 5eeedc56647596baa07866c00e2c63f9f5b656d7 SHA1 1a1e7b49568251fbb4f45bee9f58b60c52e03caf SHA256 1638e8c0806b54aabfe58a3a618c5af33a9830ada7c2e820e9abdbbcda0e4da2
+DIST swift-1.4.5.tar.gz 391111 RMD160 09f74ff6afbb88bd1aed2888c5e40cf0b0eb6291 SHA1 cb74a1dffd49d3fb49861cce6fdab531f9e2ed19 SHA256 d6b1501f7ab6c53a361823211d576f1a7d4c81f14069919e3a33f581707c6451
+DIST swift-1.4.7.tar.gz 416927 RMD160 0607287549fd0a05e1b6eb5cd78f1c40daa74239 SHA1 00ef158427c35c7e2541e60b74fe4360c8c18e3f SHA256 7c72be0e0ae3e6db44764120b9e03eb0b5769a2ecd5c8bd79b216ca591c80360
+DIST swift-1.4.8.tar.gz 421496 RMD160 d4eab57d851c18ecfa8e016b64ceb82ff7a03823 SHA1 44d8d9cd96b94d80097eab34da6d1ed7268bb693 SHA256 9663dcf984725d31684291339c42892ab727aff83bfd8eb05169bb881806e7e4
+DIST swift-1.5.0.tar.gz 458825 RMD160 47c2daa47498732efc6f771c8587b21b674f11f1 SHA1 c77a12368b6be34752228db0f658aba02de8a1d5 SHA256 7edcc240609df677c9763867a2ec40711114190688e338b1a2b2dab4caca3844
+EBUILD swift-1.4.3.ebuild 650 RMD160 ddc210e288decd3180a64b2b0f313cc95b1c5405 SHA1 393eb54c73a872dbba87578327ee192fc5c176c3 SHA256 b6968a3c33be6bea6f9df464f992d982face1468fd73f4ea2b79baeb5ecb2443
+EBUILD swift-1.4.5.ebuild 1129 RMD160 b9e7240a3b85fe0dc2879beda1c30f75cd48da77 SHA1 87893f36cb7142301352f88429ae480725f2fba6 SHA256 391aa1bcf7b3aaeb54a0f164eaa8e01ae6a0d310ad7d682a468560de0a4e3bfa
+EBUILD swift-1.4.7.ebuild 1129 RMD160 b9e7240a3b85fe0dc2879beda1c30f75cd48da77 SHA1 87893f36cb7142301352f88429ae480725f2fba6 SHA256 391aa1bcf7b3aaeb54a0f164eaa8e01ae6a0d310ad7d682a468560de0a4e3bfa
+EBUILD swift-1.4.8.ebuild 1129 RMD160 b9e7240a3b85fe0dc2879beda1c30f75cd48da77 SHA1 87893f36cb7142301352f88429ae480725f2fba6 SHA256 391aa1bcf7b3aaeb54a0f164eaa8e01ae6a0d310ad7d682a468560de0a4e3bfa
+EBUILD swift-1.5.0.ebuild 1203 RMD160 74fa282bfc101f21bc6400f8b1e7c2898a77b516 SHA1 891e51570eec0df48d58533ff114c156c350e2c2 SHA256 7ac2a656d9bc9456d424bba2169ebdd723792938982e10c298a3de35e96bf9b9
+EBUILD swift-9999.ebuild 1149 RMD160 cd93c0c9c1c090fb9af8eecc881a7d676e46fd44 SHA1 fe21cf775640efaa6366649615ac874ab7697816 SHA256 6c64e83916d13a710fac48b74ae69af165d510477a2a80034c30520b7aff4b75

diff --git a/sys-cluster/swift/files/swift-1.5.0-client-authv2.patch b/sys-cluster/swift/files/swift-1.5.0-client-authv2.patch
new file mode 100644
index 0000000..5fd7072
--- /dev/null
+++ b/sys-cluster/swift/files/swift-1.5.0-client-authv2.patch
@@ -0,0 +1,22 @@
+--- swift-1.5.0.org/swift/common/client.py	2012-06-19 12:40:25.000000000 +0200
++++ swift-1.5.0/swift/common/client.py	2012-06-19 12:39:51.000000000 +0200
+@@ -187,6 +187,10 @@
+ 
+ 
+ def _get_auth_v2_0(url, user, tenant_name, key, snet):
++    if not tenant_name and ':' in user:
++        tenant_name, user = user.split(':', 1)
++    if not tenant_name:
++        raise ClientException('No tenant specified')
+     body = {'auth': {'passwordCredentials':
+                       {'password': key, 'username': user},
+                      'tenantName': tenant_name}}
+@@ -238,8 +242,6 @@
+     if auth_version in ["1.0", "1"]:
+         return _get_auth_v1_0(url, user, key, snet)
+     elif auth_version in ["2.0", "2"]:
+-        if not tenant_name:
+-            raise ClientException('No tenant specified')
+         return _get_auth_v2_0(url, user, tenant_name, key, snet)
+ 
+ 

diff --git a/sys-cluster/swift/files/swift-proxy-server.initd b/sys-cluster/swift/files/swift-proxy-server.initd
new file mode 100755
index 0000000..705d1e5
--- /dev/null
+++ b/sys-cluster/swift/files/swift-proxy-server.initd
@@ -0,0 +1,64 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+#
+# Author: Cor Cornelisse <corcornelisse@gmail.com>
+
+depend() {
+	need net
+}
+
+opts="reload"
+
+BASENAME=$(echo $SVCNAME | cut -d '-' -f 1)
+SERVERNAME=$(echo $SVCNAME | cut -c 7-)
+
+checkconfig() {
+	if [ ! -r /etc/${BASENAME}/${SERVICENAME} ]; then
+		eerror "No config file found: /etc/${BASENAME}/${SERVICENAME}"
+		return 1
+	fi
+	return 0
+}
+
+
+start() {
+	checkconfig || return $?
+
+	ebegin "Starting ${SVCNAME}"
+	start-stop-daemon --start --pidfile "/var/run/${BASENAME}/${SERVERNAME}.pid" \
+					  --exec /usr/bin/${BASENAME}-init -- ${SERVERNAME} start
+	eend $? "Failed to start ${SVCNAME}"
+}
+
+stop() {
+	checkconfig || return $?
+
+	ebegin "Stopping ${SVCNAME}"
+	start-stop-daemon --stop --pidfile "/var/run/${BASENAME}/${SERVERNAME}.pid" \
+					  --exec /usr/bin/${BASENAME}-init -- ${SERVERNAME} stop 
+	eend $? "Failed to stop ${SVCNAME}"
+}
+
+reload() {
+	checkconfig || return $?
+
+	ebegin "Reloading ${SVCNAME}"
+	start-stop-daemon --exec /usr/bin/${BASENAME}-init -- ${SERVERNAME} reload
+	eend $? "Failed to reload ${SVCNAME}"
+}
+
+restart() {
+	checkconfig || return $?
+
+	ebegin "Restarting ${SVCNAME}"
+	start-stop-daemon --exec /usr/bin/${BASENAME}-init -- ${SERVERNAME} restart
+	eend $? "Failed to restart ${SVCNAME}"
+}
+
+status() {
+	start-stop-daemon --exec /usr/bin/${BASENAME}-init -- ${SERVERNAME} status
+	eend $? "Failed to get status for ${SVCNAME}"
+}
+

diff --git a/sys-cluster/swift/files/swift-storage-server.confd b/sys-cluster/swift/files/swift-storage-server.confd
new file mode 100644
index 0000000..8735b99
--- /dev/null
+++ b/sys-cluster/swift/files/swift-storage-server.confd
@@ -0,0 +1,5 @@
+SERVERS="account container object"
+
+ACCOUNTSERVICE="server replicator auditor"
+CONTAINERSERVICE="server replicator updater auditor"
+OBJECTSERVICE="server replicator updater auditor"

diff --git a/sys-cluster/swift/files/swift-storage-server.initd b/sys-cluster/swift/files/swift-storage-server.initd
new file mode 100755
index 0000000..58d1251
--- /dev/null
+++ b/sys-cluster/swift/files/swift-storage-server.initd
@@ -0,0 +1,60 @@
+#!/sbin/runscript
+# Copyright 1999-2012 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+#
+# Author: Cor Cornelisse <corcornelisse@gmail.com>
+
+depend() {
+	need net
+}
+
+BASENAME=$(echo $SVCNAME | cut -d '-' -f 1)
+
+checkconfig() {
+	if [ ! -r /etc/${BASENAME}/${BASENAME}.conf ]; then
+		eerror "Missing required config file: /etc/${BASENAME}/${BASENAME}.conf"
+		return 1
+	fi
+	for server in ${SERVERS}; do
+		if [ ! -r /etc/${BASENAME}/${server}-server.conf ]; then
+			eerror "Missing required config file: /etc/${BASENAME}/${SERVER}-server.conf"
+			return 1
+		fi
+	done
+	return 0
+}
+
+start() {
+	checkconfig || return $?
+
+	einfo "Starting all ${BASENAME} services:"
+
+	for server in ${SERVERS}; do
+		for service in $(eval "echo \$${server^^}SERVICE"); do
+			ebegin "Starting $server-$service"
+			start-stop-daemon --start --pidfile \
+					  "/var/run/${BASENAME}/$server-$service.pid" \
+					  --exec /usr/bin/${BASENAME}-init \
+					  -- $server-$service start
+			eend $? "Failed to start $server-$service"
+		done
+	done
+}
+
+stop() {
+	checkconfig || return $?
+
+	einfo "Stopping all ${BASENAME} services:"
+
+	for server in ${SERVERS}; do
+		for service in $(eval "echo \$${server^^}SERVICE"); do
+			ebegin "Stopping $server-$service"
+			start-stop-daemon --stop --pidfile \
+					  "/var/run/${BASENAME}/$server-$service.pid" \
+					  --exec /usr/bin/${BASENAME}-init \
+					  -- $server-$service stop
+			eend $? "Failed to stop $server-$service"
+		done
+	done
+}

diff --git a/sys-cluster/swift/swift-1.5.0.ebuild b/sys-cluster/swift/swift-1.5.0.ebuild
new file mode 100644
index 0000000..374639b
--- /dev/null
+++ b/sys-cluster/swift/swift-1.5.0.ebuild
@@ -0,0 +1,52 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit distutils eutils
+
+DESCRIPTION="Swift is a highly available, distributed, eventually consistent
+object/blob store"
+HOMEPAGE="https://launchpad.net/swift"
+SRC_URI="http://launchpad.net/${PN}/folsom/${PV}/+download/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="storage-server proxy-server"
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+		 dev-python/netifaces
+		 dev-python/eventlet
+		 dev-python/webob
+		 dev-python/pastedeploy
+		 dev-python/pyxattr"
+
+# Can only use this when python.eclass is using EAPI4
+#REQUIRED_USE="|| ( storage-server proxy-server )"
+
+src_prepare() {
+	epatch "${FILESDIR}/${P}-client-authv2.patch"
+}
+
+src_install()
+{
+	distutils_src_install
+
+	dodir "/var/run/swift"
+
+	if use proxy-server; then
+		newinitd "${FILESDIR}/swift-proxy-server.initd" swift-proxy-server
+	fi
+
+	if use storage-server; then
+		newinitd "${FILESDIR}/swift-storage-server.initd" swift-storage-server
+		newconfd "${FILESDIR}/swift-storage-server.confd" swift-storage-server
+	fi
+}

diff --git a/sys-cluster/swift/swift-9999.ebuild b/sys-cluster/swift/swift-9999.ebuild
new file mode 100644
index 0000000..9b78a76
--- /dev/null
+++ b/sys-cluster/swift/swift-9999.ebuild
@@ -0,0 +1,48 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+SUPPORT_PYTHON_ABIS="1"
+RESTRICT_PYTHON_ABIS="3.*"
+
+inherit git-2 distutils
+
+DESCRIPTION="Swift is a highly available, distributed, eventually consistent
+object/blob store"
+HOMEPAGE="https://launchpad.net/swift"
+EGIT_REPO_URI="https://github.com/openstack/swift.git"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE="storage-server proxy-server"
+
+DEPEND="dev-python/setuptools"
+RDEPEND="${DEPEND}
+         dev-python/netifaces
+         dev-python/eventlet
+         dev-python/webob
+         dev-python/pastedeploy
+         dev-python/pyxattr"
+
+# Can only use this when python.eclass is using EAPI4
+#REQUIRED_USE="|| ( storage-server proxy-server )"
+
+src_install()
+{
+	distutils_src_install
+
+	dodir "/var/run/swift"
+
+	if use proxy-server; then
+		newinitd "${FILESDIR}/swift-proxy-server.initd" swift-proxy-server
+	fi
+
+	if use storage-server; then
+		newinitd "${FILESDIR}/swift-storage-server.initd" swift-storage-server
+		newconfd "${FILESDIR}/swift-storage-server.confd" swift-storage-server
+	fi
+}

diff --git a/www-apps/horizon/Manifest b/www-apps/horizon/Manifest
new file mode 100644
index 0000000..45b153f
--- /dev/null
+++ b/www-apps/horizon/Manifest
@@ -0,0 +1,12 @@
+AUX horizon_vhost.conf 529 RMD160 b2e7ecd9c9ec8dcbe90aa500edf0f4c5381a81fd SHA1 d468e6c5ad59d473a1c60c0ccf945f47e5a0caa3 SHA256 9e74616a632e153a88c6d4c2d58c4c4e86e1a3526cccd41643dd27fe2e175d8d
+AUX revert-bugfix-974916.patch 6011 RMD160 60b833032eea86723e8733517fe3eb139247257e SHA1 3b2609ba55b6e54c8a3297a4d04cadff6b044d13 SHA256 c232929fc3862334e3cbf199de4ac841bd90feeccbc8aafdd470b42c9bdc483f
+DIST horizon-2012.1.1.tar.gz 609478 RMD160 17385003e281bf3e098601bf546522dce95a8bc0 SHA1 caf88a1b915d298799fa71b41ecd2583d2d299ea SHA256 9313c01f3f0ef87941f0f49ebea9ccfe68385bf8bed625eb3fe36284d41fd74a
+DIST horizon-2012.1.tar.gz 606289 RMD160 908b4688bb8df6a652dbc1a05cd427e9781f2ce6 SHA1 6ce163482981e8151a4dbfb8584df662387a673f SHA256 68752c6a3d793c0fdc232dfe2a11c1702db9d8c1097f4d9211a3adafe82c445b
+DIST horizon-2012.1~rc1.tar.gz 585720 RMD160 5abb143d68c9f9bea5fdef9b1efa31f7beea5983 SHA1 40c6801961ba5a8e68b35b24c5869d35a9ac7070 SHA256 4b7b141997d0e0ed544a1c1b5c72d49b6089240d6e865d44a2904b9cc91c917d
+DIST horizon-2012.1~rc2.tar.gz 606289 RMD160 908b4688bb8df6a652dbc1a05cd427e9781f2ce6 SHA1 6ce163482981e8151a4dbfb8584df662387a673f SHA256 68752c6a3d793c0fdc232dfe2a11c1702db9d8c1097f4d9211a3adafe82c445b
+EBUILD horizon-2012.1.1-r1.ebuild 2044 RMD160 f67a4f13211d44adc60eea644c91b930e8d730c2 SHA1 14a949af3e12d212d3e5a5eaeb4cf87429127d43 SHA256 a6bc153df585cc517630c4db642a63e1ee5b6276b07e0013d8cbea6f5efdfa85
+EBUILD horizon-2012.1.1.ebuild 1976 RMD160 5e3118b0c5b0d66674e38b3a3383a8c084a7301b SHA1 8b78c7d3ce85790d54559593cbe113f8ef17da2b SHA256 6a2542d79dbfb0062fb1140dc7632c892978af89fef3a85c771c64ebc4422a5a
+EBUILD horizon-2012.1.ebuild 1975 RMD160 2a070d9b414e77406e19cad2d5f9a964e54d15a5 SHA1 7c6ef6a435717db510a61fbaeff20862c4a771e8 SHA256 4fb11b5e083f25e25284be6ddcbe3d3be6349547d2bd3ef96e4c5ff68c2eaa3a
+EBUILD horizon-2012.1_rc1.ebuild 2007 RMD160 fd992f0be7ba9bc2c03b938775e739a84f60726b SHA1 8b7a713ff58f8c6ce6fd2eff77b06826dfb08afd SHA256 57d3caa1cddb56bb8750fb05ffe0a0ae5ba62d402df83c78ab232f592bb7b431
+EBUILD horizon-2012.1_rc2.ebuild 2010 RMD160 7210975e3bb1ceeedb33a4905762554f0f84b727 SHA1 bbf97aef72f14ea13cce3c20350e0c192bb01b86 SHA256 303deb4e7645a55c95aa7da22c0e746a5176b67c425df2a26e5426efe20560ac
+EBUILD horizon-9999.ebuild 1513 RMD160 88417143b72bd0bd7806b648f01ecb992f193b73 SHA1 7adf76bf15b3873ad87f33d62a5620cd74503559 SHA256 ea79e41a993731592e43dc4e3690ec4fbc3d1638e651a855babffe9f603c03d3

diff --git a/www-apps/horizon/files/horizon_vhost.conf b/www-apps/horizon/files/horizon_vhost.conf
new file mode 100644
index 0000000..45df6ec
--- /dev/null
+++ b/www-apps/horizon/files/horizon_vhost.conf
@@ -0,0 +1,14 @@
+Listen 8000
+WSGIPythonPath /usr/lib64/python2.7/site-packages/horizon
+WSGIPythonPath /usr/lib64/python2.7/site-packages
+<VirtualHost localhost:8000>
+	ServerName localhost
+	WSGIScriptAlias / /usr/lib64/python2.7/site-packages/openstack_dashboard/wsgi/django.wsgi
+	Alias /media/admin/ /usr/lib64/python2.7/site-packages/django/contrib/admin/media/
+	<Directory "/usr/lib64/python2.7/site-packages/openstack_dashboard">
+    	AllowOverride None
+	    Options None
+	    Order allow,deny
+	    Allow from all
+	</Directory>
+</VirtualHost>

diff --git a/www-apps/horizon/files/revert-bugfix-974916.patch b/www-apps/horizon/files/revert-bugfix-974916.patch
new file mode 100644
index 0000000..70a6ac5
--- /dev/null
+++ b/www-apps/horizon/files/revert-bugfix-974916.patch
@@ -0,0 +1,125 @@
+diff -urN horizon-2012.1.1.orig/horizon/dashboards/nova/instances_and_volumes/tests.py horizon-2012.1.1/horizon/dashboards/nova/instances_and_volumes/tests.py
+--- horizon-2012.1.1.orig/horizon/dashboards/nova/instances_and_volumes/tests.py	2012-09-17 14:42:01.691620470 +0200
++++ horizon-2012.1.1/horizon/dashboards/nova/instances_and_volumes/tests.py	2012-09-17 14:43:11.002618777 +0200
+@@ -18,7 +18,6 @@
+ #    License for the specific language governing permissions and limitations
+ #    under the License.
+ 
+-from copy import deepcopy
+ from django import http
+ from django.core.urlresolvers import reverse
+ from mox import IsA
+@@ -43,50 +42,7 @@
+         self.assertTemplateUsed(res,
+             'nova/instances_and_volumes/index.html')
+         instances = res.context['instances_table'].data
+-        volumes = res.context['volumes_table'].data
+-
+         self.assertItemsEqual(instances, self.servers.list())
+-        self.assertItemsEqual(volumes, self.volumes.list())
+-
+-    def test_attached_volume(self):
+-        volumes = deepcopy(self.volumes.list())
+-        attached_volume = deepcopy(self.volumes.list()[0])
+-        attached_volume.id = "2"
+-        attached_volume.display_name = "Volume2 name"
+-        attached_volume.size = "80"
+-        attached_volume.status = "in-use"
+-        attached_volume.attachments = [{"server_id": "1",
+-                                        "device": "/dev/hdn"}]
+-        volumes.append(attached_volume)
+-
+-        self.mox.StubOutWithMock(api, 'server_list')
+-        self.mox.StubOutWithMock(api, 'volume_list')
+-        api.server_list(IsA(http.HttpRequest)).AndReturn(self.servers.list())
+-        api.volume_list(IsA(http.HttpRequest)).AndReturn(volumes)
+-
+-        self.mox.ReplayAll()
+-
+-        res = self.client.get(
+-            reverse('horizon:nova:instances_and_volumes:index'))
+-
+-        self.assertTemplateUsed(res,
+-            'nova/instances_and_volumes/index.html')
+-        instances = res.context['instances_table'].data
+-        resp_volumes = res.context['volumes_table'].data
+-
+-        self.assertItemsEqual(instances, self.servers.list())
+-        self.assertItemsEqual(resp_volumes, volumes)
+-
+-        self.assertContains(res, ">Volume name<", 1, 200)
+-        self.assertContains(res, ">40 GB<", 1, 200)
+-        self.assertContains(res, ">Available<", 1, 200)
+-
+-        self.assertContains(res, ">Volume2 name<", 1, 200)
+-        self.assertContains(res, ">80 GB<", 1, 200)
+-        self.assertContains(res, ">In-Use<", 1, 200)
+-        self.assertContains(res,
+-                            ">Instance server_1 (1)</a>&nbsp;on /dev/hdn",
+-                            1, 200)
+ 
+     def test_index_server_list_exception(self):
+         self.mox.StubOutWithMock(api, 'server_list')
+@@ -94,7 +50,6 @@
+         exception = novaclient_exceptions.ClientException('apiException')
+         api.server_list(IsA(http.HttpRequest)).AndRaise(exception)
+         api.volume_list(IsA(http.HttpRequest)).AndReturn(self.volumes.list())
+-        api.server_list(IsA(http.HttpRequest)).AndReturn(self.servers.list())
+ 
+         self.mox.ReplayAll()
+ 
+diff -urN horizon-2012.1.1.orig/horizon/dashboards/nova/instances_and_volumes/views.py horizon-2012.1.1/horizon/dashboards/nova/instances_and_volumes/views.py
+--- horizon-2012.1.1.orig/horizon/dashboards/nova/instances_and_volumes/views.py	2012-09-17 14:42:01.690620470 +0200
++++ horizon-2012.1.1/horizon/dashboards/nova/instances_and_volumes/views.py	2012-09-17 14:44:19.782617090 +0200
+@@ -46,7 +46,7 @@
+     def get_instances_data(self):
+         # Gather our instances
+         try:
+-            instances = self._get_instances()
++            instances = api.server_list(self.request)
+         except:
+             instances = []
+             exceptions.handle(self.request, _('Unable to retrieve instances.'))
+@@ -67,18 +67,8 @@
+         # Gather our volumes
+         try:
+             volumes = api.volume_list(self.request)
+-            instances = SortedDict([(inst.id, inst) for inst in
+-                                    self._get_instances()])
+-            for volume in volumes:
+-                for att in volume.attachments:
+-                    att['instance'] = instances[att['server_id']]
+         except novaclient_exceptions.ClientException, e:
+             volumes = []
+             LOG.exception("ClientException in volume index")
+             messages.error(self.request, _('Unable to fetch volumes: %s') % e)
+         return volumes
+-
+-    def _get_instances(self):
+-        if not hasattr(self, "_instances_list"):
+-            self._instances_list = api.server_list(self.request)
+-        return self._instances_list
+diff -urN horizon-2012.1.1.orig/horizon/dashboards/nova/instances_and_volumes/volumes/tables.py horizon-2012.1.1/horizon/dashboards/nova/instances_and_volumes/volumes/tables.py
+--- horizon-2012.1.1.orig/horizon/dashboards/nova/instances_and_volumes/volumes/tables.py	2012-09-17 14:42:01.691620470 +0200
++++ horizon-2012.1.1/horizon/dashboards/nova/instances_and_volumes/volumes/tables.py	2012-09-17 14:45:45.039615013 +0200
+@@ -85,16 +85,16 @@
+ 
+ def get_attachment(volume):
+     attachments = []
+-    link = '<a href="%(url)s">Instance %(name)s (%(instance)s)</a>&nbsp;' \
+-           'on %(dev)s'
++    link = '<a href="%(url)s">Instance %(instance)s&nbsp;' \
++           '<small>(%(dev)s)</small></a>'
+     # Filter out "empty" attachments which the client returns...
+     for attachment in [att for att in volume.attachments if att]:
+         url = reverse("%s:instances:detail" % URL_PREFIX,
+                       args=(attachment["server_id"],))
+         # TODO(jake): Make "instance" the instance name
+         vals = {"url": url,
+-                "name": attachment["instance"].name,
+-                "instance": attachment["server_id"],
++                
++		"instance": attachment["server_id"],
+                 "dev": attachment["device"]}
+         attachments.append(link % vals)
+     return safestring.mark_safe(", ".join(attachments))

diff --git a/www-apps/horizon/horizon-2012.1.1-r1.ebuild b/www-apps/horizon/horizon-2012.1.1-r1.ebuild
new file mode 100644
index 0000000..e4cecc1
--- /dev/null
+++ b/www-apps/horizon/horizon-2012.1.1-r1.ebuild
@@ -0,0 +1,74 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+
+inherit distutils eutils
+
+DESCRIPTION="The OpenStack Dashboard (Horizon) provides a baseline user
+interface for managing OpenStack services. It is a reference implementation
+built using the django-openstack project which contains all of the core
+functionality needed to develop a site-specific implementation."
+HOMEPAGE="http://wiki.openstack.org/OpenStackDashboard"
+SRC_URI="http://launchpad.net/${PN}/essex/${PV}/+download/${P}.tar.gz"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND=">=dev-python/django-1.3.1
+	    dev-python/python-dateutil
+		dev-python/sphinx
+		dev-python/cherrypy
+		dev-python/coverage
+		dev-python/nose
+		dev-python/mox
+		dev-python/pep8
+		dev-python/pylint
+		dev-python/pastedeploy
+		dev-python/eventlet
+		dev-python/kombu
+		dev-python/pycrypto
+		dev-python/routes
+		dev-python/sqlalchemy
+		dev-python/sqlalchemy-migrate
+		dev-python/webob
+		dev-python/pyxattr
+		dev-python/python-gflags
+		dev-python/python-keystoneclient
+		dev-python/python-novaclient
+		dev-python/python-cloudfiles
+		app-admin/glance
+		dev-python/setuptools
+		www-apps/noVNC"
+
+RDEPEND="${DEPEND}"
+
+src_prepare() {
+	epatch ${FILESDIR}"/revert-bugfix-974916.patch"
+}
+
+src_install() {
+	distutils_src_install
+	dodoc ${FILESDIR}"/horizon_vhost.conf"
+	dodir /etc/horizon
+	insinto /etc/horizon
+	doins openstack_dashboard/local/local_settings.py.example
+	# Little dirty this way, but get's the job done bro
+	dosym /etc/horizon/local_settings.py /usr/lib64/python2.7/site-packages/openstack_dashboard/local/local_settings.py
+}
+
+pkg_postinst() {
+	elog
+	elog "A vhost configuration example for apache2 with mod_wsgi can be found"
+	elog "in /usr/share/doc/${PF}/horizon_vhost.conf"
+	elog "Adapt it to suite your needs, and install it in /etc/apache/vhosts.d/"
+	elog "Replace localhost by the real servername"
+	elog
+	elog "The dashboard can be configured through /etc/horizon/settings.py"
+	elog
+}

diff --git a/www-apps/horizon/horizon-9999.ebuild b/www-apps/horizon/horizon-9999.ebuild
new file mode 100644
index 0000000..71a967a
--- /dev/null
+++ b/www-apps/horizon/horizon-9999.ebuild
@@ -0,0 +1,59 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+
+inherit git-2 distutils eutils
+
+DESCRIPTION="The OpenStack Dashboard (Horizon) provides a baseline user
+interface for managing OpenStack services. It is a reference implementation
+built using the django-openstack project which contains all of the core
+functionality needed to develop a site-specific implementation."
+HOMEPAGE="http://wiki.openstack.org/OpenStackDashboard"
+EGIT_REPO_URI="https://github.com/openstack/horizon"
+
+LICENSE="Apache-2.0"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND="=dev-python/django-1.3.1
+	    dev-python/python-dateutil
+		dev-python/sphinx
+		dev-python/cherrypy
+		dev-python/coverage
+		dev-python/nose
+		dev-python/mox
+		dev-python/pep8
+		dev-python/pylint
+		dev-python/pastedeploy
+		dev-python/eventlet
+		dev-python/kombu
+		dev-python/pycrypto
+		dev-python/routes
+		dev-python/sqlalchemy
+		dev-python/sqlalchemy-migrate
+		dev-python/webob
+		dev-python/pyxattr
+		dev-python/python-gflags
+		dev-python/python-novaclient
+		dev-python/python-cloudfiles
+		app-admin/glance
+		dev-python/setuptools"
+RDEPEND="${DEPEND}"
+
+DISTUTILS_SETUP_FILES=("horizon/setup.py" "openstack-dashboard/setup.py")
+
+src_install() {
+	distutils_src_install
+
+	#newconfd "${FILESDIR}/openstack-dashboard.confd" openstack-dashboard
+	#newinitd "${FILESDIR}/openstack-dashboard.initd" openstack-dashboard
+
+	#diropts -m 0750
+	#dodir /var/run/quantum /var/log/quantum
+}
+

diff --git a/www-apps/noVNC/Manifest b/www-apps/noVNC/Manifest
new file mode 100644
index 0000000..b9f5a70
--- /dev/null
+++ b/www-apps/noVNC/Manifest
@@ -0,0 +1,3 @@
+AUX noVNC.confd 104 RMD160 39e7784520afe42c61a1baa35b6b8f69ad7e3287 SHA1 1664a089d8e981910550c6cf5ce016d7ceacedb1 SHA256 f6b072f2292701ded2c9acdc6a2a55d1d2c9b43c6db41ed99a7993d823b51512
+AUX noVNC.initd 1083 RMD160 94044557dc720f266d22a3193b6edde51c72279d SHA1 a2aee95688afcebebf52f20980073a44b085b01a SHA256 897664e68e406ea8feaa6d6fc4b3cd6e0710a377b83c2876d18f6e8cba3777d0
+EBUILD noVNC-9999.ebuild 1288 RMD160 763d8863994e07c3a868b4f6c38bcb459eebed57 SHA1 7d84c0f5fc60cb158098310186ed47dd9bd63b35 SHA256 fd7c513e89d4dc8848d16c5048c6fe57cdca53cbfff983efe66587cb462220ee

diff --git a/www-apps/noVNC/files/noVNC.confd b/www-apps/noVNC/files/noVNC.confd
new file mode 100644
index 0000000..50ddb5c
--- /dev/null
+++ b/www-apps/noVNC/files/noVNC.confd
@@ -0,0 +1,4 @@
+FLAG_FILE=/etc/nova/nova.conf
+WEB_ROOT=/opt/noVNC
+LOG_PATH=/var/log/noVNC
+CERT_FILE=/opt/noVNC/self.pem

diff --git a/www-apps/noVNC/files/noVNC.initd b/www-apps/noVNC/files/noVNC.initd
new file mode 100755
index 0000000..f3b88a2
--- /dev/null
+++ b/www-apps/noVNC/files/noVNC.initd
@@ -0,0 +1,49 @@
+#!/sbin/runscript
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+#
+# Author: Cor Cornelisse <corcornelisse@gmail.com>
+
+depend() {
+	need net
+}
+
+checkconfig() {
+	if [ ! -r /etc/conf.d/${SVCNAME} ]; then
+		eerror "No config file found: /etc/conf.d/${SVCNAME}"
+		return 1
+	fi
+	return 0
+}
+
+
+start() {
+	checkconfig || return $?
+	. /etc/conf.d/${SVCNAME}
+	
+	ebegin "Starting ${SVCNAME}"
+	
+	start-stop-daemon --start --quiet --make-pidfile --pidfile \
+					  "/var/run/${SVCNAME}.pid" --background \
+					  --stdout ${LOG_PATH}/${SVCNAME}.log \
+					  --stderr ${LOG_PATH}/${SVCNAME}.err --exec \
+					  /opt/noVNC/utils/nova-novncproxy -- \
+					  --flagfile=${FLAG_FILE} --cert=${CERT_FILE} \
+					  --web ${WEB_ROOT}
+					  
+	
+	eend $? "Failed to start ${SVCNAME}"
+}
+
+stop() {
+	checkconfig || return $?
+	. /etc/conf.d/${SVCNAME}
+	
+	ebegin "Stopping ${SVCNAME}"
+	
+	start-stop-daemon --stop --pidfile "/var/run/${SVCNAME}.pid" \
+					  --exec /opt/noVNC/utils/nova-novncproxy 
+	eend $? "Failed to stop ${SVCNAME}"
+}
+

diff --git a/www-apps/noVNC/noVNC-9999.ebuild b/www-apps/noVNC/noVNC-9999.ebuild
new file mode 100644
index 0000000..7f26209
--- /dev/null
+++ b/www-apps/noVNC/noVNC-9999.ebuild
@@ -0,0 +1,63 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+inherit git-2
+
+DESCRIPTION="noVNC is a VNC client implemented using HTML5 technologies,
+specifically Canvas and WebSockets (supports 'wss://' encryption). noVNC is
+licensed under the LGPLv3."
+HOMEPAGE="http://kanaka.github.com/noVNC/"
+EGIT_REPO_URI="https://github.com/cloudbuilders/noVNC"
+
+LICENSE="LGPL-3"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND=""
+RDEPEND="${DEPEND}
+		dev-python/numpy
+		www-misc/websockify"
+
+
+src_compile() {
+	cd ${S}/utils
+	emake
+}
+
+src_install() {
+	dodir /opt/noVNC
+	dodir /opt/noVNC/utils
+	dodir /opt/noVNC/include
+	dodir /opt/noVNC/images
+
+	exeinto /opt/noVNC/utils
+	doexe utils/json2graph.py
+	doexe utils/launch.sh
+	doexe utils/nova-novncproxy
+	doexe utils/rebind
+	doexe utils/rebind.so
+	doexe utils/u2x11
+	doexe utils/web.py
+	doexe utils/wsproxy.py
+	doexe utils/websocket.py
+
+	docinto /opt/noVNC/docs
+	dodoc README.md
+	dodoc LICENSE.txt
+
+	dosym /opt/noVNC/images/favicon.ico /opt/noVNC/
+	cp -pPR *.html ${D}/opt/noVNC/
+	cp -pPR include/* ${D}/opt/noVNC/include
+	cp -pPR images/* ${D}/opt/noVNC/images
+
+	newconfd "${FILESDIR}/noVNC.confd" noVNC
+	newinitd "${FILESDIR}/noVNC.initd" noVNC
+
+	diropts -m 0750
+	dodir /var/log/noVNC
+}
+

diff --git a/www-misc/websockify/Manifest b/www-misc/websockify/Manifest
new file mode 100644
index 0000000..5fbb29d
--- /dev/null
+++ b/www-misc/websockify/Manifest
@@ -0,0 +1 @@
+EBUILD websockify-9999.ebuild 620 RMD160 baf9a6f6104264150f1664cb5f6c76c789d7495a SHA1 78907b81255efbbb795463c143010a4a264ee07d SHA256 6fef5d7f9db4f4a36dd8e8d35d436ae1a9da1c13acdb039b70c38fc28654b86a

diff --git a/www-misc/websockify/websockify-9999.ebuild b/www-misc/websockify/websockify-9999.ebuild
new file mode 100644
index 0000000..0d29d01
--- /dev/null
+++ b/www-misc/websockify/websockify-9999.ebuild
@@ -0,0 +1,25 @@
+# Copyright 1999-2011 Gentoo Foundation
+# Distributed under the terms of the GNU General Public License v2
+# $Header: $
+
+EAPI=3
+
+PYTHON_DEPEND="2"
+
+inherit git-2 distutils
+
+DESCRIPTION="At the most basic level, websockify just translates WebSockets
+traffic to normal socket traffic. Websockify accepts the WebSockets handshake,
+parses it, and then begins forwarding traffic between the client and the target
+in both directions."
+HOMEPAGE="https://github.com/kanaka/websockify/wiki"
+EGIT_REPO_URI="https://github.com/kanaka/websockify"
+
+LICENSE="LGPL-3"
+SLOT="0"
+KEYWORDS="~amd64"
+IUSE=""
+
+DEPEND=""
+RDEPEND="${DEPEND}"
+


                 reply	other threads:[~2012-10-26 20:35 UTC|newest]

Thread overview: [no followups] expand[flat|nested]  mbox.gz  Atom feed

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1351283707.8338fdecf0bc0a3305b95bc69ca07028e432d9b8.prometheanfire@gentoo \
    --to=prometheanfire@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox