]> review.fuel-infra Code Review - openstack-build/cinder-build.git/commitdiff
Changing display_name to name in v2 api
authorMike Perez <thingee@gmail.com>
Sat, 8 Dec 2012 20:16:43 +0000 (12:16 -0800)
committerMike Perez <thingee@gmail.com>
Sat, 8 Dec 2012 20:21:00 +0000 (12:21 -0800)
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
cinder/api/v2/volumes.py
cinder/tests/api/v2/test_volumes.py

index 08f5ca201ad988035a471dae25eb27300d03e5da..a30ec03858e05b6e399a9ea6e96137f9d2a4fb4e 100644 (file)
@@ -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'),
index 90397a15f196ec136bf0df1dc19877931386bda7..cd5ae6963c32c2d89e100cdc6403e6fde108959a 100644 (file)
@@ -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)
index 21dd25ca5af8045c8d2d20aba2e547be35f42936..0e22fcb4491373ada623fa612a3008563214355d 100644 (file)
@@ -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 = """
 <volume xmlns="http://docs.openstack.org/api/openstack-volume/2.0/content"
         size="1"
-        display_name="Volume-xml"></volume>"""
+        name="Volume-xml"></volume>"""
         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 = """
 <volume xmlns="http://docs.openstack.org/api/openstack-volume/2.0/content"
         size="1"
-        display_name="Volume-xml"
+        name="Volume-xml"
         display_description="description"></volume>"""
         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 = """
 <volume xmlns="http://docs.openstack.org/api/openstack-volume/2.0/content"
         size="1"
-        display_name="Volume-xml"
+        name="Volume-xml"
         display_description="description"
         volume_type="289da7f8-6440-407c-9fb4-7db01ec49164"></volume>"""
         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 = """
 <volume xmlns="http://docs.openstack.org/api/openstack-volume/2.0/content"
         size="1"
-        display_name="Volume-xml"
+        name="Volume-xml"
         display_description="description"
         volume_type="289da7f8-6440-407c-9fb4-7db01ec49164"
         availability_zone="us-east1"></volume>"""
@@ -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 = """
 <volume xmlns="http://docs.openstack.org/api/openstack-volume/2.0/content"
-        display_name="Volume-xml"
+        name="Volume-xml"
         size="1">
         <metadata><meta key="Type">work</meta></metadata></volume>"""
         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 = """
 <volume xmlns="http://docs.openstack.org/api/openstack-volume/2.0/content"
         size="1"
-        display_name="Volume-xml"
+        name="Volume-xml"
         display_description="description"
         volume_type="289da7f8-6440-407c-9fb4-7db01ec49164"
         availability_zone="us-east1">
@@ -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",