summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJan Provaznik <jprovazn@redhat.com>2013-07-19 12:13:04 +0200
committerTomas Sedovic <tomas@sedovic.cz>2013-08-01 16:18:56 +0200
commitb17f99f6527a456225b66ac506996cf4a195996e (patch)
tree344d802e4ce9219d6bd452d3b287cdfc43c49fe0
parent278fda2679c5ebe2ac025bcd98884d799eeb3dfb (diff)
downloadtuskar-ui-b17f99f6527a456225b66ac506996cf4a195996e.tar.gz
API integration
fixed various rack and resource class methods. 3 tests are failing: 2 flavors/nodes related tests (out of scope of this patch) 1 rack test - 'list_racks' method is unknown for test data - will look at this later Change-Id: Ia9bf3b3311ce04906e6f70a6f49a61a50db1fe45
-rw-r--r--openstack_dashboard/api/tuskar.py103
-rw-r--r--openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/workflows.py3
-rw-r--r--openstack_dashboard/test/api_tests/tuskar_tests.py10
-rw-r--r--openstack_dashboard/test/test_data/tuskar_data.py20
4 files changed, 62 insertions, 74 deletions
diff --git a/openstack_dashboard/api/tuskar.py b/openstack_dashboard/api/tuskar.py
index 31ad2e01..3289ab65 100644
--- a/openstack_dashboard/api/tuskar.py
+++ b/openstack_dashboard/api/tuskar.py
@@ -221,61 +221,51 @@ class Rack(StringIdAPIResourceWrapper):
_attrs = ['id', 'name', 'location', 'subnet', 'nodes']
@classmethod
- def create(cls, request, name, resource_class_id, location, subnet):
- ## FIXME: Where is the location attribute?? Also, set nodes
- ## here
+ def create(cls, request, name, resource_class_id, location, subnet,
+ nodes=[]):
+ ## FIXME: set nodes here
rack = tuskarclient(request).racks.create(
name=name,
- #location=location,
+ location=location,
subnet=subnet,
- nodes=[],
+ nodes=nodes,
+ resource_class={'id': resource_class_id},
slots=0)
-
- ## FIXME: it would be optimal if we didn't have to make a separate
- ## call for this. racks= also needs to be fixed
- ## ALSO it doesn't seem to work, I can't get it to work using curl
- ## from the command line
- #rc = ResourceClass.get(request, resource_class_id)
- #ResourceClass.update(request, resource_class_id,
- # name=rc.name,
- # service_type=rc.service_type,
- # racks={"id": rack.id})
-
return cls(rack)
@classmethod
def update(cls, request, rack_id, kwargs):
- return cls(tuskarclient(request).racks.update(rack_id,
+ ## FIXME: set nodes here
+ rack = tuskarclient(request).racks.update(rack_id,
name=kwargs['name'],
- #location=location,
+ location=kwargs['location'],
subnet=kwargs['subnet'],
- nodes=[],
- slots=0))
+ # FIXME: set nodes
+ #nodes=kwargs['nodes'],
+ resource_class={'id': kwargs['resource_class_id']},
+ slots=0)
+ return cls(rack)
@classmethod
def list(cls, request, only_free_racks=False):
- ## FIXME: currently resource_class is not an attribute of a rack; can
- ## that be changed? If so, we can do free_racks much more easily
if only_free_racks:
return [Rack(r) for r in
- tuskarclient(request).racks.list()]
+ tuskarclient(request).racks.list() if (
+ r.resource_class is None)]
else:
return [Rack(r) for r in
tuskarclient(request).racks.list()]
@classmethod
def get(cls, request, rack_id):
- return cls(tuskarclient(request).racks.get(rack_id))
+ rack = cls(tuskarclient(request).racks.get(rack_id))
+ rack.set_request(request)
+ return rack
- ## FIXME: this is temporary
@property
def resource_class_id(self):
- return 1
-
- ## FIXME: as is this
- @property
- def location(self):
- return "somewhere"
+ rclass = getattr(self._apiresource, 'resource_class', None)
+ return rclass['id'] if rclass else None
@property
def capacities(self):
@@ -390,7 +380,7 @@ class Rack(StringIdAPIResourceWrapper):
#return self._nodes
def nodes_count(self):
- return len(self.list_nodes)
+ return len(self._apiresource.nodes)
# The idea here is to take a list of MAC addresses and assign them to
# our rack. I'm attaching this here so that we can take one list, versus
@@ -417,22 +407,21 @@ class Rack(StringIdAPIResourceWrapper):
@property
def resource_class(self):
if not hasattr(self, '_resource_class'):
- self._resource_class = self._apiresource.resource_class
+ rclass = getattr(self._apiresource, 'resource_class', None)
+ if rclass:
+ self._resource_class = ResourceClass.get(self.request,
+ rclass['id'])
+ else:
+ self._resource_class = None
return self._resource_class
-##########################################################################
-# ResourceClass
-##########################################################################
class ResourceClass(StringIdAPIResourceWrapper):
"""Wrapper for the ResourceClass object returned by the
dummy model.
"""
- _attrs = ['name', 'service_type', 'racks']
+ _attrs = ['id', 'name', 'service_type', 'racks']
- ##########################################################################
- # ResourceClass Class methods
- ##########################################################################
@classmethod
def get(cls, request, resource_class_id):
rc = cls(tuskarclient(request).resource_classes.get(resource_class_id))
@@ -460,21 +449,19 @@ class ResourceClass(StringIdAPIResourceWrapper):
def delete(cls, request, resource_class_id):
tuskarclient(request).resource_classes.delete(resource_class_id)
- ##########################################################################
- # ResourceClass Properties
- ##########################################################################
@property
def racks_ids(self):
""" List of unicode ids of racks added to resource class """
return [
- unicode(rack.id) for rack in (
- self.racks)]
+ unicode(rack['id']) for rack in (
+ self._apiresource.racks)]
@property
def list_racks(self):
""" List of racks added to ResourceClass """
if not hasattr(self, '_racks'):
- self._racks = [Rack(r) for r in self.racks]
+ self._racks = [Rack.get(self.request, rid) for rid in (
+ self.racks_ids)]
return self._racks
@property
@@ -486,7 +473,7 @@ class ResourceClass(StringIdAPIResourceWrapper):
[r for r in (
Rack.list(self.request)) if (
r.resource_class_id is None or
- r.resource_class_id == self.id)]
+ str(r.resource_class_id) == self.id)]
return self._all_racks
@property
@@ -663,10 +650,6 @@ class ResourceClass(StringIdAPIResourceWrapper):
self._vm_capacity = Capacity(vm_capacity)
return self._vm_capacity
- ##########################################################################
- # ResourceClass Instance methods
- ##########################################################################
-
## FIXME: this will have to be done some other way
def set_flavors(self, request, flavors_ids, max_vms=None):
return
@@ -687,19 +670,13 @@ class ResourceClass(StringIdAPIResourceWrapper):
# flavor=flavor._apiresource,
# resource_class=self._apiresource)
- ## FIXME: this will have to be done some other way
def set_racks(self, request, racks_ids):
- return
- # simply delete all and create new racks
- #for rack_id in self.racks_ids:
- # rack = Rack.get(request, rack_id)
- # rack._apiresource.resource_class = None
- # rack._apiresource.save()
-
- #for rack_id in racks_ids:
- # rack = Rack.get(request, rack_id)
- # rack._apiresource.resource_class = self._apiresource
- # rack._apiresource.save()
+ # FIXME: there is a bug now in tuskar, we have to remove all racks at
+ # first and then add new ones:
+ # https://github.com/tuskar/tuskar/issues/37
+ tuskarclient(request).resource_classes.update(self.id, racks=[])
+ racks = [{'id': rid} for rid in racks_ids]
+ tuskarclient(request).resource_classes.update(self.id, racks=racks)
class Flavor(StringIdAPIResourceWrapper):
diff --git a/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/workflows.py b/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/workflows.py
index a4a58b39..29181952 100644
--- a/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/workflows.py
+++ b/openstack_dashboard/dashboards/infrastructure/resource_management/resource_classes/workflows.py
@@ -45,8 +45,7 @@ class ResourceClassInfoAndFlavorsAction(workflows.Action):
)
image = forms.ChoiceField(label=_('Provisioning Image'),
required=True,
- choices=[('compute-img', ('Compute-Fedora19'))
- ],
+ choices=[('compute-img', ('Compute-Fedora19'))],
widget=forms.Select(
attrs={'class': 'switchable'})
)
diff --git a/openstack_dashboard/test/api_tests/tuskar_tests.py b/openstack_dashboard/test/api_tests/tuskar_tests.py
index bc07f0ed..eb56c8d0 100644
--- a/openstack_dashboard/test/api_tests/tuskar_tests.py
+++ b/openstack_dashboard/test/api_tests/tuskar_tests.py
@@ -59,19 +59,19 @@ class TuskarApiTests(test.APITestCase):
self.assertIsInstance(ret_val, api.tuskar.ResourceClass)
def test_resource_class_flavor_counts(self):
- rc = api.tuskar.ResourceClass.get(self.request, self.rclass1.id)
+ rc = self.tuskar_resource_classes.first()
for f in rc.resource_class_flavors:
self.assertIsInstance(f, api.tuskar.ResourceClassFlavor)
self.assertEquals(7, len(rc.resource_class_flavors))
def test_resource_class_racks(self):
- rc = api.tuskar.ResourceClass.get(self.request, self.rclass1.id)
- for rack in rc.racks:
+ rc = self.tuskar_resource_classes.first()
+ for rack in rc.list_racks:
self.assertIsInstance(rack, api.tuskar.Rack)
- self.assertEquals(2, len(rc.racks))
+ self.assertEquals(2, len(rc.list_racks))
def test_resource_class_nodes(self):
- rc = api.tuskar.ResourceClass.get(self.request, self.rclass1.id)
+ rc = self.tuskar_resource_classes.first()
for node in rc.nodes:
self.assertIsInstance(node, api.tuskar.Node)
self.assertEquals(4, len(rc.nodes))
diff --git a/openstack_dashboard/test/test_data/tuskar_data.py b/openstack_dashboard/test/test_data/tuskar_data.py
index 465f5fac..61230867 100644
--- a/openstack_dashboard/test/test_data/tuskar_data.py
+++ b/openstack_dashboard/test/test_data/tuskar_data.py
@@ -13,6 +13,7 @@
from openstack_dashboard.api.tuskar import (
Flavor, ResourceClass, Node,
Rack, ResourceClassFlavor)
+from collections import namedtuple
import openstack_dashboard.dashboards.infrastructure.models as dummymodels
@@ -33,14 +34,18 @@ def data(TEST):
# Resource Classes
TEST.tuskar_resource_classes = TestDataContainer()
- resource_class_1 = ResourceClass(dummymodels.ResourceClass(
+ ResourceClassStruct = namedtuple('ResourceClassStruct', 'id service_type\
+ name racks')
+ resource_class_1 = ResourceClass(ResourceClassStruct(
id="1",
service_type="compute",
+ racks=[{'id': 1}],
name="rclass1"))
- resource_class_2 = ResourceClass(dummymodels.ResourceClass(
+ resource_class_2 = ResourceClass(ResourceClassStruct(
id="2",
service_type="compute",
+ racks=[],
name="rclass2"))
"""
@@ -71,10 +76,17 @@ def data(TEST):
#Racks
TEST.tuskar_racks = TestDataContainer()
- rack_1 = Rack(dummymodels.Rack(
+ # FIXME: Struct is used to provide similar object-like behaviour
+ # as is provided by tuskarclient
+ RackStruct = namedtuple('RackStruct', 'id name nodes resource_class\
+ location subnet')
+ rack_1 = Rack(RackStruct(
id="1",
name='rack1',
- resource_class_id='1'))
+ location='location',
+ subnet='192.168.1.0/24',
+ nodes=[{'id': 1}, {'id': 2}, {'id': 3}, {'id': 4}],
+ resource_class={'id': '1'}))
TEST.tuskar_racks.add(rack_1)