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
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):
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):
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
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):
# 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():
--- /dev/null
+# 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)
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
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):