summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--nova/api/openstack/create_instance_helper.py6
-rw-r--r--nova/image/glance.py14
-rw-r--r--nova/tests/image/test_glance.py26
3 files changed, 43 insertions, 3 deletions
diff --git a/nova/api/openstack/create_instance_helper.py b/nova/api/openstack/create_instance_helper.py
index fd9247f79..29e071609 100644
--- a/nova/api/openstack/create_instance_helper.py
+++ b/nova/api/openstack/create_instance_helper.py
@@ -94,7 +94,7 @@ class CreateInstanceHelper(object):
try:
image_service, image_id = nova.image.get_image_service(image_href)
kernel_id, ramdisk_id = self._get_kernel_ramdisk_from_image(
- req, image_id)
+ req, image_service, image_id)
images = set([str(x['id']) for x in image_service.index(context)])
assert str(image_id) in images
except Exception, e:
@@ -247,12 +247,12 @@ class CreateInstanceHelper(object):
msg = _("Server name is an empty string")
raise exc.HTTPBadRequest(explanation=msg)
- def _get_kernel_ramdisk_from_image(self, req, image_id):
+ def _get_kernel_ramdisk_from_image(self, req, image_service, image_id):
"""Fetch an image from the ImageService, then if present, return the
associated kernel and ramdisk image IDs.
"""
context = req.environ['nova.context']
- image_meta = self._image_service.show(context, image_id)
+ image_meta = image_service.show(context, image_id)
# NOTE(sirp): extracted to a separate method to aid unit-testing, the
# new method doesn't need a request obj or an ImageService stub
kernel_id, ramdisk_id = self._do_get_kernel_ramdisk_from_image(
diff --git a/nova/image/glance.py b/nova/image/glance.py
index 7233eb18d..80abc7384 100644
--- a/nova/image/glance.py
+++ b/nova/image/glance.py
@@ -280,6 +280,20 @@ class GlanceImageService(service.BaseImageService):
image_meta = _convert_from_string(image_meta)
return image_meta
+ @staticmethod
+ def _is_image_available(context, image_meta):
+ """Check image availability.
+
+ Under Glance, images are always available if the context has
+ an auth_token. Otherwise, we fall back to the superclass
+ method.
+
+ """
+ if hasattr(context, 'auth_token') and context.auth_token:
+ return True
+ return service.BaseImageService._is_image_available(context,
+ image_meta)
+
# utility functions
def _convert_timestamps_to_datetimes(image_meta):
diff --git a/nova/tests/image/test_glance.py b/nova/tests/image/test_glance.py
index 5df25df37..b1ebd8436 100644
--- a/nova/tests/image/test_glance.py
+++ b/nova/tests/image/test_glance.py
@@ -20,6 +20,7 @@ import datetime
import unittest
from nova import context
+from nova import exception
from nova import test
from nova.image import glance
@@ -105,6 +106,31 @@ class TestGlanceImageServiceProperties(BaseGlanceTest):
'properties': {'prop1': 'propvalue1', 'foo': 'bar'}}
self.assertEqual(image_meta, expected)
+ def test_show_raises_when_no_authtoken_in_the_context(self):
+ fixtures = {'image1': {'name': 'image1', 'is_public': False,
+ 'foo': 'bar',
+ 'properties': {'prop1': 'propvalue1'}}}
+ self.client.images = fixtures
+ self.context.auth_token = False
+
+ expected = {'name': 'image1', 'is_public': True,
+ 'properties': {'prop1': 'propvalue1', 'foo': 'bar'}}
+ self.assertRaises(exception.ImageNotFound,
+ self.service.show, self.context, 'image1')
+
+ def test_show_passes_through_to_client_with_authtoken_in_context(self):
+ fixtures = {'image1': {'name': 'image1', 'is_public': False,
+ 'foo': 'bar',
+ 'properties': {'prop1': 'propvalue1'}}}
+ self.client.images = fixtures
+ self.context.auth_token = True
+
+ expected = {'name': 'image1', 'is_public': False,
+ 'properties': {'prop1': 'propvalue1', 'foo': 'bar'}}
+
+ image_meta = self.service.show(self.context, 'image1')
+ self.assertEqual(image_meta, expected)
+
def test_detail_passes_through_to_client(self):
fixtures = {'image1': {'id': '1', 'name': 'image1', 'is_public': True,
'foo': 'bar',