From 4db1ffe99374343fe73322d062c7454acf06692b Mon Sep 17 00:00:00 2001 From: Tzu-Mainn Chen Date: Tue, 21 Oct 2014 15:37:41 +0000 Subject: [PATCH] Added image type filter Change-Id: I1294f6eacfbbf717402dd1f7c24374c13de3c311 --- tuskar_ui/infrastructure/flavors/tests.py | 8 +-- tuskar_ui/infrastructure/flavors/workflows.py | 9 +++- tuskar_ui/infrastructure/images/tests.py | 5 +- tuskar_ui/infrastructure/images/views.py | 30 +++--------- tuskar_ui/infrastructure/roles/workflows.py | 4 ++ tuskar_ui/test/test_data/heat_data.py | 49 +++++++++++++++++-- tuskar_ui/utils/utils.py | 10 ++++ 7 files changed, 78 insertions(+), 37 deletions(-) diff --git a/tuskar_ui/infrastructure/flavors/tests.py b/tuskar_ui/infrastructure/flavors/tests.py index a0c5fc2a6..50d22a7bc 100644 --- a/tuskar_ui/infrastructure/flavors/tests.py +++ b/tuskar_ui/infrastructure/flavors/tests.py @@ -48,8 +48,8 @@ def _prepare_create(): 'memory_mb': 1024, 'disk_gb': 40, 'arch': 'amd64', - 'kernel_image_id': images[0].id, - 'ramdisk_image_id': images[1].id} + 'kernel_image_id': images[5].id, + 'ramdisk_image_id': images[4].id} with contextlib.nested( patch('tuskar_ui.api.flavor.Flavor.create', return_value=flavor), @@ -119,8 +119,8 @@ class FlavorsTest(test.BaseAdminViewTests): request = create_mock.call_args_list[0][0][0] self.assertListEqual(create_mock.call_args_list, [ call(request, name=u'foobar', memory=1024, vcpus=3, disk=40, - cpu_arch='amd64', kernel_image_id=images[0].id, - ramdisk_image_id=images[1].id) + cpu_arch='amd64', kernel_image_id=images[5].id, + ramdisk_image_id=images[4].id) ]) def test_create_post_name_exists(self): diff --git a/tuskar_ui/infrastructure/flavors/workflows.py b/tuskar_ui/infrastructure/flavors/workflows.py index a9f8a9e29..88be2dc82 100644 --- a/tuskar_ui/infrastructure/flavors/workflows.py +++ b/tuskar_ui/infrastructure/flavors/workflows.py @@ -21,6 +21,7 @@ from openstack_dashboard.dashboards.admin.flavors import ( workflows as flavor_workflows) from tuskar_ui import api +from tuskar_ui.utils import utils class CreateFlavorAction(flavor_workflows.CreateFlavorInfoAction): @@ -37,12 +38,16 @@ class CreateFlavorAction(flavor_workflows.CreateFlavorInfoAction): try: kernel_images = glance.image_list_detailed( self.request, - filters={'disk_format': 'aki'} )[0] + kernel_images = [image for image in kernel_images + if utils.check_image_type(image, + 'discovery kernel')] ramdisk_images = glance.image_list_detailed( self.request, - filters={'disk_format': 'ari'} )[0] + ramdisk_images = [image for image in ramdisk_images + if utils.check_image_type(image, + 'discovery ramdisk')] except Exception: exceptions.handle(self.request, _('Unable to retrieve images list.')) diff --git a/tuskar_ui/infrastructure/images/tests.py b/tuskar_ui/infrastructure/images/tests.py index 27275d53f..1ac6400ed 100644 --- a/tuskar_ui/infrastructure/images/tests.py +++ b/tuskar_ui/infrastructure/images/tests.py @@ -41,7 +41,8 @@ class ImagesTest(test.BaseAdminViewTests): patch('tuskar_ui.api.tuskar.Plan.list', return_value=plans), patch('openstack_dashboard.api.glance.image_list_detailed', - return_value=[self.images.list(), False, False]),): + return_value=[self.glanceclient_images.list(), + False, False]),): res = self.client.get(INDEX_URL) @@ -103,7 +104,7 @@ class ImagesTest(test.BaseAdminViewTests): self.tuskarclient_roles.list()] plans = [api.tuskar.Plan(plan) for plan in self.tuskarclient_plans.list()] - images = self.images.list() + images = self.glanceclient_images.list() data = {'action': 'images__delete', 'object_ids': [images[0].id, images[1].id]} diff --git a/tuskar_ui/infrastructure/images/views.py b/tuskar_ui/infrastructure/images/views.py index 6dd6fa852..e530031e4 100644 --- a/tuskar_ui/infrastructure/images/views.py +++ b/tuskar_ui/infrastructure/images/views.py @@ -25,6 +25,7 @@ from openstack_dashboard.dashboards.project.images.images import views from tuskar_ui import api as tuskar_api from tuskar_ui.infrastructure.images import forms from tuskar_ui.infrastructure.images import tables +from tuskar_ui.utils import utils LOG = logging.getLogger(__name__) @@ -33,40 +34,21 @@ class IndexView(horizon_tables.DataTableView): table_class = tables.ImagesTable template_name = "infrastructure/images/index.html" - def has_prev_data(self, table): - return self._prev - - def has_more_data(self, table): - return self._more - def get_data(self): images = [] filters = self.get_filters() - prev_marker = self.request.GET.get( - tables.ImagesTable._meta.prev_pagination_param, None) - if prev_marker is not None: - sort_dir = 'asc' - marker = prev_marker - else: - sort_dir = 'desc' - marker = self.request.GET.get( - tables.ImagesTable._meta.pagination_param, None) + sort_dir = 'desc' try: images, self._more, self._prev = api.glance.image_list_detailed( self.request, - marker=marker, - paginate=True, + paginate=False, filters=filters, sort_dir=sort_dir) - - if prev_marker is not None: - images = sorted(images, key=lambda image: - getattr(image, 'created_at'), reverse=True) - + images = [image for image in images + if utils.check_image_type(image, + 'overcloud provisioning')] except Exception: - self._prev = False - self._more = False msg = _('Unable to retrieve image list.') exceptions.handle(self.request, msg) diff --git a/tuskar_ui/infrastructure/roles/workflows.py b/tuskar_ui/infrastructure/roles/workflows.py index 7b1101c11..45067dd4c 100644 --- a/tuskar_ui/infrastructure/roles/workflows.py +++ b/tuskar_ui/infrastructure/roles/workflows.py @@ -21,6 +21,7 @@ from openstack_dashboard.api import glance from tuskar_ui import api from tuskar_ui import forms as tuskar_forms from tuskar_ui.infrastructure.flavors import utils +from tuskar_ui.utils import utils as tuskar_utils class UpdateRoleInfoAction(workflows.Action): @@ -63,6 +64,9 @@ class UpdateRoleInfoAction(workflows.Action): def populate_image_choices(self, request, context): images = glance.image_list_detailed(self.request)[0] + images = [image for image in images + if tuskar_utils.check_image_type(image, + 'overcloud provisioning')] choices = [(i.id, i.name) for i in images] return [('', _('Unknown'))] + choices diff --git a/tuskar_ui/test/test_data/heat_data.py b/tuskar_ui/test/test_data/heat_data.py index c4147e87c..a8aa7135b 100644 --- a/tuskar_ui/test/test_data/heat_data.py +++ b/tuskar_ui/test/test_data/heat_data.py @@ -203,17 +203,56 @@ def data(TEST): image_1 = images.Image( images.ImageManager(None), {'id': '2', - 'name': 'overcloud-control'}) + 'name': 'overcloud-control', + 'is_public': True, + 'protected': False, + 'properties': { + 'type': 'overcloud provisioning' + }}) image_2 = images.Image( images.ImageManager(None), {'id': '1', - 'name': 'overcloud-compute'}) + 'name': 'overcloud-compute', + 'is_public': True, + 'protected': False, + 'properties': { + 'type': 'overcloud provisioning' + }}) image_3 = images.Image( images.ImageManager(None), {'id': '3', - 'name': 'Object Storage Image'}) + 'name': 'Object Storage Image', + 'is_public': True, + 'protected': False, + 'properties': { + 'type': 'overcloud provisioning' + }}) image_4 = images.Image( images.ImageManager(None), {'id': '4', - 'name': 'Block Storage Image'}) - TEST.glanceclient_images.add(image_1, image_2, image_3, image_4) + 'name': 'Block Storage Image', + 'is_public': True, + 'protected': False, + 'properties': { + 'type': 'overcloud provisioning' + }}) + image_5 = images.Image( + images.ImageManager(None), + {'id': '5', + 'name': 'Discovery Ramdisk', + 'is_public': True, + 'protected': False, + 'properties': { + 'type': 'discovery ramdisk' + }}) + image_6 = images.Image( + images.ImageManager(None), + {'id': '6', + 'name': 'Discovery Kernel', + 'is_public': True, + 'protected': False, + 'properties': { + 'type': 'discovery kernel' + }}) + TEST.glanceclient_images.add(image_1, image_2, image_3, image_4, + image_5, image_6) diff --git a/tuskar_ui/utils/utils.py b/tuskar_ui/utils/utils.py index 52f8dc6b9..2e86e2f21 100644 --- a/tuskar_ui/utils/utils.py +++ b/tuskar_ui/utils/utils.py @@ -45,6 +45,16 @@ def length(iterator): return sum(1 for _item in iterator) +def check_image_type(image, type): + """Check if image 'type' property matches passed-in type. + + If image has no 'type' property' return True, as we cannot + be sure what type of image it is. + """ + + return (image.properties.get('type', type) == type) + + def filter_items(items, **kwargs): """Filters the list of items and returns the filtered list.