From 6140b025d4e3abe35cfb742a9836c7551414cd2c Mon Sep 17 00:00:00 2001 From: Tzu-Mainn Chen Date: Fri, 8 Aug 2014 21:56:42 +0200 Subject: [PATCH] Add role column to image table Change-Id: If53a1fd8c679cb8b2c5794cd19b3016968d1401e --- tuskar_ui/api/tuskar.py | 25 +++++++++++++++++++++++ tuskar_ui/infrastructure/images/tables.py | 3 +++ tuskar_ui/infrastructure/images/views.py | 10 ++++++++- tuskar_ui/test/api_tests/tuskar_tests.py | 13 ++++++++++++ 4 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tuskar_ui/api/tuskar.py b/tuskar_ui/api/tuskar.py index e21cb70ea..45f97a481 100644 --- a/tuskar_ui/api/tuskar.py +++ b/tuskar_ui/api/tuskar.py @@ -218,6 +218,31 @@ class OvercloudRole(base.APIDictWrapper): if role.id == role_id: return role + @classmethod + @handle_errors(_("Unable to retrieve overcloud role")) + def get_by_image(cls, request, plan, image): + """Return the Tuskar OvercloudRole whose ImageID + parameter matches the passed in image + + :param request: request object + :type request: django.http.HttpRequest + + :param plan: associated plan to check against + :type plan: OvercloudPlan + + :param image: image to be matched + :type image: Image + + :return: matching OvercloudRole, or None if no matching + OvercloudRole can be found + :rtype: tuskar_ui.api.tuskar.OvercloudRole + """ + for role in OvercloudRole.list(request): + image_id_from_plan = plan.parameter_value( + role.image_id_parameter_name) + if image_id_from_plan == image.id: + return role + # TODO(tzumainn): fix this once we know how a role corresponds to # its provider resource type @property diff --git a/tuskar_ui/infrastructure/images/tables.py b/tuskar_ui/infrastructure/images/tables.py index 7451521a9..716e66a36 100644 --- a/tuskar_ui/infrastructure/images/tables.py +++ b/tuskar_ui/infrastructure/images/tables.py @@ -23,6 +23,9 @@ class ImagesTable(tables.DataTable): verbose_name=_("Image Name")) disk_format = tables.Column('disk_format', verbose_name=_("Format")) + role = tables.Column(lambda image: + image.role.name if image.role else '-', + verbose_name=_("Deployment Role")) class Meta: name = "images" diff --git a/tuskar_ui/infrastructure/images/views.py b/tuskar_ui/infrastructure/images/views.py index 6f5ff421c..59baea2b4 100644 --- a/tuskar_ui/infrastructure/images/views.py +++ b/tuskar_ui/infrastructure/images/views.py @@ -15,6 +15,8 @@ from horizon import tables as horizon_tables from openstack_dashboard.api import glance + +from tuskar_ui import api from tuskar_ui.infrastructure.images import tables @@ -23,4 +25,10 @@ class IndexView(horizon_tables.DataTableView): template_name = "infrastructure/images/index.html" def get_data(self): - return glance.image_list_detailed(self.request)[0] + plan = api.tuskar.OvercloudPlan.get_the_plan(self.request) + images = glance.image_list_detailed(self.request)[0] + # TODO(tzumainn): re-architect a bit to avoid inefficiency + for image in images: + image.role = api.tuskar.OvercloudRole.get_by_image( + self.request, plan, image) + return images diff --git a/tuskar_ui/test/api_tests/tuskar_tests.py b/tuskar_ui/test/api_tests/tuskar_tests.py index 472e13420..001458d16 100644 --- a/tuskar_ui/test/api_tests/tuskar_tests.py +++ b/tuskar_ui/test/api_tests/tuskar_tests.py @@ -82,3 +82,16 @@ class TuskarAPITests(test.APITestCase): ret_val = api.tuskar.OvercloudRole.get(self.request, role['id']) self.assertIsInstance(ret_val, api.tuskar.OvercloudRole) + + def test_role_get_by_image(self): + plan = api.tuskar.OvercloudPlan(self.tuskarclient_plans.first()) + image = self.glanceclient_images.first() + roles = [api.tuskar.OvercloudRole(role) for role in + self.tuskarclient_roles.list()] + + with patch('tuskar_ui.api.tuskar.OvercloudRole.list', + return_value=roles): + ret_val = api.tuskar.OvercloudRole.get_by_image( + self.request, plan, image) + self.assertIsInstance(ret_val, api.tuskar.OvercloudRole) + self.assertEqual(ret_val.name, 'Controller')