summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Thode <mthode@mthode.org>2012-10-26 15:35:07 -0500
committerMatthew Thode <mthode@mthode.org>2012-10-26 15:35:07 -0500
commit8338fdecf0bc0a3305b95bc69ca07028e432d9b8 (patch)
tree12acd4ce0344188ad4f2ec95ee8e294bf123477f
parentremoved skype and selinux-nslcd (diff)
downloadprometheanfire-8338fdecf0bc0a3305b95bc69ca07028e432d9b8.tar.gz
prometheanfire-8338fdecf0bc0a3305b95bc69ca07028e432d9b8.tar.bz2
prometheanfire-8338fdecf0bc0a3305b95bc69ca07028e432d9b8.zip
adding first try of openstack
-rw-r--r--app-admin/glance/Manifest6
-rw-r--r--app-admin/glance/files/glance-swift-authv2.patch914
-rw-r--r--app-admin/glance/files/glance.confd1
-rw-r--r--app-admin/glance/files/glance.initd51
-rw-r--r--app-admin/glance/glance-2012.1.2.ebuild44
-rw-r--r--app-admin/glance/glance-9999.ebuild44
-rw-r--r--dev-python/nova-adminclient/Manifest2
-rw-r--r--dev-python/nova-adminclient/nova-adminclient-0.1.8.ebuild25
-rw-r--r--dev-python/passlib/Manifest2
-rw-r--r--dev-python/passlib/passlib-1.3.1.ebuild34
-rw-r--r--dev-python/python-cloudfiles/Manifest2
-rw-r--r--dev-python/python-cloudfiles/python-cloudfiles-1.7.10.ebuild27
-rw-r--r--dev-python/python-cloudfiles/python-cloudfiles-9999.ebuild25
-rw-r--r--dev-python/python-keystoneclient/Manifest7
-rw-r--r--dev-python/python-keystoneclient/python-keystoneclient-2012.1.ebuild35
-rw-r--r--dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc1.ebuild37
-rw-r--r--dev-python/python-keystoneclient/python-keystoneclient-2012.1_rc2.ebuild37
-rw-r--r--dev-python/python-keystoneclient/python-keystoneclient-9999.ebuild36
-rw-r--r--dev-python/python-novaclient/Manifest8
-rw-r--r--dev-python/python-novaclient/python-novaclient-2012.1.ebuild28
-rw-r--r--dev-python/python-novaclient/python-novaclient-2012.1_rc1.ebuild30
-rw-r--r--dev-python/python-novaclient/python-novaclient-2012.1_rc3.ebuild30
-rw-r--r--dev-python/python-novaclient/python-novaclient-2012.1_rc4.ebuild30
-rw-r--r--dev-python/python-quantumclient/Manifest1
-rw-r--r--dev-python/python-quantumclient/python-quantumclient-9999.ebuild30
-rw-r--r--dev-python/python-swift3/Manifest1
-rw-r--r--dev-python/python-swift3/python-swift3-1.5.0.ebuild27
-rw-r--r--net-dns/dnsmasq/Manifest5
-rw-r--r--net-dns/dnsmasq/dnsmasq-2.63.ebuild129
-rw-r--r--net-dns/dnsmasq/files/dnsmasq-2.47-fbsd-config.patch16
-rw-r--r--net-dns/dnsmasq/files/dnsmasq-init-r225
-rw-r--r--net-dns/dnsmasq/files/dnsmasq.confd-r14
-rw-r--r--net-misc/quantum/Manifest4
-rw-r--r--net-misc/quantum/files/quantum-server.confd2
-rw-r--r--net-misc/quantum/files/quantum-server.initd43
-rw-r--r--net-misc/quantum/files/server-setup-disable-initd-install.patch21
-rw-r--r--net-misc/quantum/quantum-9999.ebuild51
-rw-r--r--sys-auth/keystone/Manifest13
-rw-r--r--sys-auth/keystone/files/keystone.confd2
-rw-r--r--sys-auth/keystone/files/keystone.initd53
-rw-r--r--sys-auth/keystone/keystone-2012.1.2.ebuild40
-rw-r--r--sys-auth/keystone/keystone-9999.ebuild32
-rw-r--r--sys-auth/swift-keystone2/Manifest1
-rw-r--r--sys-auth/swift-keystone2/swift-keystone2-9999.ebuild26
-rw-r--r--sys-cluster/nova/Manifest16
-rw-r--r--sys-cluster/nova/files/nova.confd4
-rw-r--r--sys-cluster/nova/files/nova.initd54
-rw-r--r--sys-cluster/nova/nova-2012.1.2.ebuild64
-rw-r--r--sys-cluster/nova/nova-9999.ebuild63
-rw-r--r--sys-cluster/swift/Manifest15
-rw-r--r--sys-cluster/swift/files/swift-1.5.0-client-authv2.patch22
-rwxr-xr-xsys-cluster/swift/files/swift-proxy-server.initd64
-rw-r--r--sys-cluster/swift/files/swift-storage-server.confd5
-rwxr-xr-xsys-cluster/swift/files/swift-storage-server.initd60
-rw-r--r--sys-cluster/swift/swift-1.5.0.ebuild52
-rw-r--r--sys-cluster/swift/swift-9999.ebuild48
-rw-r--r--www-apps/horizon/Manifest12
-rw-r--r--www-apps/horizon/files/horizon_vhost.conf14
-rw-r--r--www-apps/horizon/files/revert-bugfix-974916.patch125
-rw-r--r--www-apps/horizon/horizon-2012.1.1-r1.ebuild74
-rw-r--r--www-apps/horizon/horizon-9999.ebuild59
-rw-r--r--www-apps/noVNC/Manifest3
-rw-r--r--www-apps/noVNC/files/noVNC.confd4
-rwxr-xr-xwww-apps/noVNC/files/noVNC.initd49
-rw-r--r--www-apps/noVNC/noVNC-9999.ebuild63
-rw-r--r--www-misc/websockify/Manifest1
-rw-r--r--www-misc/websockify/websockify-9999.ebuild25
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}"
+