diff options
author | Tzu-Mainn Chen <tzumainn@redhat.com> | 2013-07-23 14:11:02 -0400 |
---|---|---|
committer | Tomas Sedovic <tomas@sedovic.cz> | 2013-08-01 16:18:56 +0200 |
commit | 06bfaffa1726c6a5a76fa272a7da915bad358e68 (patch) | |
tree | e50304668e23ad115e3c6d65c9845d0922807cf2 | |
parent | c7e8b4eb437224f1cf61fa30b2718978333ff586 (diff) | |
download | tuskar-ui-06bfaffa1726c6a5a76fa272a7da915bad358e68.tar.gz |
various API fixes/updates
* updated Flavor to support max_vms through API
* updated tests
* fixed count of flavors on resource class detail
* fixed Flavor capacity retrieval
Change-Id: I08cfad9d8af5b24730d17cdf0a5e5809b45d7f58
6 files changed, 75 insertions, 65 deletions
diff --git a/openstack_dashboard/api/tuskar.py b/openstack_dashboard/api/tuskar.py index f80655ba..be4f690e 100644 --- a/openstack_dashboard/api/tuskar.py +++ b/openstack_dashboard/api/tuskar.py @@ -15,6 +15,7 @@ import copy import logging import re +from collections import namedtuple from datetime import timedelta from random import randint @@ -784,23 +785,20 @@ class FlavorTemplate(StringIdAPIResourceWrapper): class Flavor(StringIdAPIResourceWrapper): """Wrapper for the Flavor object returned by Tuskar. """ - _attrs = ['name'] + _attrs = ['name', 'max_vms'] @classmethod def create(cls, request, resource_class_id, name, max_vms, capacities): return cls(tuskarclient(request).flavors.create( - resource_class_id, name=name, capacities=capacities)) + resource_class_id, + name=name, + max_vms=max_vms, + capacities=capacities)) @classmethod def delete(cls, request, resource_class_id, flavor_id): tuskarclient(request).flavors.delete(resource_class_id, flavor_id) - # FIXME: has to be implemented in API - # https://github.com/tuskar/tuskar/issues/43 - @property - def max_vms(self): - return 2 - # FIXME: returns flavor template for this flavor @property def flavor_template(self): @@ -812,8 +810,13 @@ class Flavor(StringIdAPIResourceWrapper): @property def capacities(self): if not hasattr(self, '_capacities'): - self._capacities = [Capacity(c) for c in - self._apiresource.capacities] + ## FIXME: should we distinguish between tuskar + ## capacities and our internal capacities? + CapacityStruct = namedtuple('CapacityStruct', 'name value unit') + self._capacities = [Capacity(CapacityStruct( + name=c['name'], + value=c['value'], + unit=c['unit'])) for c in self._apiresource.capacities] return self._capacities def capacity(self, capacity_name): diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/flavors/tests.py b/openstack_dashboard/dashboards/infrastructure/resource_management/flavors/tests.py index e0ca0e3b..9ad4b1e2 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/flavors/tests.py +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/flavors/tests.py @@ -9,14 +9,14 @@ from openstack_dashboard.test import helpers as test class FlavorTemplatesTests(test.BaseAdminViewTests): @test.create_stubs({api.tuskar.FlavorTemplate: ('list', 'create')}) - def test_create_flavor(self): - flavor = self.tuskar_flavors.first() + def test_create_flavor_template(self): + template = self.tuskar_flavor_templates.first() api.tuskar.FlavorTemplate.list( IsA(http.HttpRequest)).AndReturn([]) api.tuskar.FlavorTemplate.create(IsA(http.HttpRequest), - flavor.name, - 0, 0, 0, 0, 0).AndReturn(flavor) + template.name, + 0, 0, 0, 0, 0).AndReturn(template) self.mox.ReplayAll() url = reverse( @@ -26,7 +26,7 @@ class FlavorTemplatesTests(test.BaseAdminViewTests): self.assertTemplateUsed( resp, "infrastructure/resource_management/flavors/create.html") - data = {'name': flavor.name, + data = {'name': template.name, 'vcpu': 0, 'ram': 0, 'root_disk': 0, @@ -37,37 +37,37 @@ class FlavorTemplatesTests(test.BaseAdminViewTests): resp, reverse('horizon:infrastructure:resource_management:index')) @test.create_stubs({api.tuskar.FlavorTemplate: ('list', 'update', 'get')}) - def test_edit_flavor_get(self): - flavor = self.tuskar_flavors.first() # has no extra spec + def test_edit_flavor_template_get(self): + template = self.tuskar_flavor_templates.first() # has no extra spec api.tuskar.FlavorTemplate.get(IsA(http.HttpRequest), - flavor.id).AndReturn(flavor) + template.id).AndReturn(template) self.mox.ReplayAll() url = reverse( 'horizon:infrastructure:resource_management:flavors:edit', - args=[flavor.id]) + args=[template.id]) resp = self.client.get(url) self.assertEqual(resp.status_code, 200) self.assertTemplateUsed( resp, "infrastructure/resource_management/flavors/edit.html") @test.create_stubs({api.tuskar.FlavorTemplate: ('list', 'update', 'get')}) - def test_edit_flavor_post(self): - flavor = self.tuskar_flavors.first() # has no extra spec + def test_edit_flavor_template_post(self): + template = self.tuskar_flavor_templates.first() # has no extra spec - api.tuskar.FlavorTemplate.list( - IsA(http.HttpRequest)).AndReturn(self.tuskar_flavors.list()) + api.tuskar.FlavorTemplate.list(IsA(http.HttpRequest)).AndReturn( + self.tuskar_flavor_templates.list()) api.tuskar.FlavorTemplate.update(IsA(http.HttpRequest), - flavor.id, - flavor.name, - 0, 0, 0, 0, 0).AndReturn(flavor) + template.id, + template.name, + 0, 0, 0, 0, 0).AndReturn(template) api.tuskar.FlavorTemplate.get(IsA(http.HttpRequest), - flavor.id).AndReturn(flavor) + template.id).AndReturn(template) self.mox.ReplayAll() - data = {'flavor_id': flavor.id, - 'name': flavor.name, + data = {'flavor_id': template.id, + 'name': template.name, 'vcpu': 0, 'ram': 0, 'root_disk': 0, @@ -75,7 +75,7 @@ class FlavorTemplatesTests(test.BaseAdminViewTests): 'swap_disk': 0} url = reverse( 'horizon:infrastructure:resource_management:flavors:edit', - args=[flavor.id]) + args=[template.id]) resp = self.client.post(url, data) self.assertNoFormErrors(resp) self.assertMessageCount(success=1) @@ -83,15 +83,15 @@ class FlavorTemplatesTests(test.BaseAdminViewTests): resp, reverse('horizon:infrastructure:resource_management:index')) @test.create_stubs({api.tuskar.FlavorTemplate: ('list', 'delete')}) - def test_delete_flavor(self): - flavor = self.tuskar_flavors.first() + def test_delete_flavor_template(self): + template = self.tuskar_flavor_templates.first() api.tuskar.FlavorTemplate.list(IsA(http.HttpRequest)).\ - AndReturn(self.tuskar_flavors.list()) - api.tuskar.FlavorTemplate.delete(IsA(http.HttpRequest), flavor.id) + AndReturn(self.tuskar_flavor_templates.list()) + api.tuskar.FlavorTemplate.delete(IsA(http.HttpRequest), template.id) self.mox.ReplayAll() - form_data = {'action': 'flavors__delete__%s' % flavor.id} + form_data = {'action': 'flavors__delete__%s' % template.id} res = self.client.post( reverse('horizon:infrastructure:resource_management:index'), form_data) @@ -100,11 +100,11 @@ class FlavorTemplatesTests(test.BaseAdminViewTests): res, reverse('horizon:infrastructure:resource_management:index')) @test.create_stubs({api.tuskar.FlavorTemplate: ('get',)}) - def test_detail_flavor(self): - flavor = self.tuskar_flavors.first() + def test_detail_flavor_template(self): + template = self.tuskar_flavor_templates.first() api.tuskar.FlavorTemplate.get(IsA(http.HttpRequest), - flavor.id).AndReturn(flavor) + template.id).AndReturn(template) api.tuskar.FlavorTemplate.resource_classes = self. \ tuskar_resource_classes @@ -112,7 +112,7 @@ class FlavorTemplatesTests(test.BaseAdminViewTests): url = reverse( 'horizon:infrastructure:resource_management:flavors:detail', - args=[flavor.id]) + args=[template.id]) res = self.client.get(url) self.assertTemplateUsed( res, "infrastructure/resource_management/flavors/detail.html") diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tests.py b/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tests.py index 2ae8be93..3679a3fd 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tests.py +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/tests.py @@ -22,15 +22,15 @@ from openstack_dashboard.test import helpers as test class ResourceClassViewTests(test.BaseAdminViewTests): @test.create_stubs({ - api.tuskar.Flavor: ('list',), + api.tuskar.FlavorTemplate: ('list',), api.tuskar.Rack: ('list',) }) def test_create_resource_class_get(self): - all_flavors = self.tuskar_flavors.list() + all_templates = self.tuskar_flavor_templates.list() all_racks = self.tuskar_racks.list() - api.tuskar.Flavor.\ - list(IsA(http.HttpRequest)).AndReturn(all_flavors) + api.tuskar.FlavorTemplate.\ + list(IsA(http.HttpRequest)).AndReturn(all_templates) api.tuskar.Rack.\ list(IsA(http.HttpRequest), True).AndReturn(all_racks) self.mox.ReplayAll() @@ -78,7 +78,8 @@ class ResourceClassViewTests(test.BaseAdminViewTests): ("%s?tab=resource_management_tabs__resource_classes_tab" % reverse("horizon:infrastructure:resource_management:index"))) - @test.create_stubs({api.tuskar.ResourceClass: ('get', 'racks_ids')}) + @test.create_stubs({api.tuskar.ResourceClass: ('get', 'list_flavors', + 'racks_ids')}) def test_edit_resource_class_get(self): resource_class = self.tuskar_resource_classes.first() all_flavors = [] @@ -95,6 +96,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): # properties set api.tuskar.ResourceClass.all_racks = all_racks api.tuskar.ResourceClass.all_flavors = all_flavors + api.tuskar.ResourceClass.list_flavors = all_flavors url = reverse( 'horizon:infrastructure:resource_management:' @@ -194,7 +196,8 @@ class ResourceClassViewTests(test.BaseAdminViewTests): self.assertTemplateUsed(res, 'infrastructure/resource_management/resource_classes/detail.html') - @test.create_stubs({api.tuskar.ResourceClass: ('get', 'racks_ids')}) + @test.create_stubs({api.tuskar.ResourceClass: ('get', 'list_flavors', + 'racks_ids')}) def test_detail_edit_racks_get(self): resource_class = self.tuskar_resource_classes.first() all_flavors = [] @@ -210,6 +213,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): # properties set api.tuskar.ResourceClass.all_racks = all_racks api.tuskar.ResourceClass.all_flavors = all_flavors + api.tuskar.ResourceClass.list_flavors = all_flavors url = reverse( 'horizon:infrastructure:resource_management:' @@ -264,7 +268,8 @@ class ResourceClassViewTests(test.BaseAdminViewTests): reverse(detail_url, args=(resource_class.id,))) self.assertRedirectsNoFollow(res, redirect_url) - @test.create_stubs({api.tuskar.ResourceClass: ('get', 'racks_ids')}) + @test.create_stubs({api.tuskar.ResourceClass: ('get', 'list_flavors', + 'racks_ids')}) def test_detail_edit_flavors_get(self): resource_class = self.tuskar_resource_classes.first() all_flavors = [] @@ -280,6 +285,7 @@ class ResourceClassViewTests(test.BaseAdminViewTests): # properties set api.tuskar.ResourceClass.all_racks = all_racks api.tuskar.ResourceClass.all_flavors = all_flavors + api.tuskar.ResourceClass.list_flavors = all_flavors url = reverse( 'horizon:infrastructure:resource_management:' diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html index e3664beb..7a0db04d 100644 --- a/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html +++ b/openstack_dashboard/dashboards/infrastructure/resource_management/templates/resource_management/resource_classes/_detail_overview.html @@ -20,7 +20,7 @@ <dt>{% trans "Type" %}</dt> <dd>{{ resource_class.service_type }}</dd> <dt>{% trans "Flavors" %}</dt> - <dd>{{ resource_class.flavors|length }}</dd> + <dd>{{ resource_class.list_flavors|length }}</dd> <dt>{% trans "Active Instances" %}</dt> <dd>{{ resource_class.running_virtual_machines|length }}</dd> </dl> diff --git a/openstack_dashboard/test/api_tests/tuskar_tests.py b/openstack_dashboard/test/api_tests/tuskar_tests.py index c5d05207..54350d9f 100644 --- a/openstack_dashboard/test/api_tests/tuskar_tests.py +++ b/openstack_dashboard/test/api_tests/tuskar_tests.py @@ -53,7 +53,7 @@ class TuskarApiTests(test.APITestCase): def test_resource_class_flavor_counts(self): rc = self.tuskar_resource_classes.first() - for f in rc.resource_class_flavors: + for f in rc.list_flavors: self.assertIsInstance(f, api.tuskar.ResourceClassFlavor) self.assertEquals(7, len(rc.resource_class_flavors)) @@ -65,20 +65,21 @@ class TuskarApiTests(test.APITestCase): def test_resource_class_nodes(self): rc = self.tuskar_resource_classes.first() - for node in rc.nodes: + for node in rc.list_nodes: self.assertIsInstance(node, api.tuskar.Node) self.assertEquals(4, len(rc.nodes)) # TODO: create, delete operations - def test_flavor_list(self): - flist = api.tuskar.Flavor.list(self.request) - self.assertEquals(7, len(flist)) - for f in flist: - self.assertIsInstance(f, api.tuskar.Flavor) - - def test_flavor_get(self): - test_flavor = self.tuskar_flavors.first() - flavor = api.tuskar.Flavor.get(self.request, test_flavor.id) - self.assertIsInstance(flavor, api.tuskar.Flavor) - self.assertEquals(flavor.name, test_flavor.name) + def test_flavor_template_list(self): + templates = api.tuskar.FlavorTemplate.list(self.request) + self.assertEquals(7, len(templates)) + for t in templates: + self.assertIsInstance(t, api.tuskar.FlavorTemplate) + + def test_flavor_template_get(self): + test_template = self.tuskar_flavor_templates.first() + template = api.tuskar.FlavorTemplate.get(self.request, + test_template.id) + self.assertIsInstance(template, api.tuskar.FlavorTemplate) + self.assertEquals(template.name, test_template.name) diff --git a/openstack_dashboard/test/test_data/tuskar_data.py b/openstack_dashboard/test/test_data/tuskar_data.py index fb5c85f9..936a2081 100644 --- a/openstack_dashboard/test/test_data/tuskar_data.py +++ b/openstack_dashboard/test/test_data/tuskar_data.py @@ -11,7 +11,7 @@ # under the License. from openstack_dashboard.api.tuskar import ( - Flavor, ResourceClass, Node, + Flavor, FlavorTemplate, ResourceClass, Node, Rack, Capacity) from collections import namedtuple @@ -24,8 +24,8 @@ def data(TEST): FlavorStruct = namedtuple('FlavorStruct', 'id name\ capacities') CapacityStruct = namedtuple('CapacityStruct', 'name value unit') - TEST.tuskar_flavors = TestDataContainer() - flavor_1 = Flavor(FlavorStruct( + TEST.tuskar_flavor_templates = TestDataContainer() + flavor_template_1 = FlavorTemplate(FlavorStruct( id="1", name='m1.tiny', capacities=[ @@ -49,11 +49,11 @@ def data(TEST): name='swap_disk', unit='GB', value='0'))])) - flavor_2 = Flavor(FlavorStruct( + flavor_template_2 = FlavorTemplate(FlavorStruct( id="2", name='m1.large', capacities=[])) - TEST.tuskar_flavors.add(flavor_1, flavor_2) + TEST.tuskar_flavor_templates.add(flavor_template_1, flavor_template_2) # Flavors TEST.tuskar_flavors = TestDataContainer() |