summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRadomir Dopieralski <openstack@sheep.art.pl>2013-10-21 15:31:57 +0200
committerRadomir Dopieralski <openstack@sheep.art.pl>2013-10-21 16:41:50 +0200
commitaad35ee759afa5b33de18964b2f8cbec68e52510 (patch)
tree3450335525abee0537d59473c91010fdc1fac055
parentbe56f535889d7454c943238707fbdc5389f7387e (diff)
downloadtuskar-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
-rw-r--r--tuskar_ui/api.py25
-rw-r--r--tuskar_ui/infrastructure/resource_management/resource_classes/tests.py85
-rw-r--r--tuskar_ui/infrastructure/resource_management/resource_classes/views.py9
-rw-r--r--tuskar_ui/infrastructure/resource_management/resource_classes/workflows.py32
-rw-r--r--tuskar_ui/test/api_tests/tuskar_tests.py4
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)