From 484fb9e1c748e718349e451e80a0e025ed007b1d Mon Sep 17 00:00:00 2001 From: Mike Perez Date: Sat, 8 Dec 2012 12:16:43 -0800 Subject: [PATCH] Changing display_name to name in v2 api This allows the v2 api responses to be more consistent with other projects. This approach is making the idea compatible in v2, rather than changing the model. blueprint name-attr-consistency Change-Id: I74e46b4204353d5712be788fe2138784b2a72305 --- cinder/api/v2/views/volumes.py | 4 +- cinder/api/v2/volumes.py | 23 ++++++-- cinder/tests/api/v2/test_volumes.py | 91 +++++++++++++++-------------- 3 files changed, 67 insertions(+), 51 deletions(-) diff --git a/cinder/api/v2/views/volumes.py b/cinder/api/v2/views/volumes.py index 08f5ca201..a30ec0385 100644 --- a/cinder/api/v2/views/volumes.py +++ b/cinder/api/v2/views/volumes.py @@ -44,7 +44,7 @@ class ViewBuilder(common.ViewBuilder): return { 'volume': { 'id': volume['id'], - 'display_name': volume['display_name'], + 'name': volume['display_name'], 'links': self._get_links(request, volume['id']), }, @@ -60,7 +60,7 @@ class ViewBuilder(common.ViewBuilder): 'availability_zone': volume.get('availability_zone'), 'created_at': volume.get('created_at'), 'attachments': self._get_attachments(volume), - 'display_name': volume.get('display_name'), + 'name': volume.get('display_name'), 'display_description': volume.get('display_description'), 'volume_type': self._get_volume_type(volume), 'snapshot_id': volume.get('snapshot_id'), diff --git a/cinder/api/v2/volumes.py b/cinder/api/v2/volumes.py index 90397a15f..cd5ae6963 100644 --- a/cinder/api/v2/volumes.py +++ b/cinder/api/v2/volumes.py @@ -50,7 +50,7 @@ def make_volume(elem): elem.set('size') elem.set('availability_zone') elem.set('created_at') - elem.set('display_name') + elem.set('name') elem.set('display_description') elem.set('volume_type') elem.set('snapshot_id') @@ -96,7 +96,7 @@ class CommonDeserializer(wsgi.MetadataXMLDeserializer): volume = {} volume_node = self.find_first_child_named(node, 'volume') - attributes = ['display_name', 'display_description', 'size', + attributes = ['name', 'display_description', 'size', 'volume_type', 'availability_zone'] for attr in attributes: if volume_node.getAttribute(attr): @@ -178,6 +178,11 @@ class VolumeController(wsgi.Controller): remove_invalid_options(context, search_opts, self._get_volume_search_options()) + # NOTE(thingee): v2 API allows name instead of display_name + if 'name' in search_opts: + search_opts['display_name'] = search_opts['name'] + del search_opts['name'] + volumes = self.volume_api.get_all(context, search_opts=search_opts) limited_list = common.limited(volumes, req) if is_detail: @@ -213,6 +218,11 @@ class VolumeController(wsgi.Controller): kwargs = {} + # NOTE(thingee): v2 API allows name instead of display_name + if volume.get('name'): + volume['display_name'] = volume.get('name') + del volume['name'] + req_volume_type = volume.get('volume_type', None) if req_volume_type: try: @@ -265,7 +275,7 @@ class VolumeController(wsgi.Controller): def _get_volume_search_options(self): """Return volume search options allowed by non-admin.""" - return ('display_name', 'status') + return ('name', 'status') @wsgi.serializers(xml=VolumeTemplate) def update(self, req, id, body): @@ -282,7 +292,7 @@ class VolumeController(wsgi.Controller): update_dict = {} valid_update_keys = ( - 'display_name', + 'name', 'display_description', 'metadata', ) @@ -291,6 +301,11 @@ class VolumeController(wsgi.Controller): if key in volume: update_dict[key] = volume[key] + # NOTE(thingee): v2 API allows name instead of display_name + if 'name' in update_dict: + update_dict['display_name'] = update_dict['name'] + del update_dict['name'] + try: volume = self.volume_api.get(context, id) self.volume_api.update(context, volume, update_dict) diff --git a/cinder/tests/api/v2/test_volumes.py b/cinder/tests/api/v2/test_volumes.py index 21dd25ca5..0e22fcb44 100644 --- a/cinder/tests/api/v2/test_volumes.py +++ b/cinder/tests/api/v2/test_volumes.py @@ -47,7 +47,7 @@ def stub_snapshot_get(self, context, snapshot_id): 'status': 'available', 'volume_size': 100, 'created_at': None, - 'display_name': 'Default name', + 'name': 'Default name', 'display_description': 'Default description', } @@ -72,7 +72,7 @@ class VolumeApiTest(test.TestCase): vol = { "size": 100, - "display_name": "Volume Test Name", + "name": "Volume Test Name", "display_description": "Volume Test Desc", "availability_zone": "zone1:host1" } @@ -81,7 +81,7 @@ class VolumeApiTest(test.TestCase): res_dict = self.controller.create(req, body) expected = { 'volume': { - 'display_name': 'Volume Test Name', + 'name': 'Volume Test Name', 'id': '1', 'links': [ { @@ -107,7 +107,7 @@ class VolumeApiTest(test.TestCase): vol = { "size": 100, - "display_name": "Volume Test Name", + "name": "Volume Test Name", "display_description": "Volume Test Desc", "availability_zone": "zone1:host1", "volume_type": db_vol_type['name'], @@ -127,7 +127,7 @@ class VolumeApiTest(test.TestCase): def test_volume_creation_fails_with_bad_size(self): vol = {"size": '', - "display_name": "Volume Test Name", + "name": "Volume Test Name", "display_description": "Volume Test Desc", "availability_zone": "zone1:host1"} body = {"volume": vol} @@ -141,13 +141,13 @@ class VolumeApiTest(test.TestCase): self.stubs.Set(volume_api.API, "create", stubs.stub_volume_create) self.ext_mgr.extensions = {'os-image-create': 'fake'} vol = {"size": '1', - "display_name": "Volume Test Name", + "name": "Volume Test Name", "display_description": "Volume Test Desc", "availability_zone": "nova", "imageRef": 'c905cedb-7281-47e4-8a62-f26bc5fc4c77'} expected = { 'volume': { - 'display_name': 'Volume Test Name', + 'name': 'Volume Test Name', 'id': '1', 'links': [ { @@ -172,7 +172,7 @@ class VolumeApiTest(test.TestCase): self.ext_mgr.extensions = {'os-image-create': 'fake'} vol = { "size": '1', - "display_name": "Volume Test Name", + "name": "Volume Test Name", "display_description": "Volume Test Desc", "availability_zone": "cinder", "imageRef": 'c905cedb-7281-47e4-8a62-f26bc5fc4c77', @@ -190,7 +190,7 @@ class VolumeApiTest(test.TestCase): self.ext_mgr.extensions = {'os-image-create': 'fake'} vol = { "size": '1', - "display_name": "Volume Test Name", + "name": "Volume Test Name", "display_description": "Volume Test Desc", "availability_zone": "cinder", "imageRef": 1234, @@ -207,7 +207,7 @@ class VolumeApiTest(test.TestCase): self.ext_mgr.extensions = {'os-image-create': 'fake'} vol = { "size": '1', - "display_name": "Volume Test Name", + "name": "Volume Test Name", "display_description": "Volume Test Desc", "availability_zone": "cinder", "imageRef": '12345' @@ -222,7 +222,7 @@ class VolumeApiTest(test.TestCase): def test_volume_update(self): self.stubs.Set(volume_api.API, "update", stubs.stub_volume_update) updates = { - "display_name": "Updated Test Name", + "name": "Updated Test Name", } body = {"volume": updates} req = fakes.HTTPRequest.blank('/v2/volumes/1') @@ -232,7 +232,7 @@ class VolumeApiTest(test.TestCase): 'status': 'fakestatus', 'display_description': 'displaydesc', 'availability_zone': 'fakeaz', - 'display_name': 'Updated Test Name', + 'name': 'Updated Test Name', 'attachments': [ { 'id': '1', @@ -273,7 +273,7 @@ class VolumeApiTest(test.TestCase): 'status': 'fakestatus', 'display_description': 'displaydesc', 'availability_zone': 'fakeaz', - 'display_name': 'displayname', + 'name': 'displayname', 'attachments': [{ 'id': '1', 'volume_id': '1', @@ -308,7 +308,7 @@ class VolumeApiTest(test.TestCase): def test_update_invalid_body(self): body = { - 'display_name': 'missing top level volume key' + 'name': 'missing top level volume key' } req = fakes.HTTPRequest.blank('/v2/volumes/1') self.assertRaises(webob.exc.HTTPUnprocessableEntity, @@ -318,7 +318,7 @@ class VolumeApiTest(test.TestCase): def test_update_not_found(self): self.stubs.Set(volume_api.API, "get", stubs.stub_volume_get_notfound) updates = { - "display_name": "Updated Test Name", + "name": "Updated Test Name", } body = {"volume": updates} req = fakes.HTTPRequest.blank('/v2/volumes/1') @@ -334,7 +334,7 @@ class VolumeApiTest(test.TestCase): expected = { 'volumes': [ { - 'display_name': 'displayname', + 'name': 'displayname', 'id': '1', 'links': [ { @@ -362,7 +362,7 @@ class VolumeApiTest(test.TestCase): 'status': 'fakestatus', 'display_description': 'displaydesc', 'availability_zone': 'fakeaz', - 'display_name': 'displayname', + 'name': 'displayname', 'attachments': [ { 'device': '/', @@ -402,17 +402,18 @@ class VolumeApiTest(test.TestCase): self.stubs.Set(db, 'volume_get_all_by_project', stub_volume_get_all_by_project) - # no display_name filter + # no name filter req = fakes.HTTPRequest.blank('/v2/volumes') resp = self.controller.index(req) self.assertEqual(len(resp['volumes']), 3) - # filter on display_name - req = fakes.HTTPRequest.blank('/v2/volumes?display_name=vol2') + # filter on name + req = fakes.HTTPRequest.blank('/v2/volumes?name=vol2') + #import pdb; pdb.set_trace() resp = self.controller.index(req) self.assertEqual(len(resp['volumes']), 1) - self.assertEqual(resp['volumes'][0]['display_name'], 'vol2') + self.assertEqual(resp['volumes'][0]['name'], 'vol2') # filter no match - req = fakes.HTTPRequest.blank('/v2/volumes?display_name=vol4') + req = fakes.HTTPRequest.blank('/v2/volumes?name=vol4') resp = self.controller.index(req) self.assertEqual(len(resp['volumes']), 0) @@ -442,14 +443,14 @@ class VolumeApiTest(test.TestCase): self.assertEqual(volume['status'], 'available') # multiple filters req = fakes.HTTPRequest.blank('/v2/volumes/details/?status=available&' - 'display_name=vol1') + 'name=vol1') resp = self.controller.detail(req) self.assertEqual(len(resp['volumes']), 1) - self.assertEqual(resp['volumes'][0]['display_name'], 'vol1') + self.assertEqual(resp['volumes'][0]['name'], 'vol1') self.assertEqual(resp['volumes'][0]['status'], 'available') # no match req = fakes.HTTPRequest.blank('/v2/volumes/details?status=in-use&' - 'display_name=vol1') + 'name=vol1') resp = self.controller.detail(req) self.assertEqual(len(resp['volumes']), 0) @@ -461,7 +462,7 @@ class VolumeApiTest(test.TestCase): 'status': 'fakestatus', 'display_description': 'displaydesc', 'availability_zone': 'fakeaz', - 'display_name': 'displayname', + 'name': 'displayname', 'attachments': [ { 'device': '/', @@ -503,7 +504,7 @@ class VolumeApiTest(test.TestCase): 'status': 'fakestatus', 'display_description': 'displaydesc', 'availability_zone': 'fakeaz', - 'display_name': 'displayname', + 'name': 'displayname', 'attachments': [], 'volume_type': 'vol_type_name', 'snapshot_id': None, @@ -582,7 +583,7 @@ class VolumeSerializerTest(test.TestCase): self.assertEqual(tree.tag, NS + 'volume') for attr in ('id', 'status', 'size', 'availability_zone', 'created_at', - 'display_name', 'display_description', 'volume_type', + 'name', 'display_description', 'volume_type', 'snapshot_id'): self.assertEqual(str(vol[attr]), tree.get(attr)) @@ -618,7 +619,7 @@ class VolumeSerializerTest(test.TestCase): device='/foo' ) ], - display_name='vol_name', + name='vol_name', display_description='vol_desc', volume_type='vol_type', snapshot_id='snap_id', @@ -651,7 +652,7 @@ class VolumeSerializerTest(test.TestCase): device='/foo1' ) ], - display_name='vol1_name', + name='vol1_name', display_description='vol1_desc', volume_type='vol1_type', snapshot_id='snap1_id', @@ -667,7 +668,7 @@ class VolumeSerializerTest(test.TestCase): volume_id='vol2_id', server_id='instance_uuid', device='/foo2')], - display_name='vol2_name', + name='vol2_name', display_description='vol2_desc', volume_type='vol2_type', snapshot_id='snap2_id', @@ -702,16 +703,16 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): } self.assertEquals(request['body'], expected) - def test_display_name(self): + def test_name(self): self_request = """ """ + name="Volume-xml">""" request = self.deserializer.deserialize(self_request) expected = { "volume": { "size": "1", - "display_name": "Volume-xml", + "name": "Volume-xml", }, } self.assertEquals(request['body'], expected) @@ -720,13 +721,13 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): self_request = """ """ request = self.deserializer.deserialize(self_request) expected = { "volume": { "size": "1", - "display_name": "Volume-xml", + "name": "Volume-xml", "display_description": "description", }, } @@ -736,15 +737,15 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): self_request = """ """ request = self.deserializer.deserialize(self_request) expected = { "volume": { - "display_name": "Volume-xml", + "name": "Volume-xml", "size": "1", - "display_name": "Volume-xml", + "name": "Volume-xml", "display_description": "description", "volume_type": "289da7f8-6440-407c-9fb4-7db01ec49164", }, @@ -755,7 +756,7 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): self_request = """ """ @@ -763,7 +764,7 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): expected = { "volume": { "size": "1", - "display_name": "Volume-xml", + "name": "Volume-xml", "display_description": "description", "volume_type": "289da7f8-6440-407c-9fb4-7db01ec49164", "availability_zone": "us-east1", @@ -774,13 +775,13 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): def test_metadata(self): self_request = """ work""" request = self.deserializer.deserialize(self_request) expected = { "volume": { - "display_name": "Volume-xml", + "name": "Volume-xml", "size": "1", "metadata": { "Type": "work", @@ -793,7 +794,7 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): self_request = """ @@ -802,7 +803,7 @@ class TestVolumeCreateRequestXMLDeserializer(test.TestCase): expected = { "volume": { "size": "1", - "display_name": "Volume-xml", + "name": "Volume-xml", "display_description": "description", "volume_type": "289da7f8-6440-407c-9fb4-7db01ec49164", "availability_zone": "us-east1", -- 2.45.2