diff --git a/cinder/api/v3/volume_metadata.py b/cinder/api/v3/volume_metadata.py index 37cd7787c9d..91f8d7d6f7a 100644 --- a/cinder/api/v3/volume_metadata.py +++ b/cinder/api/v3/volume_metadata.py @@ -24,7 +24,6 @@ import webob from cinder.api.openstack import wsgi from cinder.api.v2 import volume_metadata as volume_meta_v2 -from cinder import exception METADATA_MICRO_VERSION = '3.15' @@ -43,36 +42,37 @@ class Controller(volume_meta_v2.Controller): checksum = hashlib.md5(data).hexdigest() return checksum in req.if_match.etags - def _ensure_min_version(self, req, allowed_version): - version = req.api_version_request - if not version.matches(allowed_version, None): - raise exception.VersionNotFoundForAPIMethod(version=version) - @wsgi.extends def index(self, req, volume_id): - self._ensure_min_version(req, METADATA_MICRO_VERSION) + req_version = req.api_version_request metadata = super(Controller, self).index(req, volume_id) - resp = webob.Response() - data = jsonutils.dumps(metadata) - if six.PY3: - data = data.encode('utf-8') - resp.headers['Etag'] = hashlib.md5(data).hexdigest() - resp.body = data - return resp + if req_version.matches(METADATA_MICRO_VERSION): + data = jsonutils.dumps(metadata) + if six.PY3: + data = data.encode('utf-8') + resp = webob.Response() + resp.headers['Etag'] = hashlib.md5(data).hexdigest() + resp.body = data + return resp + return metadata @wsgi.extends def update(self, req, volume_id, id, body): - self._ensure_min_version(req, METADATA_MICRO_VERSION) - if not self._validate_etag(req, volume_id): - return webob.Response(status_int=http_client.PRECONDITION_FAILED) + req_version = req.api_version_request + if req_version.matches(METADATA_MICRO_VERSION): + if not self._validate_etag(req, volume_id): + return webob.Response( + status_int=http_client.PRECONDITION_FAILED) return super(Controller, self).update(req, volume_id, id, body) @wsgi.extends def update_all(self, req, volume_id, body): - self._ensure_min_version(req, METADATA_MICRO_VERSION) - if not self._validate_etag(req, volume_id): - return webob.Response(status_int=http_client.PRECONDITION_FAILED) + req_version = req.api_version_request + if req_version.matches(METADATA_MICRO_VERSION): + if not self._validate_etag(req, volume_id): + return webob.Response( + status_int=http_client.PRECONDITION_FAILED) return super(Controller, self).update_all(req, volume_id, body) diff --git a/cinder/tests/unit/api/v2/test_volume_metadata.py b/cinder/tests/unit/api/v2/test_volume_metadata.py index b0730001efa..2689022763a 100644 --- a/cinder/tests/unit/api/v2/test_volume_metadata.py +++ b/cinder/tests/unit/api/v2/test_volume_metadata.py @@ -108,10 +108,10 @@ def return_volume_nonexistent(*args, **kwargs): raise exception.VolumeNotFound('bogus test message') -class volumeMetaDataTest(test.TestCase): +class VolumeMetaDataTest(test.TestCase): def setUp(self): - super(volumeMetaDataTest, self).setUp() + super(VolumeMetaDataTest, self).setUp() self.volume_api = volume_api.API() self.mock_object(volume.api.API, 'get', get_volume) self.mock_object(db, 'volume_metadata_get', diff --git a/cinder/tests/unit/api/v3/test_volume_metadata.py b/cinder/tests/unit/api/v3/test_volume_metadata.py index 80864755340..a1ac313f962 100644 --- a/cinder/tests/unit/api/v3/test_volume_metadata.py +++ b/cinder/tests/unit/api/v3/test_volume_metadata.py @@ -1,6 +1,3 @@ -# Copyright 2016 OpenStack Foundation. -# 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 @@ -28,6 +25,7 @@ from cinder import exception from cinder import test from cinder.tests.unit.api import fakes from cinder.tests.unit.api.v2 import fakes as v2_fakes +from cinder.tests.unit.api.v2 import test_volume_metadata as v2_test from cinder.tests.unit import fake_constants as fake from cinder.tests.unit import fake_volume from cinder import volume @@ -119,10 +117,10 @@ def fake_update_volume_metadata(self, context, volume, diff): pass -class volumeMetaDataTest(test.TestCase): +class VolumeMetaDataTest(test.TestCase): def setUp(self): - super(volumeMetaDataTest, self).setUp() + super(VolumeMetaDataTest, self).setUp() self.volume_api = volume_api.API() self.mock_object(volume.api.API, 'get', get_volume) self.mock_object(db, 'volume_metadata_get', @@ -139,7 +137,7 @@ class volumeMetaDataTest(test.TestCase): self.volume_controller = volumes.VolumeController(self.ext_mgr) self.controller = volume_metadata.Controller() self.req_id = str(uuid.uuid4()) - self.url = '/v2/%s/volumes/%s/metadata' % ( + self.url = '/v3/%s/volumes/%s/metadata' % ( fake.PROJECT_ID, self.req_id) vol = {"size": 100, @@ -255,3 +253,14 @@ class volumeMetaDataTest(test.TestCase): self.assertRaises(webob.exc.HTTPBadRequest, self.controller.create, req, self.req_id, body) + + +class VolumeMetaDataTestNoMicroversion(v2_test.VolumeMetaDataTest): + """Volume metadata tests with no microversion provided.""" + + def setUp(self): + super(VolumeMetaDataTestNoMicroversion, self).setUp() + self.volume_controller = volumes.VolumeController(self.ext_mgr) + self.controller = volume_metadata.Controller() + self.url = '/v3/%s/volumes/%s/metadata' % ( + fake.PROJECT_ID, self.req_id)