summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTzu-Mainn Chen <tzumainn@redhat.com>2013-10-07 03:26:08 -0400
committerTzu-Mainn Chen <tzumainn@redhat.com>2013-10-08 09:55:53 -0400
commit7f2f5476fe70a751d5e757c166df672295896f15 (patch)
treeeb394130e708a23695a4fcb3be62f19c9c1e0c54
parenta2b44821cffcb734ad5be4d6144a86f80eb5bc11 (diff)
downloadtuskar-ui-7f2f5476fe70a751d5e757c166df672295896f15.tar.gz
Added needed CRUD methods to BaremetalNode
Tuskar will not be able to update or delete a BaremetalNode Change-Id: I02002409ba0935d5d126bbdfe63fac645c817526 Partial-Bug: #1236192
-rw-r--r--tuskar_ui/api.py67
-rw-r--r--tuskar_ui/test/api_tests/tuskar_tests.py54
2 files changed, 116 insertions, 5 deletions
diff --git a/tuskar_ui/api.py b/tuskar_ui/api.py
index 63bade25..834b5b13 100644
--- a/tuskar_ui/api.py
+++ b/tuskar_ui/api.py
@@ -176,7 +176,7 @@ class Node(StringIdAPIResourceWrapper):
node.request = request
# FIXME ugly, fix after demo, make abstraction of instance details
- # this is realy not optimal, but i dont hve time do fix it now
+ # this is realy not optimal, but i dont have time do fix it now
instances, more = nova.server_list(
request,
search_opts={'paginate': True},
@@ -192,8 +192,8 @@ class Node(StringIdAPIResourceWrapper):
if detail:
addresses = detail._apiresource.addresses.get('ctlplane')
if addresses:
- node.ip_address_other = (", "
- .join([addr['addr'] for addr in addresses]))
+ node.ip_address_other = (", ".join([addr['addr']
+ for addr in addresses]))
node.status = detail._apiresource._info['OS-EXT-STS:vm_state']
node.power_management = ""
@@ -206,8 +206,7 @@ class Node(StringIdAPIResourceWrapper):
@classmethod
def list(cls, request):
- return [Node(n, request) for n in
- baremetalclient(request).list()]
+ return [Node(n, request) for n in baremetalclient(request).list()]
@classmethod
def list_unracked(cls, request):
@@ -326,6 +325,64 @@ class BaremetalNode(Node):
_attrs = ['id', 'pm_address', 'cpus', 'memory_mb', 'service_host',
'local_gb', 'pm_user']
+ @classmethod
+ def create(cls, request, **kwargs):
+ # The pm_address, pm_user and terminal_port need to be None when
+ # empty for the baremetal vm to work.
+ # terminal_port needs separate handling because 0 is a valid value.
+ terminal_port = kwargs['terminal_port']
+ if terminal_port == '':
+ terminal_port = None
+ node = baremetalclient(request).create(kwargs['name'],
+ kwargs['cpus'],
+ kwargs['memory_mb'],
+ kwargs['local_gb'],
+ kwargs['prov_mac_address'],
+ kwargs['pm_address'] or None,
+ kwargs['pm_user'] or None,
+ kwargs['pm_password'],
+ terminal_port)
+ return cls(node)
+
+ @classmethod
+ def get(cls, request, node_id):
+ node = cls(baremetalclient(request).get(node_id))
+ node.request = request
+
+ # FIXME ugly, fix after demo, make abstraction of instance details
+ # this is realy not optimal, but i dont hve time do fix it now
+ instances, more = nova.server_list(
+ request,
+ search_opts={'paginate': True},
+ all_tenants=True)
+
+ instance_details = {}
+ for instance in instances:
+ id = (instance.
+ _apiresource._info['OS-EXT-SRV-ATTR:hypervisor_hostname'])
+ instance_details[id] = instance
+
+ detail = instance_details.get(node_id)
+ if detail:
+ addresses = detail._apiresource.addresses.get('ctlplane')
+ if addresses:
+ node.ip_address_other = (", "
+ .join([addr['addr'] for addr in addresses]))
+
+ node.status = detail._apiresource._info['OS-EXT-STS:vm_state']
+ node.power_management = ""
+ if node.pm_user:
+ node.power_management = node.pm_user + "/********"
+ else:
+ node.status = 'unprovisioned'
+
+ return node
+
+ @classmethod
+ def list(cls, request):
+ return [cls(n, request) for n in
+ baremetalclient(request).list()]
+
class Rack(StringIdAPIResourceWrapper):
"""Wrapper for the Rack object returned by the
diff --git a/tuskar_ui/test/api_tests/tuskar_tests.py b/tuskar_ui/test/api_tests/tuskar_tests.py
index a715c747..573495bd 100644
--- a/tuskar_ui/test/api_tests/tuskar_tests.py
+++ b/tuskar_ui/test/api_tests/tuskar_tests.py
@@ -22,6 +22,60 @@ from tuskar_ui.test import helpers as test
class TuskarApiTests(test.APITestCase):
+ def test_baremetal_node_get(self):
+ node = self.baremetalclient_nodes.first()
+
+ self.mox.StubOutWithMock(baremetal.BareMetalNodeManager, 'get')
+ baremetal.BareMetalNodeManager.get(node.id).AndReturn(node)
+
+ novaclient = self.stub_novaclient()
+ novaclient.servers = self.mox.CreateMockAnything()
+ novaclient.servers.list(True,
+ {'all_tenants': True,
+ 'limit': 21}).AndReturn([])
+ self.mox.ReplayAll()
+
+ ret_val = api.BaremetalNode.get(self.request, node.id)
+ self.assertIsInstance(ret_val, api.BaremetalNode)
+
+ def test_baremetal_node_create(self):
+ node = self.baremetalclient_nodes.first()
+
+ self.mox.StubOutWithMock(baremetal.BareMetalNodeManager, 'create')
+ baremetal.BareMetalNodeManager.create('node',
+ 1,
+ 1024,
+ 10,
+ 'aa:bb:cc:dd:ee',
+ '0.0.0.0',
+ 'user',
+ 'password',
+ 0).AndReturn(node)
+ self.mox.ReplayAll()
+
+ ret_val = api.BaremetalNode.create(self.request,
+ name='node',
+ cpus=1,
+ memory_mb=1024,
+ local_gb=10,
+ prov_mac_address='aa:bb:cc:dd:ee',
+ pm_address='0.0.0.0',
+ pm_user='user',
+ pm_password='password',
+ terminal_port=0)
+ self.assertIsInstance(ret_val, api.Node)
+
+ def test_baremetal_node_list(self):
+ nodes = self.baremetalclient_nodes_all.list()
+
+ self.mox.StubOutWithMock(baremetal.BareMetalNodeManager, 'list')
+ baremetal.BareMetalNodeManager.list().AndReturn(nodes)
+ self.mox.ReplayAll()
+
+ ret_val = api.BaremetalNode.list(self.request)
+ for node in ret_val:
+ self.assertIsInstance(node, api.Node)
+
def test_node_get(self):
node = self.baremetalclient_nodes.first()