From fd3fb28906b0020635b29b858c54d22b230119c2 Mon Sep 17 00:00:00 2001 From: Lin Yang Date: Thu, 17 Aug 2017 16:37:30 -0700 Subject: [PATCH] Add delete composed node command Add new command 'rsd node delete' to allow user to delete composed node(s) by specifying node ID. Change-Id: If0f8bf80ab5a48b2fb85d2082d85973006a28a9b --- rsdclient/osc/v1/node.py | 21 +++++++++++++++++++++ rsdclient/tests/v1/test_node.py | 11 ++++++++++- rsdclient/v1/node.py | 12 ++++++++++++ setup.cfg | 3 ++- 4 files changed, 45 insertions(+), 2 deletions(-) diff --git a/rsdclient/osc/v1/node.py b/rsdclient/osc/v1/node.py index 5077aba..ad53bea 100644 --- a/rsdclient/osc/v1/node.py +++ b/rsdclient/osc/v1/node.py @@ -39,3 +39,24 @@ class ComposeNode(command.Command): rsd_client.node.compose(args) print("Request to compose node %s was accepted" % parsed_args.name) + + +class DeleteNode(command.Command): + _description = "Delete a Node" + + def get_parser(self, prog_name): + parser = super(DeleteNode, self).get_parser(prog_name) + parser.add_argument( + 'node', + nargs='+', + metavar='', + help='ID of the node(s) to delete.') + + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + rsd_client = self.app.client_manager.rsd + for node in parsed_args.node: + rsd_client.node.delete(node) + print("Node {0} has been deleted.".format(node)) diff --git a/rsdclient/tests/v1/test_node.py b/rsdclient/tests/v1/test_node.py index d71077b..c598b12 100644 --- a/rsdclient/tests/v1/test_node.py +++ b/rsdclient/tests/v1/test_node.py @@ -24,12 +24,21 @@ class ClusterManagerTest(testtools.TestCase): def setUp(self): super(ClusterManagerTest, self).setUp() self.client = mock.Mock() + self.client._nodes_path = '/redfish/v1/Nodes' self.mgr = node.NodeManager(self.client) - def test_compose(self): + def test_compose_node(self): mock_node_collection = mock.Mock() self.client.get_node_collection.return_value = mock_node_collection self.mgr.compose({'Name': 'fake_name'}) self.mgr.client.get_node_collection.assert_called_once() mock_node_collection.compose_node.assert_called_once_with( {'Name': 'fake_name'}) + + def test_delete_node(self): + node_id = '1' + mock_node = mock.Mock() + self.client.get_node.return_value = mock_node + self.mgr.delete(node_id) + self.mgr.client.get_node.assert_called_once_with('/redfish/v1/Nodes/1') + mock_node.delete_node.assert_called_once() diff --git a/rsdclient/v1/node.py b/rsdclient/v1/node.py index 8412a9b..e27b4d9 100644 --- a/rsdclient/v1/node.py +++ b/rsdclient/v1/node.py @@ -13,6 +13,8 @@ # under the License. # +import os + from rsdclient.common import base @@ -20,7 +22,17 @@ class NodeManager(base.Manager): # resource_class = Node _resource_name = 'nodes' + def __init__(self, *args, **kwargs): + super(NodeManager, self).__init__(*args, **kwargs) + self.nodes_path = self.client._nodes_path + + def _get_node_uri(self, node_id): + return os.path.join(self.nodes_path, node_id) + def compose(self, properites): # TODO(lin.yang): should return id of new composed node, like # 'redfish/v1/Nodes/1' return self.client.get_node_collection().compose_node(properites) + + def delete(self, node_id): + self.client.get_node(self._get_node_uri(node_id)).delete_node() diff --git a/setup.cfg b/setup.cfg index c5abc33..75f6e4e 100644 --- a/setup.cfg +++ b/setup.cfg @@ -28,7 +28,8 @@ openstack.cli.extension = rsd = rsdclient.osc.plugin openstack.rsd.v1 = - rsd_compose = rsdclient.osc.v1.node:ComposeNode + rsd_node_compose = rsdclient.osc.v1.node:ComposeNode + rsd_node_delete = rsdclient.osc.v1.node:DeleteNode [build_sphinx] all-files = 1