summaryrefslogtreecommitdiffstats
path: root/nova/image
diff options
context:
space:
mode:
authorBrian Waldon <brian.waldon@rackspace.com>2011-09-12 14:29:06 -0400
committerBrian Waldon <brian.waldon@rackspace.com>2011-09-12 14:29:06 -0400
commitd5c4be43c60bcd5fa0fae130ad41f847e28d84fe (patch)
treeb8820ec4b9c127a5a63e1ec60b19db9e9e830cdc /nova/image
parent0611e3fc3165ce916d83b0fa421e6dafa2b2387e (diff)
parent9482275a60ab8caa546ec402f61c60b9f5e7e33f (diff)
merging parent branch lp:~rackspace-titan/nova/glance-client-keystone
Diffstat (limited to 'nova/image')
-rw-r--r--nova/image/__init__.py56
-rw-r--r--nova/image/glance.py91
2 files changed, 71 insertions, 76 deletions
diff --git a/nova/image/__init__.py b/nova/image/__init__.py
index 5447c8a3a..307b73f01 100644
--- a/nova/image/__init__.py
+++ b/nova/image/__init__.py
@@ -16,70 +16,20 @@
# under the License.
-from urlparse import urlparse
-
import nova
-from nova import exception
from nova import utils
from nova import flags
-from nova.image import glance as glance_image_service
+from nova.image import glance
FLAGS = flags.FLAGS
-GlanceClient = utils.import_class('glance.client.Client')
-
-
-def _parse_image_ref(image_href):
- """Parse an image href into composite parts.
-
- :param image_href: href of an image
- :returns: a tuple of the form (image_id, host, port)
- :raises ValueError
-
- """
- o = urlparse(image_href)
- port = o.port or 80
- host = o.netloc.split(':', 1)[0]
- image_id = int(o.path.split('/')[-1])
- return (image_id, host, port)
-
-
def get_default_image_service():
ImageService = utils.import_class(FLAGS.image_service)
return ImageService()
-# FIXME(sirp): perhaps this should be moved to nova/images/glance so that we
-# keep Glance specific code together for the most part
-def get_glance_client(image_href):
- """Get the correct glance client and id for the given image_href.
-
- The image_href param can be an href of the form
- http://myglanceserver:9292/images/42, or just an int such as 42. If the
- image_href is an int, then flags are used to create the default
- glance client.
-
- :param image_href: image ref/id for an image
- :returns: a tuple of the form (glance_client, image_id)
-
- """
- image_href = image_href or 0
- if str(image_href).isdigit():
- glance_host, glance_port = \
- glance_image_service.pick_glance_api_server()
- glance_client = GlanceClient(glance_host, glance_port)
- return (glance_client, int(image_href))
-
- try:
- (image_id, host, port) = _parse_image_ref(image_href)
- except ValueError:
- raise exception.InvalidImageRef(image_href=image_href)
- glance_client = GlanceClient(host, port)
- return (glance_client, image_id)
-
-
-def get_image_service(image_href):
+def get_image_service(context, image_href):
"""Get the proper image_service and id for the given image_href.
The image_href param can be an href of the form
@@ -94,6 +44,6 @@ def get_image_service(image_href):
if str(image_href).isdigit():
return (get_default_image_service(), int(image_href))
- (glance_client, image_id) = get_glance_client(image_href)
+ (glance_client, image_id) = glance.get_glance_client(context, image_href)
image_service = nova.image.glance.GlanceImageService(glance_client)
return (image_service, image_id)
diff --git a/nova/image/glance.py b/nova/image/glance.py
index 804d27fbf..cb07dec02 100644
--- a/nova/image/glance.py
+++ b/nova/image/glance.py
@@ -23,6 +23,7 @@ import copy
import datetime
import json
import random
+from urlparse import urlparse
from glance.common import exception as glance_exception
@@ -41,6 +42,35 @@ FLAGS = flags.FLAGS
GlanceClient = utils.import_class('glance.client.Client')
+def _parse_image_ref(image_href):
+ """Parse an image href into composite parts.
+
+ :param image_href: href of an image
+ :returns: a tuple of the form (image_id, host, port)
+ :raises ValueError
+
+ """
+ o = urlparse(image_href)
+ port = o.port or 80
+ host = o.netloc.split(':', 1)[0]
+ image_id = int(o.path.split('/')[-1])
+ return (image_id, host, port)
+
+
+def _create_glance_client(context, host, port):
+ if context.strategy == 'keystone':
+ # NOTE(dprince): Glance client just needs auth_tok right? Should we
+ # add username and tenant to the creds below?
+ creds={'strategy': 'keystone',
+ 'username': context.user_id,
+ 'tenant': context.project_id}
+ glance_client = GlanceClient(host, port, auth_tok=context.auth_token,
+ creds=creds)
+ else:
+ glance_client = GlanceClient(host, port)
+ return glance_client
+
+
def pick_glance_api_server():
"""Return which Glance API server to use for the request
@@ -56,29 +86,47 @@ def pick_glance_api_server():
return host, port
+def get_glance_client(context, image_href):
+ """Get the correct glance client and id for the given image_href.
+
+ The image_href param can be an href of the form
+ http://myglanceserver:9292/images/42, or just an int such as 42. If the
+ image_href is an int, then flags are used to create the default
+ glance client.
+
+ :param image_href: image ref/id for an image
+ :returns: a tuple of the form (glance_client, image_id)
+
+ """
+ image_href = image_href or 0
+ if str(image_href).isdigit():
+ glance_host, glance_port = pick_glance_api_server()
+ glance_client = _create_glance_client(context, glance_host,
+ glance_port)
+ return (glance_client, int(image_href))
+
+ try:
+ (image_id, host, port) = _parse_image_ref(image_href)
+ except ValueError:
+ raise exception.InvalidImageRef(image_href=image_href)
+ glance_client = _create_glance_client(context, glance_host, glance_port)
+ return (glance_client, image_id)
+
+
class GlanceImageService(object):
"""Provides storage and retrieval of disk image objects within Glance."""
def __init__(self, client=None):
self._client = client
- def _get_client(self):
+ def _get_client(self, context):
# NOTE(sirp): we want to load balance each request across glance
# servers. Since GlanceImageService is a long-lived object, `client`
# is made to choose a new server each time via this property.
if self._client is not None:
return self._client
glance_host, glance_port = pick_glance_api_server()
- return GlanceClient(glance_host, glance_port)
-
- def _set_client(self, client):
- self._client = client
-
- client = property(_get_client, _set_client)
-
- def _set_client_context(self, context):
- """Sets the client's auth token."""
- self.client.set_auth_token(context.auth_token)
+ return _create_glance_client(context, glance_host, glance_port)
def index(self, context, **kwargs):
"""Calls out to Glance for a list of images available."""
@@ -119,14 +167,14 @@ class GlanceImageService(object):
def _get_images(self, context, **kwargs):
"""Get image entitites from images service"""
- self._set_client_context(context)
# ensure filters is a dict
kwargs['filters'] = kwargs.get('filters') or {}
# NOTE(vish): don't filter out private images
kwargs['filters'].setdefault('is_public', 'none')
- return self._fetch_images(self.client.get_images_detailed, **kwargs)
+ client = self._get_client(context)
+ return self._fetch_images(client.get_images_detailed, **kwargs)
def _fetch_images(self, fetch_func, **kwargs):
"""Paginate through results from glance server"""
@@ -159,9 +207,8 @@ class GlanceImageService(object):
def show(self, context, image_id):
"""Returns a dict with image data for the given opaque image id."""
- self._set_client_context(context)
try:
- image_meta = self.client.get_image_meta(image_id)
+ image_meta = self._get_client(context).get_image_meta(image_id)
except glance_exception.NotFound:
raise exception.ImageNotFound(image_id=image_id)
@@ -183,9 +230,9 @@ class GlanceImageService(object):
def get(self, context, image_id, data):
"""Calls out to Glance for metadata and data and writes data."""
- self._set_client_context(context)
try:
- image_meta, image_chunks = self.client.get_image(image_id)
+ client = self._get_client(context)
+ image_meta, image_chunks = client.get_image(image_id)
except glance_exception.NotFound:
raise exception.ImageNotFound(image_id=image_id)
@@ -201,7 +248,6 @@ class GlanceImageService(object):
:raises: AlreadyExists if the image already exist.
"""
- self._set_client_context(context)
# Translate Base -> Service
LOG.debug(_('Creating image in Glance. Metadata passed in %s'),
image_meta)
@@ -209,7 +255,7 @@ class GlanceImageService(object):
LOG.debug(_('Metadata after formatting for Glance %s'),
sent_service_image_meta)
- recv_service_image_meta = self.client.add_image(
+ recv_service_image_meta = self._get_client(context).add_image(
sent_service_image_meta, data)
# Translate Service -> Base
@@ -224,12 +270,12 @@ class GlanceImageService(object):
:raises: ImageNotFound if the image does not exist.
"""
- self._set_client_context(context)
# NOTE(vish): show is to check if image is available
self.show(context, image_id)
image_meta = self._translate_to_glance(image_meta)
try:
- image_meta = self.client.update_image(image_id, image_meta, data)
+ client = self._get_client(context)
+ image_meta = client.update_image(image_id, image_meta, data)
except glance_exception.NotFound:
raise exception.ImageNotFound(image_id=image_id)
@@ -242,11 +288,10 @@ class GlanceImageService(object):
:raises: ImageNotFound if the image does not exist.
"""
- self._set_client_context(context)
# NOTE(vish): show is to check if image is available
self.show(context, image_id)
try:
- result = self.client.delete_image(image_id)
+ result = self._get_client(context).delete_image(image_id)
except glance_exception.NotFound:
raise exception.ImageNotFound(image_id=image_id)
return result