Skip to content

Commit

Permalink
Trim volume type representation.
Browse files Browse the repository at this point in the history
Fixes cinder aspect of LP 1027281.

Use view builder pattern to only include non-extraneous
volume type attributes in the representation.

Change-Id: I33f1b579fd6ed4ed98fa04e9148e91eca125213e
  • Loading branch information
Eoghan Glynn committed Jul 26, 2012
1 parent cdaf23e commit 95262bb
Show file tree
Hide file tree
Showing 4 changed files with 93 additions and 4 deletions.
5 changes: 4 additions & 1 deletion cinder/api/openstack/volume/contrib/types_manage.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

from cinder.api.openstack import extensions
from cinder.api.openstack.volume import types
from cinder.api.openstack.volume.views import types as views_types
from cinder.api.openstack import wsgi
from cinder import exception
from cinder.volume import volume_types
Expand All @@ -32,6 +33,8 @@
class VolumeTypesManageController(wsgi.Controller):
""" The volume types API controller for the OpenStack API """

_view_builder_class = views_types.ViewBuilder

@wsgi.action("create")
@wsgi.serializers(xml=types.VolumeTypeTemplate)
def _create(self, req, body):
Expand Down Expand Up @@ -60,7 +63,7 @@ def _create(self, req, body):
except exception.NotFound:
raise webob.exc.HTTPNotFound()

return {'volume_type': vol_type}
return self._view_builder.show(req, vol_type)

@wsgi.action("delete")
def _delete(self, req, id):
Expand Down
10 changes: 7 additions & 3 deletions cinder/api/openstack/volume/types.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@

from cinder.api.openstack import wsgi
from cinder.api.openstack import xmlutil
from cinder.api.openstack.volume.views import types as views_types
from cinder import exception
from cinder.volume import volume_types

Expand Down Expand Up @@ -48,14 +49,17 @@ def construct(self):
return xmlutil.MasterTemplate(root, 1)


class VolumeTypesController(object):
class VolumeTypesController(wsgi.Controller):
""" The volume types API controller for the OpenStack API """

_view_builder_class = views_types.ViewBuilder

@wsgi.serializers(xml=VolumeTypesTemplate)
def index(self, req):
""" Returns the list of volume types """
context = req.environ['cinder.context']
return {'volume_types': volume_types.get_all_types(context).values()}
vol_types = volume_types.get_all_types(context).values()
return self._view_builder.index(req, vol_types)

@wsgi.serializers(xml=VolumeTypeTemplate)
def show(self, req, id):
Expand All @@ -69,7 +73,7 @@ def show(self, req, id):

# TODO(bcwaldon): remove str cast once we use uuids
vol_type['id'] = str(vol_type['id'])
return {'volume_type': vol_type}
return self._view_builder.show(req, vol_type)


def create_resource():
Expand Down
34 changes: 34 additions & 0 deletions cinder/api/openstack/volume/views/types.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# vim: tabstop=4 shiftwidth=4 softtabstop=4

# Copyright 2012 Red Hat, Inc.
# All Rights Reserved.
#
# 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
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.

from cinder.api.openstack import common


class ViewBuilder(common.ViewBuilder):

def show(self, request, volume_type, brief=False):
"""Trim away extraneous volume type attributes."""
trimmed = dict(id=volume_type.get('id'),
name=volume_type.get('name'),
extra_specs=volume_type.get('extra_specs'))
return trimmed if brief else dict(volume_type=trimmed)

def index(self, request, volume_types):
"""Index over trimmed volume types"""
volume_types_list = [self.show(request, volume_type, True)
for volume_type in volume_types]
return dict(volume_types=volume_types_list)
48 changes: 48 additions & 0 deletions cinder/tests/api/openstack/volume/test_types.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,10 @@
from lxml import etree
import webob

from cinder.api.openstack.volume.views import types as views_types
from cinder.api.openstack.volume import types
from cinder import exception
from cinder.openstack.common import timeutils
from cinder import test
from cinder.volume import volume_types
from cinder.tests.api.openstack import fakes
Expand Down Expand Up @@ -103,6 +105,52 @@ def test_volume_types_show_not_found(self):
self.assertRaises(webob.exc.HTTPNotFound, self.controller.show,
req, '777')

def test_view_builder_show(self):
view_builder = views_types.ViewBuilder()

now = timeutils.isotime()
raw_volume_type = dict(name='new_type',
deleted=False,
created_at=now,
updated_at=now,
extra_specs={},
deleted_at=None,
id=42)

request = fakes.HTTPRequest.blank("/v2")
output = view_builder.show(request, raw_volume_type)

self.assertTrue('volume_type' in output)
expected_volume_type = dict(name='new_type',
extra_specs={},
id=42)
self.assertDictMatch(output['volume_type'], expected_volume_type)

def test_view_builder_list(self):
view_builder = views_types.ViewBuilder()

now = timeutils.isotime()
raw_volume_types = []
for i in range(0, 10):
raw_volume_types.append(dict(name='new_type',
deleted=False,
created_at=now,
updated_at=now,
extra_specs={},
deleted_at=None,
id=42 + i))

request = fakes.HTTPRequest.blank("/v2")
output = view_builder.index(request, raw_volume_types)

self.assertTrue('volume_types' in output)
for i in range(0, 10):
expected_volume_type = dict(name='new_type',
extra_specs={},
id=42 + i)
self.assertDictMatch(output['volume_types'][i],
expected_volume_type)


class VolumeTypesSerializerTest(test.TestCase):
def _verify_volume_type(self, vtype, tree):
Expand Down

0 comments on commit 95262bb

Please sign in to comment.