Disable Metadata write operations on v1.1

This is the first step towards removing metadata completely from the
API. This is temporary until we decided whether we will remove read
operations too.

Partially-Implements: api-v1.1-remove-queue-metadata

Change-Id: I18b8b7a9284b37d866dec7ab1f8117dc779431f8
This commit is contained in:
Flavio Percoco 2014-04-16 16:20:21 +02:00
parent 80befb5b9c
commit 23fa8e80c7
3 changed files with 73 additions and 53 deletions

View File

@ -14,15 +14,12 @@
# limitations under the License.
import falcon
import six
from marconi.openstack.common.gettextutils import _
import marconi.openstack.common.log as logging
from marconi.queues.storage import errors as storage_errors
from marconi.queues.transport import utils
from marconi.queues.transport import validation
from marconi.queues.transport.wsgi import errors as wsgi_errors
from marconi.queues.transport.wsgi import utils as wsgi_utils
LOG = logging.getLogger(__name__)
@ -63,34 +60,8 @@ class Resource(object):
u'project: %(project)s',
{'queue': queue_name, 'project': project_id})
try:
# Place JSON size restriction before parsing
self._validate.queue_metadata_length(req.content_length)
except validation.ValidationFailed as ex:
LOG.debug(ex)
raise wsgi_errors.HTTPBadRequestAPI(six.text_type(ex))
# Deserialize queue metadata
metadata, = wsgi_utils.filter_stream(req.stream,
req.content_length,
spec=None)
try:
self.queue_ctrl.set_metadata(queue_name,
metadata=metadata,
project=project_id)
except validation.ValidationFailed as ex:
LOG.debug(ex)
raise wsgi_errors.HTTPBadRequestAPI(six.text_type(ex))
except storage_errors.QueueDoesNotExist:
raise falcon.HTTPNotFound()
except Exception as ex:
LOG.exception(ex)
description = _(u'Metadata could not be updated.')
raise wsgi_errors.HTTPServiceUnavailable(description)
resp.status = falcon.HTTP_204
resp.status = falcon.HTTP_405
resp.location = req.path
resp.body = ("Queue's metadata has been deprecated. "
"It will be removed completely in the next "
"version of the API.")

View File

