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