diff options
author | Radomir Dopieralski <openstack@sheep.art.pl> | 2013-10-22 10:44:10 +0200 |
---|---|---|
committer | Radomir Dopieralski <openstack@sheep.art.pl> | 2013-10-22 14:00:37 +0200 |
commit | 0d338c69882515cdf92b82a8699eab8543cdd5a5 (patch) | |
tree | 8fdb2a7d4a241fce4f3ca995b3cccb8b10a1a211 | |
parent | 92e1305e0d4d7a5ae57009527eff725e0ca1496c (diff) | |
download | tuskar-ui-0d338c69882515cdf92b82a8699eab8543cdd5a5.tar.gz |
405 bad method when deleting a node
Deleting a node from the given rack by updating the node
list in the rack.
Change-Id: I3dfd1cdc594ce325b6324fe7ccdb7772c7feaeeb
Closes-Bug: #1237474
3 files changed, 52 insertions, 2 deletions
diff --git a/tuskar_ui/infrastructure/resource_management/nodes/tables.py b/tuskar_ui/infrastructure/resource_management/nodes/tables.py index c815e705..9e61a974 100644 --- a/tuskar_ui/infrastructure/resource_management/nodes/tables.py +++ b/tuskar_ui/infrastructure/resource_management/nodes/tables.py @@ -14,6 +14,7 @@ from django.utils.translation import ugettext_lazy as _ # noqa +from horizon import exceptions from horizon import tables from tuskar_ui import api as tuskar @@ -27,7 +28,16 @@ class DeleteNodes(tables.DeleteAction): data_type_plural = _("Nodes") def delete(self, request, obj_id): - tuskar.node_delete(request, obj_id) + try: + node = tuskar.Node.get(request, obj_id) + rack = node.rack + nodes = [{'id': node_id} + for node_id in rack.node_ids + if node_id != obj_id] + tuskar.Rack.update(request, rack.id, {'nodes': nodes}) + except Exception: + exceptions.handle(request, _("Error deleting node.")) + return False class NodesFilterAction(tables.FilterAction): @@ -55,6 +65,9 @@ class NodesTable(tables.DataTable): table_actions = (DeleteNodes, NodesFilterAction) row_actions = (DeleteNodes,) + def get_object_display(self, datum): + return datum.service_host + class UnrackedNodesTable(NodesTable): diff --git a/tuskar_ui/infrastructure/resource_management/racks/tests.py b/tuskar_ui/infrastructure/resource_management/racks/tests.py index 639bd3c2..56545ea8 100644 --- a/tuskar_ui/infrastructure/resource_management/racks/tests.py +++ b/tuskar_ui/infrastructure/resource_management/racks/tests.py @@ -366,3 +366,40 @@ class RackViewTests(test.BaseAdminViewTests): self.assertEquals(res['Content-Type'], 'application/json') self.assertEquals(res.content, state_json) + + @test.create_stubs({ + tuskar.Rack: ('get', 'list_nodes', 'list_flavors', 'update', + 'node_ids'), + tuskar.ResourceClass: ('get',), + tuskar.Node: ('get',), + tuskar.BaremetalNode: ('get',), + }) + def test_node_delete(self): + rack = self.tuskar_racks.first() + rack.request = self.request + baremetal_nodes = self.baremetal_nodes.list() + baremetal_node = baremetal_nodes[0] + tuskar_node = self.tuskar_nodes.first() + + tuskar.Rack.list_nodes = baremetal_nodes + tuskar.Rack.node_ids = [node.id for node in baremetal_nodes] + tuskar.Rack.list_flavors = [] + + tuskar.Rack.get(mox.IsA(http.HttpRequest), rack.id).AndReturn(rack) + tuskar.Node.get(mox.IsA(http.HttpRequest), + baremetal_node.id).AndReturn(tuskar_node) + tuskar.Rack.get(None, rack.id).AndReturn(rack) # called by node.rack + tuskar.Rack.update(mox.IsA(http.HttpRequest), rack.id, + {'nodes': [{'id': node_id} + for node_id in tuskar.Rack.node_ids + if node_id != baremetal_node.id]}).AndReturn(rack) + self.mox.ReplayAll() + + url = urlresolvers.reverse( + 'horizon:infrastructure:resource_management:racks:detail', + args=[rack.id]) + form_data = {'action': 'nodes_table__delete__%s' % baremetal_node.id} + response = self.client.post(url, form_data) + self.assertNoFormErrors(response) + self.assertMessageCount(success=1) + self.assertRedirectsNoFollow(response, url) diff --git a/tuskar_ui/infrastructure/resource_management/racks/views.py b/tuskar_ui/infrastructure/resource_management/racks/views.py index a22c7642..fe506e5b 100644 --- a/tuskar_ui/infrastructure/resource_management/racks/views.py +++ b/tuskar_ui/infrastructure/resource_management/racks/views.py @@ -103,7 +103,7 @@ class EditRackStatusView(horizon_forms.ModalFormView): 'action': action} -class DetailView(horizon_tabs.TabView): +class DetailView(horizon_tabs.TabbedTableView): tab_group_class = tabs.RackDetailTabs template_name = 'infrastructure/resource_management/racks/detail.html' |