summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJenkins <jenkins@review.openstack.org>2012-01-16 18:42:00 +0000
committerGerrit Code Review <review@openstack.org>2012-01-16 18:42:00 +0000
commita5e73ffe190f6b42cee592d2d7eceae368c7be1d (patch)
treef2e27ab7ff16fb103dbfcf1b407b198bf5229ad5
parentc50546df8cbf159af13335813d9cb06098645b2c (diff)
parent6e7e3870a4ca047185ba5e3320d63afaa08357b8 (diff)
downloadnova-a5e73ffe190f6b42cee592d2d7eceae368c7be1d.tar.gz
nova-a5e73ffe190f6b42cee592d2d7eceae368c7be1d.tar.xz
nova-a5e73ffe190f6b42cee592d2d7eceae368c7be1d.zip
Merge "Increase robustness of image filtering by server"
-rw-r--r--nova/api/openstack/compute/images.py11
-rw-r--r--nova/api/openstack/compute/servers.py5
-rw-r--r--nova/tests/api/openstack/compute/test_images.py19
-rw-r--r--nova/tests/api/openstack/compute/test_server_actions.py5
-rw-r--r--nova/tests/api/openstack/fakes.py10
5 files changed, 31 insertions, 19 deletions
diff --git a/nova/api/openstack/compute/images.py b/nova/api/openstack/compute/images.py
index 194c5071e..fed326f66 100644
--- a/nova/api/openstack/compute/images.py
+++ b/nova/api/openstack/compute/images.py
@@ -24,6 +24,7 @@ from nova import exception
from nova import flags
import nova.image
from nova import log
+import nova.utils
LOG = log.getLogger('nova.api.openstack.compute.images')
@@ -33,7 +34,7 @@ SUPPORTED_FILTERS = {
'name': 'name',
'status': 'status',
'changes-since': 'changes-since',
- 'server': 'property-instance_ref',
+ 'server': 'property-instance_uuid',
'type': 'property-image_type',
'minRam': 'min_ram',
'minDisk': 'min_disk',
@@ -118,6 +119,14 @@ class Controller(wsgi.Controller):
# map filter name or carry through if property-*
filter_name = SUPPORTED_FILTERS.get(param, param)
filters[filter_name] = req.params.get(param)
+
+ # ensure server filter is the instance uuid
+ filter_name = 'property-instance_uuid'
+ try:
+ filters[filter_name] = filters[filter_name].rsplit('/', 1)[1]
+ except (AttributeError, IndexError, KeyError):
+ pass
+
return filters
@wsgi.serializers(xml=ImageTemplate)
diff --git a/nova/api/openstack/compute/servers.py b/nova/api/openstack/compute/servers.py
index e90e30b7d..3a0cc3683 100644
--- a/nova/api/openstack/compute/servers.py
+++ b/nova/api/openstack/compute/servers.py
@@ -1069,10 +1069,7 @@ class Controller(wsgi.Controller):
msg = _("Malformed createImage entity")
raise exc.HTTPBadRequest(explanation=msg)
- # preserve link to server in image properties
- server_ref = os.path.join(req.application_url, 'servers', id)
- props = {'instance_ref': server_ref}
-
+ props = {}
metadata = entity.get('metadata', {})
common.check_img_metadata_quota_limit(context, metadata)
try:
diff --git a/nova/tests/api/openstack/compute/test_images.py b/nova/tests/api/openstack/compute/test_images.py
index 7bb1d44d9..d8884e934 100644
--- a/nova/tests/api/openstack/compute/test_images.py
+++ b/nova/tests/api/openstack/compute/test_images.py
@@ -823,7 +823,7 @@ class ImagesControllerTest(test.TestCase):
image_service = self.mox.CreateMockAnything()
uuid = 'fa95aaf5-ab3b-4cd8-88c0-2be7dd051aaf'
ref = 'http://localhost:8774/servers/' + uuid
- filters = {'property-instance_ref': ref}
+ filters = {'property-instance_uuid': uuid}
request = fakes.HTTPRequest.blank('/v2/images?server=' + ref)
context = request.environ['nova.context']
image_service.index(context, filters=filters).AndReturn([])
@@ -914,12 +914,25 @@ class ImagesControllerTest(test.TestCase):
controller.detail(request)
self.mox.VerifyAll()
- def test_image_detail_filter_server(self):
+ def test_image_detail_filter_server_href(self):
image_service = self.mox.CreateMockAnything()
uuid = 'fa95aaf5-ab3b-4cd8-88c0-2be7dd051aaf'
ref = 'http://localhost:8774/servers/' + uuid
url = '/v2/fake/images/detail?server=' + ref
- filters = {'property-instance_ref': ref}
+ filters = {'property-instance_uuid': uuid}
+ request = fakes.HTTPRequest.blank(url)
+ context = request.environ['nova.context']
+ image_service.index(context, filters=filters).AndReturn([])
+ self.mox.ReplayAll()
+ controller = images.Controller(image_service=image_service)
+ controller.index(request)
+ self.mox.VerifyAll()
+
+ def test_image_detail_filter_server_uuid(self):
+ image_service = self.mox.CreateMockAnything()
+ uuid = 'fa95aaf5-ab3b-4cd8-88c0-2be7dd051aaf'
+ url = '/v2/fake/images/detail?server=' + uuid
+ filters = {'property-instance_uuid': uuid}
request = fakes.HTTPRequest.blank(url)
context = request.environ['nova.context']
image_service.index(context, filters=filters).AndReturn([])
diff --git a/nova/tests/api/openstack/compute/test_server_actions.py b/nova/tests/api/openstack/compute/test_server_actions.py
index e92816172..ca3094705 100644
--- a/nova/tests/api/openstack/compute/test_server_actions.py
+++ b/nova/tests/api/openstack/compute/test_server_actions.py
@@ -157,7 +157,7 @@ class ServerActionsControllerTest(test.TestCase):
fakes.stub_out_glance(self.stubs)
fakes.stub_out_nw_api(self.stubs)
fakes.stub_out_rate_limiting(self.stubs)
- self.snapshot = fakes.stub_out_compute_api_snapshot(self.stubs)
+ fakes.stub_out_compute_api_snapshot(self.stubs)
service_class = 'nova.image.glance.GlanceImageService'
self.service = utils.import_object(service_class)
self.context = context.RequestContext(1, None)
@@ -579,9 +579,6 @@ class ServerActionsControllerTest(test.TestCase):
location = response.headers['Location']
self.assertEqual('http://localhost/v2/fake/images/123', location)
- server_location = self.snapshot.extra_props_last_call['instance_ref']
- expected_server_location = 'http://localhost/v2/servers/' + self.uuid
- self.assertEqual(expected_server_location, server_location)
def test_create_image_snapshots_disabled(self):
"""Don't permit a snapshot if the allow_instance_snapshots flag is
diff --git a/nova/tests/api/openstack/fakes.py b/nova/tests/api/openstack/fakes.py
index 728b180a8..d96d8289b 100644
--- a/nova/tests/api/openstack/fakes.py
+++ b/nova/tests/api/openstack/fakes.py
@@ -162,18 +162,14 @@ def stub_out_networking(stubs):
stubs.Set(nova.flags, '_get_my_ip', get_my_ip)
-class stub_out_compute_api_snapshot(object):
-
- def __init__(self, stubs):
- self.stubs = stubs
- self.extra_props_last_call = None
- stubs.Set(nova.compute.API, 'snapshot', self.snapshot)
+def stub_out_compute_api_snapshot(stubs):
def snapshot(self, context, instance, name, extra_properties=None):
- self.extra_props_last_call = extra_properties
return dict(id='123', status='ACTIVE', name=name,
properties=extra_properties)
+ stubs.Set(nova.compute.API, 'snapshot', snapshot)
+
class stub_out_compute_api_backup(object):