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
This commit is contained in:
Mike Perez 2012-12-08 12:16:43 -08:00
parent 29b9290cb9
commit 484fb9e1c7
3 changed files with 67 additions and 51 deletions

View 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'),

View 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)

View 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",