Merge "Allow v3.0 volume metadata API calls" into stable/ocata
This commit is contained in:
commit
486c00794b
|
@ -23,7 +23,6 @@ import webob
|
||||||
|
|
||||||
from cinder.api.openstack import wsgi
|
from cinder.api.openstack import wsgi
|
||||||
from cinder.api.v2 import volume_metadata as volume_meta_v2
|
from cinder.api.v2 import volume_metadata as volume_meta_v2
|
||||||
from cinder import exception
|
|
||||||
|
|
||||||
|
|
||||||
METADATA_MICRO_VERSION = '3.15'
|
METADATA_MICRO_VERSION = '3.15'
|
||||||
|
@ -42,36 +41,35 @@ class Controller(volume_meta_v2.Controller):
|
||||||
checksum = hashlib.md5(data).hexdigest()
|
checksum = hashlib.md5(data).hexdigest()
|
||||||
return checksum in req.if_match.etags
|
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
|
@wsgi.extends
|
||||||
def index(self, req, volume_id):
|
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)
|
metadata = super(Controller, self).index(req, volume_id)
|
||||||
resp = webob.Response()
|
if req_version.matches(METADATA_MICRO_VERSION):
|
||||||
data = jsonutils.dumps(metadata)
|
data = jsonutils.dumps(metadata)
|
||||||
if six.PY3:
|
if six.PY3:
|
||||||
data = data.encode('utf-8')
|
data = data.encode('utf-8')
|
||||||
resp.headers['Etag'] = hashlib.md5(data).hexdigest()
|
resp = webob.Response()
|
||||||
resp.body = data
|
resp.headers['Etag'] = hashlib.md5(data).hexdigest()
|
||||||
return resp
|
resp.body = data
|
||||||
|
return resp
|
||||||
|
return metadata
|
||||||
|
|
||||||
@wsgi.extends
|
@wsgi.extends
|
||||||
def update(self, req, volume_id, id, body):
|
def update(self, req, volume_id, id, body):
|
||||||
self._ensure_min_version(req, METADATA_MICRO_VERSION)
|
req_version = req.api_version_request
|
||||||
if not self._validate_etag(req, volume_id):
|
if req_version.matches(METADATA_MICRO_VERSION):
|
||||||
return webob.Response(status_int=412)
|
if not self._validate_etag(req, volume_id):
|
||||||
|
return webob.Response(status_int=412)
|
||||||
return super(Controller, self).update(req, volume_id,
|
return super(Controller, self).update(req, volume_id,
|
||||||
id, body)
|
id, body)
|
||||||
|
|
||||||
@wsgi.extends
|
@wsgi.extends
|
||||||
def update_all(self, req, volume_id, body):
|
def update_all(self, req, volume_id, body):
|
||||||
self._ensure_min_version(req, METADATA_MICRO_VERSION)
|
req_version = req.api_version_request
|
||||||
if not self._validate_etag(req, volume_id):
|
if req_version.matches(METADATA_MICRO_VERSION):
|
||||||
return webob.Response(status_int=412)
|
if not self._validate_etag(req, volume_id):
|
||||||
|
return webob.Response(status_int=412)
|
||||||
return super(Controller, self).update_all(req, volume_id,
|
return super(Controller, self).update_all(req, volume_id,
|
||||||
body)
|
body)
|
||||||
|
|
||||||
|
|
|
@ -107,10 +107,10 @@ def return_volume_nonexistent(*args, **kwargs):
|
||||||
raise exception.VolumeNotFound('bogus test message')
|
raise exception.VolumeNotFound('bogus test message')
|
||||||
|
|
||||||
|
|
||||||
class volumeMetaDataTest(test.TestCase):
|
class VolumeMetaDataTest(test.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(volumeMetaDataTest, self).setUp()
|
super(VolumeMetaDataTest, self).setUp()
|
||||||
self.volume_api = volume_api.API()
|
self.volume_api = volume_api.API()
|
||||||
self.mock_object(volume.api.API, 'get', get_volume)
|
self.mock_object(volume.api.API, 'get', get_volume)
|
||||||
self.mock_object(db, 'volume_metadata_get',
|
self.mock_object(db, 'volume_metadata_get',
|
||||||
|
|
|
@ -1,6 +1,3 @@
|
||||||
# Copyright 2016 OpenStack Foundation.
|
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# 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
|
# not use this file except in compliance with the License. You may obtain
|
||||||
# a copy of the License at
|
# a copy of the License at
|
||||||
|
@ -27,6 +24,7 @@ from cinder import exception
|
||||||
from cinder import test
|
from cinder import test
|
||||||
from cinder.tests.unit.api import fakes
|
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 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_constants as fake
|
||||||
from cinder.tests.unit import fake_volume
|
from cinder.tests.unit import fake_volume
|
||||||
from cinder import volume
|
from cinder import volume
|
||||||
|
@ -118,10 +116,10 @@ def fake_update_volume_metadata(self, context, volume, diff):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
class volumeMetaDataTest(test.TestCase):
|
class VolumeMetaDataTest(test.TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
super(volumeMetaDataTest, self).setUp()
|
super(VolumeMetaDataTest, self).setUp()
|
||||||
self.volume_api = volume_api.API()
|
self.volume_api = volume_api.API()
|
||||||
self.mock_object(volume.api.API, 'get', get_volume)
|
self.mock_object(volume.api.API, 'get', get_volume)
|
||||||
self.mock_object(db, 'volume_metadata_get',
|
self.mock_object(db, 'volume_metadata_get',
|
||||||
|
@ -138,7 +136,7 @@ class volumeMetaDataTest(test.TestCase):
|
||||||
self.volume_controller = volumes.VolumeController(self.ext_mgr)
|
self.volume_controller = volumes.VolumeController(self.ext_mgr)
|
||||||
self.controller = volume_metadata.Controller()
|
self.controller = volume_metadata.Controller()
|
||||||
self.req_id = str(uuid.uuid4())
|
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)
|
fake.PROJECT_ID, self.req_id)
|
||||||
|
|
||||||
vol = {"size": 100,
|
vol = {"size": 100,
|
||||||
|
@ -232,3 +230,14 @@ class volumeMetaDataTest(test.TestCase):
|
||||||
expected = {'meta': {'key1': 'value1'}}
|
expected = {'meta': {'key1': 'value1'}}
|
||||||
self.assertEqual(expected, res_dict)
|
self.assertEqual(expected, res_dict)
|
||||||
get_volume.assert_called_once_with(fake_context, self.req_id)
|
get_volume.assert_called_once_with(fake_context, self.req_id)
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
Loading…
Reference in New Issue