Fix some problem for attachment list

This patch fix some problem below:

1. attachment list for detail doesn't work.
2. filter doesn't work
3. sort_keys, sort_dirs,  marker, limit, offset doesn't work.

Closes-bug: #1658646
Change-Id: Id0fcf289cb6600594c653cc9ba8536194284ffd3
This commit is contained in:
wangxiyuan
2017-01-23 15:27:47 +08:00
parent a998c3acc0
commit d7997d30e6
2 changed files with 95 additions and 5 deletions
+7 -5
View File
@@ -52,16 +52,16 @@ class AttachmentsController(wsgi.Controller):
@wsgi.Controller.api_version(API_VERSION)
def index(self, req):
"""Return a summary list of attachments."""
attachments = self._items(req, detailed=False)
attachments = self._items(req)
return attachment_views.ViewBuilder.list(attachments)
@wsgi.Controller.api_version(API_VERSION)
def detail(self, req):
"""Return a detailed list of attachments."""
attachments = self._items(req)
return attachment_views.ViewBuilder.list(req, attachments)
return attachment_views.ViewBuilder.list(attachments, detail=True)
def _items(self, req, detailed=True):
def _items(self, req):
"""Return a list of attachments, transformed through view builder."""
context = req.environ['cinder.context']
@@ -69,7 +69,7 @@ class AttachmentsController(wsgi.Controller):
search_opts = req.GET.copy()
sort_keys, sort_dirs = common.get_sort_params(search_opts)
marker, limit, offset = common.get_pagination_params(search_opts)
filters = dict(req.GET)
filters = search_opts
allowed = self.allowed_filters
if not allowed.issuperset(filters):
invalid_keys = set(filters).difference(allowed)
@@ -83,7 +83,9 @@ class AttachmentsController(wsgi.Controller):
search_opts['instance_uuid'] = search_opts.get('instance_id')
utils.remove_invalid_filter_options(context, search_opts,
allowed_search_options)
return objects.VolumeAttachmentList.get_all(context)
return objects.VolumeAttachmentList.get_all(
context, search_opts=search_opts, marker=marker, limit=limit,
offset=offset, sort_keys=sort_keys, sort_direction=sort_dirs)
@wsgi.Controller.api_version(API_VERSION)
@wsgi.response(202)
@@ -21,6 +21,8 @@ import ddt
import webob
from cinder.api.v3 import attachments as v3_attachments
from cinder import context
from cinder import objects
from cinder import test
from cinder.tests.unit.api import fakes
from cinder.tests.unit import fake_constants as fake
@@ -37,6 +39,38 @@ class AttachmentsAPITestCase(test.TestCase):
super(AttachmentsAPITestCase, self).setUp()
self.controller = v3_attachments.AttachmentsController()
self.volume_api = volume_api.API()
self.ctxt = context.RequestContext(fake.USER_ID, fake.PROJECT_ID,
auth_token=True,
is_admin=True)
self.attachment1 = self._create_attachement(
volume_uuid=fake.VOLUME_ID, instance_uuid=fake.UUID1)
self.attachment2 = self._create_attachement(
volume_uuid=fake.VOLUME2_ID, instance_uuid=fake.UUID1)
self.attachment3 = self._create_attachement(
volume_uuid=fake.VOLUME3_ID, instance_uuid=fake.UUID2)
self.addCleanup(self._cleanup)
def _cleanup(self):
self.attachment1.destroy()
self.attachment2.destroy()
self.attachment3.destroy()
def _create_attachement(self, ctxt=None, volume_uuid=None,
instance_uuid=None, mountpoint=None,
attach_time=None, detach_time=None,
attach_status=None, attach_mode=None):
"""Create a attachement object."""
ctxt = ctxt or self.ctxt
attachment = objects.VolumeAttachment(ctxt)
attachment.volume_id = volume_uuid
attachment.instance_uuid = instance_uuid
attachment.mountpoint = mountpoint
attachment.attach_time = attach_time
attachment.detach_time = detach_time
attachment.attach_status = attach_status or 'reserved'
attachment.attach_mode = attach_mode
attachment.create()
return attachment
@ddt.data("instance_uuid", "volume_uuid")
def test_create_attachment_without_resource_uuid(self, resource_uuid):
@@ -53,3 +87,57 @@ class AttachmentsAPITestCase(test.TestCase):
self.assertRaises(webob.exc.HTTPBadRequest,
self.controller.create, req, body)
@ddt.data(False, True)
def test_list_attachments(self, is_detail):
url = '/v3/%s/attachments' % fake.PROJECT_ID
list_func = self.controller.index
if is_detail:
url = '/v3/%s/groups/detail' % fake.PROJECT_ID
list_func = self.controller.detail
req = fakes.HTTPRequest.blank(url, version=ATTACHMENTS_MICRO_VERSION,
use_admin_context=True)
res_dict = list_func(req)
self.assertEqual(1, len(res_dict))
self.assertEqual(3, len(res_dict['attachments']))
self.assertEqual(self.attachment3.id,
res_dict['attachments'][0]['id'])
def test_list_attachments_with_limit(self):
url = '/v3/%s/attachments?limit=1' % fake.PROJECT_ID
req = fakes.HTTPRequest.blank(url, version=ATTACHMENTS_MICRO_VERSION,
use_admin_context=True)
res_dict = self.controller.index(req)
self.assertEqual(1, len(res_dict))
self.assertEqual(1, len(res_dict['attachments']))
def test_list_attachments_with_marker(self):
url = '/v3/%s/attachments?marker=%s' % (fake.PROJECT_ID,
self.attachment3.id)
req = fakes.HTTPRequest.blank(url, version=ATTACHMENTS_MICRO_VERSION,
use_admin_context=True)
res_dict = self.controller.index(req)
self.assertEqual(1, len(res_dict))
self.assertEqual(2, len(res_dict['attachments']))
self.assertEqual(self.attachment2.id,
res_dict['attachments'][0]['id'])
@ddt.data("desc", "asc")
def test_list_attachments_with_sort(self, sort_dir):
url = '/v3/%s/attachments?sort_key=id&sort_dir=%s' % (fake.PROJECT_ID,
sort_dir)
req = fakes.HTTPRequest.blank(url, version=ATTACHMENTS_MICRO_VERSION,
use_admin_context=True)
res_dict = self.controller.index(req)
self.assertEqual(1, len(res_dict))
self.assertEqual(3, len(res_dict['attachments']))
order_ids = sorted([self.attachment1.id,
self.attachment2.id,
self.attachment3.id])
expect_result = order_ids[2] if sort_dir == "desc" else order_ids[0]
self.assertEqual(expect_result,
res_dict['attachments'][0]['id'])