diff options
author | Tzu-Mainn Chen <tzumainn@redhat.com> | 2013-10-07 03:26:08 -0400 |
---|---|---|
committer | Tzu-Mainn Chen <tzumainn@redhat.com> | 2013-10-08 09:55:53 -0400 |
commit | 7f2f5476fe70a751d5e757c166df672295896f15 (patch) | |
tree | eb394130e708a23695a4fcb3be62f19c9c1e0c54 | |
parent | a2b44821cffcb734ad5be4d6144a86f80eb5bc11 (diff) | |
download | tuskar-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.py | 67 | ||||
-rw-r--r-- | tuskar_ui/test/api_tests/tuskar_tests.py | 54 |
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() |