diff options
author | Radomir Dopieralski <openstack@sheep.art.pl> | 2013-10-21 15:31:57 +0200 |
---|---|---|
committer | Radomir Dopieralski <openstack@sheep.art.pl> | 2013-10-21 16:41:50 +0200 |
commit | aad35ee759afa5b33de18964b2f8cbec68e52510 (patch) | |
tree | 3450335525abee0537d59473c91010fdc1fac055 | |
parent | be56f535889d7454c943238707fbdc5389f7387e (diff) | |
download | tuskar-ui-aad35ee759afa5b33de18964b2f8cbec68e52510.tar.gz |
Updated hardcoded images during resource class creation
The resource class creation form no longer ignores the image selection.
The list of images is taken from Glance, and the selection is passed on
to tuskar API.
Change-Id: Iec302e0f2a5e05772dfb1a6c0bfe2c4d15744eb5
Closes-bug: #1238060
Closes-bug: #1233087
5 files changed, 116 insertions, 39 deletions
diff --git a/tuskar_ui/api.py b/tuskar_ui/api.py index b8eb12ca..90a5de87 100644 --- a/tuskar_ui/api.py +++ b/tuskar_ui/api.py @@ -558,7 +558,7 @@ class ResourceClass(StringIdAPIResourceWrapper): """Wrapper for the ResourceClass object returned by the dummy model. """ - _attrs = ['id', 'name', 'service_type', 'racks'] + _attrs = ['id', 'name', 'service_type', 'image_id', 'racks'] @classmethod def get(cls, request, resource_class_id): @@ -567,12 +567,13 @@ class ResourceClass(StringIdAPIResourceWrapper): return rc @classmethod - def create(self, request, **kwargs): + def create(self, request, name, service_type, image_id, flavors): return ResourceClass( tuskarclient(request).resource_classes.create( - name=kwargs['name'], - service_type=kwargs['service_type'], - flavors=kwargs['flavors'])) + name=name, + service_type=service_type, + image_id=image_id, + flavors=flavors)) @classmethod def list(cls, request): @@ -580,16 +581,20 @@ class ResourceClass(StringIdAPIResourceWrapper): tuskarclient(request).resource_classes.list())] @classmethod - ## FIXME : kwargs here is a little dicey - def update(cls, request, resource_class_id, **kwargs): - resource_class = cls(tuskarclient(request).resource_classes. - update(resource_class_id, **kwargs)) + def update(cls, request, resource_class_id, name, service_type, image_id, + flavors): + resource_class = cls(tuskarclient(request).resource_classes.update( + resource_class_id, + name=name, + service_type=service_type, + image_id=image_id, + flavors=flavors)) ## FIXME: flavors have to be updated separately, seems less than ideal for flavor_id in resource_class.flavors_ids: Flavor.delete(request, resource_class_id=resource_class.id, flavor_id=flavor_id) - for flavor in kwargs['flavors']: + for flavor in flavors: Flavor.create(request, resource_class_id=resource_class.id, **flavor) diff --git a/tuskar_ui/infrastructure/resource_management/resource_classes/tests.py b/tuskar_ui/infrastructure/resource_management/resource_classes/tests.py index d9f77c45..7e9645a8 100644 --- a/tuskar_ui/infrastructure/resource_management/resource_classes/tests.py +++ b/tuskar_ui/infrastructure/resource_management/resource_classes/tests.py @@ -18,20 +18,30 @@ from django.utils import simplejson import mox +from openstack_dashboard.api import glance +from openstack_dashboard.test.test_data import glance_data + from tuskar_ui import api as tuskar from tuskar_ui.test import helpers as test class ResourceClassViewTests(test.BaseAdminViewTests): + def setUp(self): + super(ResourceClassViewTests, self).setUp() + # Add the .images attribute for testing glance api call + glance_data.data(self) @test.create_stubs({ tuskar.Rack: ('list',), - tuskar.ResourceClass: ('get',) + tuskar.ResourceClass: ('get',), + glance: ('image_list_detailed',), }) def test_create_resource_class_get(self): all_racks = self.tuskar_racks.list() rc = self.tuskar_resource_classes.first() + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.Rack.list( mox.IsA(http.HttpRequest), True).AndReturn(all_racks) tuskar.ResourceClass.get( @@ -47,14 +57,18 @@ class ResourceClassViewTests(test.BaseAdminViewTests): @test.create_stubs({ tuskar.ResourceClass: ('list', 'create', 'set_racks'), tuskar.Rack: ('list',), + glance: ('image_list_detailed',), }) def test_create_resource_class_post(self): new_resource_class = self.tuskar_resource_classes.first() new_unique_name = "unique_name_for_sure" new_flavors = [] + image_id = self.images.list()[0].id add_racks_ids = [] + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.Rack.list( mox.IsA(http.HttpRequest), True).AndReturn([]) tuskar.ResourceClass.list( @@ -64,6 +78,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): mox.IsA(http.HttpRequest), name=new_unique_name, service_type=new_resource_class.service_type, + image_id=image_id, flavors=new_flavors).AndReturn(new_resource_class) tuskar.ResourceClass.set_racks(mox.IsA(http.HttpRequest), add_racks_ids) @@ -75,7 +90,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): form_data = { 'name': new_unique_name, 'service_type': new_resource_class.service_type, - 'image': 'compute-img', + 'image_id': image_id, 'flavors-TOTAL_FORMS': 0, 'flavors-INITIAL_FORMS': 0, 'flavors-MAX_NUM_FORMS': 1000, @@ -96,12 +111,16 @@ class ResourceClassViewTests(test.BaseAdminViewTests): @test.create_stubs({ tuskar.ResourceClass: ('list', 'create', 'set_racks'), tuskar.Rack: ('list',), + glance: ('image_list_detailed',), }) def test_create_resource_class_post_exception(self): new_resource_class = self.tuskar_resource_classes.first() new_unique_name = "unique_name_for_sure" new_flavors = [] + image_id = self.images.list()[0].id + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.Rack.list( mox.IsA(http.HttpRequest), True).AndReturn([]) tuskar.ResourceClass.list( @@ -110,6 +129,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): tuskar.ResourceClass.\ create(mox.IsA(http.HttpRequest), name=new_unique_name, service_type=new_resource_class.service_type, + image_id=image_id, flavors=new_flavors).\ AndRaise(self.exceptions.tuskar) self.mox.ReplayAll() @@ -120,7 +140,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): form_data = { 'name': new_unique_name, 'service_type': new_resource_class.service_type, - 'image': 'compute-img', + 'image_id': image_id, 'flavors-TOTAL_FORMS': 0, 'flavors-INITIAL_FORMS': 0, 'flavors-MAX_NUM_FORMS': 1000, @@ -134,13 +154,18 @@ class ResourceClassViewTests(test.BaseAdminViewTests): urlresolvers. reverse("horizon:infrastructure:resource_management:index"))) - @test.create_stubs({tuskar.ResourceClass: ('get', 'list_flavors', - 'racks_ids', 'all_racks')}) + @test.create_stubs({ + tuskar.ResourceClass: ('get', 'list_flavors', 'racks_ids', + 'all_racks'), + glance: ('image_list_detailed',), + }) def test_edit_resource_class_get(self): resource_class = self.tuskar_resource_classes.first() all_flavors = [] all_racks = [] + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.ResourceClass.get( mox.IsA(http.HttpRequest), resource_class.id).AndReturn(resource_class) @@ -170,8 +195,11 @@ class ResourceClassViewTests(test.BaseAdminViewTests): res = self.client.get(url) self.assertEqual(res.status_code, 200) - @test.create_stubs({tuskar.ResourceClass: ('get', 'list_flavors', - 'racks_ids', 'all_racks')}) + @test.create_stubs({ + tuskar.ResourceClass: ('get', 'list_flavors', + 'racks_ids', 'all_racks'), + glance: ('image_list_detailed',), + }) def test_edit_resource_class_get_exception(self): resource_class = self.tuskar_resource_classes.first() @@ -194,12 +222,16 @@ class ResourceClassViewTests(test.BaseAdminViewTests): tuskar.ResourceClass: ('get', 'list', 'update', 'set_racks', 'list_flavors', 'all_racks', 'racks_ids'), tuskar.Rack: ('list',), + glance: ('image_list_detailed',), }) def test_edit_resource_class_post(self): resource_class = self.tuskar_resource_classes.first() + image_id = self.images.list()[0].id add_racks_ids = [] + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.ResourceClass.get( mox.IsA(http.HttpRequest), resource_class.id).AndReturn( resource_class) @@ -219,6 +251,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): resource_class.id, name=resource_class.name, service_type=resource_class.service_type, + image_id=image_id, flavors=[]).AndReturn(resource_class) tuskar.ResourceClass.set_racks(mox.IsA(http.HttpRequest), add_racks_ids) @@ -228,7 +261,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): 'resource_class_id': resource_class.id, 'name': resource_class.name, 'service_type': resource_class.service_type, - 'image': 'compute-img', + 'image_id': image_id, 'flavors-TOTAL_FORMS': 0, 'flavors-INITIAL_FORMS': 0, 'flavors-MAX_NUM_FORMS': 1000, @@ -413,13 +446,18 @@ class ResourceClassViewTests(test.BaseAdminViewTests): res, urlresolvers.reverse( 'horizon:infrastructure:resource_management:index')) - @test.create_stubs({tuskar.ResourceClass: ('get', 'list_flavors', - 'racks_ids', 'all_racks')}) + @test.create_stubs({ + tuskar.ResourceClass: ('get', 'list_flavors', + 'racks_ids', 'all_racks'), + glance: ('image_list_detailed',), + }) def test_detail_edit_racks_get(self): resource_class = self.tuskar_resource_classes.first() all_flavors = [] all_racks = [] + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.ResourceClass.get(mox.IsA(http.HttpRequest), resource_class.id).\ AndReturn(resource_class) @@ -451,13 +489,16 @@ class ResourceClassViewTests(test.BaseAdminViewTests): @test.create_stubs({ tuskar.ResourceClass: ('get', 'list', 'update', 'set_racks', - 'list_flavors', 'all_racks', 'racks_ids') + 'list_flavors', 'all_racks', 'racks_ids'), + glance: ('image_list_detailed',), }) def test_detail_edit_racks_post(self): resource_class = self.tuskar_resource_classes.first() - + image_id = self.images.list()[0].id add_racks_ids = [] + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.ResourceClass.get( mox.IsA(http.HttpRequest), resource_class.id).AndReturn( resource_class) @@ -477,6 +518,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): resource_class.id, name=resource_class.name, service_type=resource_class.service_type, + image_id=image_id, flavors=[]).AndReturn(resource_class) tuskar.ResourceClass.set_racks(mox.IsA(http.HttpRequest), add_racks_ids) @@ -486,7 +528,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): 'resource_class_id': resource_class.id, 'name': resource_class.name, 'service_type': resource_class.service_type, - 'image': 'compute-img', + 'image_id': image_id, 'flavors-TOTAL_FORMS': 0, 'flavors-INITIAL_FORMS': 0, 'flavors-MAX_NUM_FORMS': 1000, @@ -509,13 +551,18 @@ class ResourceClassViewTests(test.BaseAdminViewTests): urlresolvers.reverse(detail_url, args=(resource_class.id,))) self.assertRedirectsNoFollow(res, redirect_url) - @test.create_stubs({tuskar.ResourceClass: ('get', 'list_flavors', - 'racks_ids', 'all_racks')}) + @test.create_stubs({ + tuskar.ResourceClass: ('get', 'list_flavors', + 'racks_ids', 'all_racks'), + glance: ('image_list_detailed',), + }) def test_detail_edit_flavors_get(self): resource_class = self.tuskar_resource_classes.first() all_flavors = [] all_racks = [] + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.ResourceClass.get(mox.IsA(http.HttpRequest), resource_class.id).\ AndReturn(resource_class) @@ -549,12 +596,15 @@ class ResourceClassViewTests(test.BaseAdminViewTests): tuskar.ResourceClass: ('get', 'list', 'update', 'set_racks', 'list_flavors', 'all_racks', 'racks_ids'), tuskar.Rack: ('list',), + glance: ('image_list_detailed',), }) def test_detail_edit_flavors_post(self): resource_class = self.tuskar_resource_classes.first() - + image_id = self.images.list()[0].id add_racks_ids = [] + glance.image_list_detailed(mox.IsA(http.HttpRequest)).AndReturn( + (self.images.list(), False)) tuskar.ResourceClass.get( mox.IsA(http.HttpRequest), resource_class.id).AndReturn( resource_class) @@ -574,6 +624,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): resource_class.id, name=resource_class.name, service_type=resource_class.service_type, + image_id=image_id, flavors=[]).AndReturn(resource_class) tuskar.ResourceClass.set_racks(mox.IsA(http.HttpRequest), add_racks_ids) @@ -583,7 +634,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): 'resource_class_id': resource_class.id, 'name': resource_class.name, 'service_type': resource_class.service_type, - 'image': 'compute-img', + 'image_id': image_id, 'flavors-TOTAL_FORMS': 0, 'flavors-INITIAL_FORMS': 0, 'flavors-MAX_NUM_FORMS': 1000, diff --git a/tuskar_ui/infrastructure/resource_management/resource_classes/views.py b/tuskar_ui/infrastructure/resource_management/resource_classes/views.py index 0dd05ffa..cafd6a08 100644 --- a/tuskar_ui/infrastructure/resource_management/resource_classes/views.py +++ b/tuskar_ui/infrastructure/resource_management/resource_classes/views.py @@ -72,9 +72,12 @@ class UpdateView(horizon_workflows.WorkflowView): def get_initial(self): resource_class = self._get_object() - return {'resource_class_id': resource_class.id, - 'name': resource_class.name, - 'service_type': resource_class.service_type} + return { + 'resource_class_id': resource_class.id, + 'name': resource_class.name, + 'service_type': resource_class.service_type, + 'image_id': resource_class.image_id, + } class DetailUpdateView(UpdateView): diff --git a/tuskar_ui/infrastructure/resource_management/resource_classes/workflows.py b/tuskar_ui/infrastructure/resource_management/resource_classes/workflows.py index 987b7ca3..17fd3af3 100644 --- a/tuskar_ui/infrastructure/resource_management/resource_classes/workflows.py +++ b/tuskar_ui/infrastructure/resource_management/resource_classes/workflows.py @@ -19,14 +19,14 @@ from django.utils.translation import ugettext_lazy as _ # noqa from horizon import exceptions from horizon import forms from horizon import workflows +from openstack_dashboard.api import glance from tuskar_ui import api as tuskar -import tuskar_ui.workflows - from tuskar_ui.infrastructure.resource_management.flavors\ import forms as flavors_forms from tuskar_ui.infrastructure.resource_management.resource_classes\ import tables +import tuskar_ui.workflows class ResourceClassInfoAndFlavorsAction(workflows.Action): @@ -49,12 +49,24 @@ class ResourceClassInfoAndFlavorsAction(workflows.Action): widget=forms.Select( attrs={'class': 'switchable'}) ) - image = forms.ChoiceField(label=_('Provisioning Image'), - required=True, - choices=[('compute-img', ('overcloud-compute'))], - widget=forms.Select( - attrs={'class': 'switchable'}) - ) + image_id = forms.ChoiceField( + label=_('Provisioning Image'), + required=True, + choices=[], + widget=forms.Select(attrs={'class': 'switchable'}), + ) + + def __init__(self, *args, **kwargs): + super(ResourceClassInfoAndFlavorsAction, + self).__init__(*args, **kwargs) + try: + images, more = glance.image_list_detailed(self.request) + except Exception: + exceptions.handle(self.request, + _('Unable to retrieve image list.')) + else: + self.fields['image_id'].choices = [ + (image.id, image.name) for image in images] def clean(self): cleaned_data = super(ResourceClassInfoAndFlavorsAction, @@ -104,7 +116,7 @@ class CreateResourceClassInfoAndFlavors(tuskar_ui.workflows.TableStep): action_class = ResourceClassInfoAndFlavorsAction template_name = 'infrastructure/resource_management/resource_classes/'\ '_resource_class_info_and_flavors_step.html' - contributes = ("name", "service_type", "flavors") + contributes = ("name", "service_type", "image_id", "flavors") def get_flavors_data(self): try: @@ -246,6 +258,7 @@ class CreateResourceClass(ResourceClassWorkflowMixin, workflows.Workflow): request, name=data['name'], service_type=data['service_type'], + image_id=data['image_id'], flavors=flavors) except Exception: redirect = self.get_failure_url() @@ -289,6 +302,7 @@ class UpdateResourceClass(ResourceClassWorkflowMixin, workflows.Workflow): data['resource_class_id'], name=data['name'], service_type=data['service_type'], + image_id=data['image_id'], flavors=flavors) except Exception: redirect = self.get_failure_url() diff --git a/tuskar_ui/test/api_tests/tuskar_tests.py b/tuskar_ui/test/api_tests/tuskar_tests.py index 574ad079..b9bb3982 100644 --- a/tuskar_ui/test/api_tests/tuskar_tests.py +++ b/tuskar_ui/test/api_tests/tuskar_tests.py @@ -253,12 +253,14 @@ class TuskarApiTests(test.APITestCase): tuskarclient.resource_classes = self.mox.CreateMockAnything() tuskarclient.resource_classes.create(name='rclass1', service_type='compute', + image_id=None, flavors=[]).AndReturn(rc) self.mox.ReplayAll() ret_val = api.ResourceClass.create(self.request, name='rclass1', service_type='compute', + image_id=None, flavors=[]) self.assertIsInstance(ret_val, api.ResourceClass) @@ -271,6 +273,7 @@ class TuskarApiTests(test.APITestCase): tuskarclient.resource_classes.update(rc.id, name='rclass1', service_type='compute', + image_id=None, flavors=[]).AndReturn(rc) tuskarclient.flavors.list(rc.id).AndReturn([]) self.mox.ReplayAll() @@ -278,6 +281,7 @@ class TuskarApiTests(test.APITestCase): ret_val = api.ResourceClass.update(self.request, rc.id, name='rclass1', service_type='compute', + image_id=None, flavors=[]) self.assertIsInstance(ret_val, api.ResourceClass) |