@ -27,6 +27,15 @@ class QueueLifecycleBaseTest(base.TestBase):
config_file = None
# NOTE(flaper87): This is temporary. Ideally, each version
# of the API should have its own lifecycle tests. The v1.1
# of our API removes the support for the API. Although most of
# the test methods were overwritten in the test definition, there
# are some that need to be disabled in-lieu for other tests to be
# excuted. Also, ddt plays dirty and makes it impossible to override
# a test case.
metadata_support = True
def setUp(self):
super(QueueLifecycleBaseTest, self).setUp()
@ -73,17 +82,18 @@ class QueueLifecycleBaseTest(base.TestBase):
self.assertEqual(self.srmock.status, falcon.HTTP_204)
# Add metadata
doc = '{"messages": {"ttl": 600}}'
self.simulate_put(gumshoe_queue_path_metadata,
project_id, body=doc)
self.assertEqual(self.srmock.status, falcon.HTTP_204)
if self.metadata_support:
doc = '{"messages": {"ttl": 600}}'
self.simulate_put(gumshoe_queue_path_metadata,
project_id, body=doc)
self.assertEqual(self.srmock.status, falcon.HTTP_204)
# Fetch metadata
result = self.simulate_get(gumshoe_queue_path_metadata,
project_id)
result_doc = json.loads(result[0])
self.assertEqual(self.srmock.status, falcon.HTTP_200)
self.assertEqual(result_doc, json.loads(doc))
# Fetch metadata
result = self.simulate_get(gumshoe_queue_path_metadata,
project_id)
result_doc = json.loads(result[0])
self.assertEqual(self.srmock.status, falcon.HTTP_200)
self.assertEqual(result_doc, json.loads(doc))
# Stats empty queue
self.simulate_get(gumshoe_queue_path_stats, project_id)
@ -102,8 +112,9 @@ class QueueLifecycleBaseTest(base.TestBase):
self.assertEqual(self.srmock.status, falcon.HTTP_404)
# Get non-existent metadata
self.simulate_get(gumshoe_queue_path_metadata, project_id)
self.assertEqual(self.srmock.status, falcon.HTTP_404)
if self.metadata_support:
self.simulate_get(gumshoe_queue_path_metadata, project_id)
self.assertEqual(self.srmock.status, falcon.HTTP_404)
def test_name_restrictions(self):
self.simulate_put(self.queue_path + '/Nice-Boat_2')
@ -158,6 +169,9 @@ class QueueLifecycleBaseTest(base.TestBase):
@ddt.data('{', '[]', '.', ' ', '')
def test_bad_metadata(self, document):
if not self.metadata_support:
return
self.simulate_put(self.fizbat_queue_path, '7e55e1a7e')
self.assertEqual(self.srmock.status, falcon.HTTP_201)
@ -261,7 +275,8 @@ class QueueLifecycleBaseTest(base.TestBase):
def create_queue(name, project_id, body):
uri = self.queue_path + '/' + name
self.simulate_put(uri, project_id)
self.simulate_put(uri + '/metadata', project_id, body=body)
if self.metadata_support:
self.simulate_put(uri + '/metadata', project_id, body=body)
create_queue('g1', None, '{"answer": 42}')
create_queue('g2', None, '{"answer": 42}')
@ -280,8 +295,9 @@ class QueueLifecycleBaseTest(base.TestBase):
queues = result_doc['queues']
self.assertEqual(len(queues), 2)
for queue in queues:
self.assertEqual(queue['metadata'], {'answer': 42})
if self.metadata_support:
for queue in queues:
self.assertEqual(queue['metadata'], {'answer': 42})
# List (limit)
result = self.simulate_get(self.queue_path, project_id,
@ -322,11 +338,12 @@ class QueueLifecycleBaseTest(base.TestBase):
result_doc = json.loads(result[0])
[target, params] = result_doc['links'][0]['href'].split('?')
queue = result_doc['queues'][0]
result = self.simulate_get(queue['href'] + '/metadata', project_id)
result_doc = json.loads(result[0])
self.assertEqual(result_doc, queue['metadata'])
self.assertEqual(result_doc, {'node': 31})
if self.metadata_support:
queue = result_doc['queues'][0]
result = self.simulate_get(queue['href'] + '/metadata', project_id)
result_doc = json.loads(result[0])
self.assertEqual(result_doc, queue['metadata'])
self.assertEqual(result_doc, {'node': 31})
# List tail
self.simulate_get(target, project_id, query_string=params)

View File

@ -76,10 +76,42 @@ class TestQueueFaultyDriver(wsgi.TestQueueFaultyDriver):
# sort of a pain; is there a better way?
class TestQueueLifecycleMongoDB(wsgi.TestQueueLifecycleMongoDB):
url_prefix = URL_PREFIX
metadata_support = False
def test_no_metadata(self):
"""Metadata deprecated."""
def test_too_much_metadata(self):
"""Metadata deprecated."""
def test_way_too_much_metadata(self):
"""Metadata deprecated."""
def test_custom_metadata(self):
"""Metadata deprecated."""
def test_update_metadata(self):
"""Metadata deprecated."""
class TestQueueLifecycleSqlalchemy(wsgi.TestQueueLifecycleSqlalchemy):
url_prefix = URL_PREFIX
metadata_support = False
def test_no_metadata(self):
"""Metadata deprecated."""
def test_too_much_metadata(self):
"""Metadata deprecated."""
def test_way_too_much_metadata(self):
"""Metadata deprecated."""
def test_custom_metadata(self):
"""Metadata deprecated."""
def test_update_metadata(self):
"""Metadata deprecated."""
class TestShardsMongoDB(wsgi.TestShardsMongoDB):