summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichael Gundlach <michael.gundlach@rackspace.com>2010-09-13 11:53:53 -0400
committerMichael Gundlach <michael.gundlach@rackspace.com>2010-09-13 11:53:53 -0400
commit5e02ee47c0e86986bb21f67a4d6556895de5d0ef (patch)
tree860ba427b58c025cf7923d886480b0d6bbf39ce6
parent345749f514291928913a1ecb280b92daec2c0553 (diff)
downloadnova-5e02ee47c0e86986bb21f67a4d6556895de5d0ef.tar.gz
nova-5e02ee47c0e86986bb21f67a4d6556895de5d0ef.tar.xz
nova-5e02ee47c0e86986bb21f67a4d6556895de5d0ef.zip
Pull S3ImageService out of this mergeprop
-rw-r--r--nova/api/ec2/images.py34
-rw-r--r--nova/image/service.py52
2 files changed, 27 insertions, 59 deletions
diff --git a/nova/api/ec2/images.py b/nova/api/ec2/images.py
index f0be7b899..b5ce2b2cc 100644
--- a/nova/api/ec2/images.py
+++ b/nova/api/ec2/images.py
@@ -29,17 +29,16 @@ import boto.s3.connection
from nova import flags
from nova import utils
from nova.auth import manager
-from nova.image import service
FLAGS = flags.FLAGS
def modify(context, image_id, operation):
- service.S3ImageService(context)._conn().make_request(
+ conn(context).make_request(
method='POST',
bucket='_images',
- query_args=service.qs({'image_id': image_id, 'operation': operation}))
+ query_args=qs({'image_id': image_id, 'operation': operation}))
return True
@@ -48,10 +47,10 @@ def register(context, image_location):
""" rpc call to register a new image based from a manifest """
image_id = utils.generate_uid('ami')
- service.S3ImageService(context)._conn().make_request(
+ conn(context).make_request(
method='PUT',
bucket='_images',
- query_args=service.qs({'image_location': image_location,
+ query_args=qs({'image_location': image_location,
'image_id': image_id}))
return image_id
@@ -62,7 +61,12 @@ def list(context, filter_list=[]):
optionally filtered by a list of image_id """
- result = service.S3ImageService(context).index().values()
+ # FIXME: send along the list of only_images to check for
+ response = conn(context).make_request(
+ method='GET',
+ bucket='_images')
+
+ result = json.loads(response.read())
if not filter_list is None:
return [i for i in result if i['imageId'] in filter_list]
return result
@@ -70,4 +74,20 @@ def list(context, filter_list=[]):
def deregister(context, image_id):
""" unregister an image """
- service.S3ImageService(context).delete(image_id)
+ conn(context).make_request(
+ method='DELETE',
+ bucket='_images',
+ query_args=qs({'image_id': image_id}))
+
+
+def conn(context):
+ access = manager.AuthManager().get_access_key(context.user,
+ context.project)
+ secret = str(context.user.secret)
+ calling = boto.s3.connection.OrdinaryCallingFormat()
+ return boto.s3.connection.S3Connection(aws_access_key_id=access,
+ aws_secret_access_key=secret,
+ is_secure=False,
+ calling_format=calling,
+ port=FLAGS.s3_port,
+ host=FLAGS.s3_host)
diff --git a/nova/image/service.py b/nova/image/service.py
index f6719caec..1a7a258b7 100644
--- a/nova/image/service.py
+++ b/nova/image/service.py
@@ -38,8 +38,6 @@ class ImageService(object):
def show(self, id):
"""
Returns a dict containing image data for the given opaque image id.
-
- Returns None if the id does not exist.
"""
@@ -90,53 +88,3 @@ class LocalImageService(ImageService):
Delete the given image. Raises OSError if the image does not exist.
"""
os.unlink(self._path_to(image_id))
-
-
-# TODO(gundlach): before this can be loaded dynamically in ImageService.load(),
-# we'll have to make __init__() not require a context. Right now it
-# is only used by the AWS API, which hard-codes it, so that's OK.
-class S3ImageService(ImageService):
- """Service that stores images in an S3 provider."""
-
- def __init__(self, context):
- self._context = context
-
- def index(self):
- response = self._conn().make_request(
- method='GET',
- bucket='_images')
- items = json.loads(response.read())
- return dict((item['imageId'], item) for item in items)
-
- def show(self, id):
- response = self._conn().make_request(
- method='GET',
- bucket='_images',
- query_args=qs({'image_id': image_id}))
- return json.loads(response.read())
-
- def delete(self, image_id):
- self._conn().make_request(
- method='DELETE',
- bucket='_images',
- query_args=qs({'image_id': image_id}))
-
- def _conn(self):
- """Return a boto S3Connection to the S3 store."""
- access = manager.AuthManager().get_access_key(self._context.user,
- self._context.project)
- secret = str(self._context.user.secret)
- calling = boto.s3.connection.OrdinaryCallingFormat()
- return boto.s3.connection.S3Connection(aws_access_key_id=access,
- aws_secret_access_key=secret,
- is_secure=False,
- calling_format=calling,
- port=FLAGS.s3_port,
- host=FLAGS.s3_host)
-
-
-def qs(params):
- pairs = []
- for key in params.keys():
- pairs.append(key + '=' + urllib.quote(params[key]))
- return '&'.join(pairs)