From c07b1fe3831a64f44f0a6581802fba55f50a8f6c Mon Sep 17 00:00:00 2001 From: Lin Yang Date: Mon, 21 Aug 2017 21:47:21 -0700 Subject: [PATCH] Add list composed node command Add new command 'rsd node list' to list all composed node with brief info, like: $ openstack rsd node list +----------+------+--------------------------------------+-------------+ | Identity | Name | UUID | Description | +----------+------+--------------------------------------+-------------+ | 2 | Test | fd011520-86a2-11e7-b4d4-5d323196a3e4 | None | +----------+------+--------------------------------------+-------------+ Change-Id: Ie6ef9aebf45c5f2bb1e0d93c86b5f9a70a600b13 --- rsdclient/common/utils.py | 10 ++++++++++ rsdclient/osc/v1/node.py | 10 ++++++++++ rsdclient/tests/v1/test_node.py | 22 ++++++++++++++++++++++ rsdclient/v1/node.py | 8 ++++++++ setup.cfg | 1 + 5 files changed, 51 insertions(+) diff --git a/rsdclient/common/utils.py b/rsdclient/common/utils.py index ad63e6f..873fdfc 100644 --- a/rsdclient/common/utils.py +++ b/rsdclient/common/utils.py @@ -13,6 +13,7 @@ # License for the specific language governing permissions and limitations # under the License. +import prettytable import six @@ -41,3 +42,12 @@ def extract_attr(redfish_obj): return None return result + + +def print_dict(obj_list, field_names): + pt = prettytable.PrettyTable(field_names=field_names) + + for element in obj_list: + pt.add_row([element.get(i.lower(), None) for i in field_names]) + + return pt diff --git a/rsdclient/osc/v1/node.py b/rsdclient/osc/v1/node.py index 18dc5d3..590bc63 100644 --- a/rsdclient/osc/v1/node.py +++ b/rsdclient/osc/v1/node.py @@ -80,3 +80,13 @@ class ShowNode(command.Command): rsd_client = self.app.client_manager.rsd node_detail = rsd_client.node.show(parsed_args.node) print("{0}".format(json.dumps(node_detail, indent=2))) + + +class ListNode(command.Command): + _description = "List all composed nodes" + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)", parsed_args) + rsd_client = self.app.client_manager.rsd + node_list = rsd_client.node.list() + print(node_list) diff --git a/rsdclient/tests/v1/test_node.py b/rsdclient/tests/v1/test_node.py index 4778adb..153b717 100644 --- a/rsdclient/tests/v1/test_node.py +++ b/rsdclient/tests/v1/test_node.py @@ -51,3 +51,25 @@ class NodeTest(testtools.TestCase): result = self.mgr.show('1') expected = fakes.FAKE_NODE_PYTHON_DICT self.assertEqual(result, expected) + + def test_list_node(self): + mock_node_collection = mock.Mock() + mock_node_collection.members_identities = ('/redfish/v1/Nodes/1',) + self.mgr.client.get_node_collection.return_value = mock_node_collection + self.mgr.client.get_node.return_value = fakes.FakeNode() + + expected = '+----------+------+--------------------------------------'\ + '+------------------+\n'\ + '| Identity | Name | UUID '\ + '| Description |\n'\ + '+----------+------+--------------------------------------'\ + '+------------------+\n'\ + '| 1 | Test | fd011520-86a2-11e7-b4d4-5d323196a3e4 '\ + '| Node for testing |\n'\ + '+----------+------+--------------------------------------'\ + '+------------------+' + + result = self.mgr.list() + self.mgr.client.get_node_collection.assert_called_once() + self.mgr.client.get_node.assert_called_once_with('/redfish/v1/Nodes/1') + self.assertEqual(str(result), expected) diff --git a/rsdclient/v1/node.py b/rsdclient/v1/node.py index bbe36ca..15cefef 100644 --- a/rsdclient/v1/node.py +++ b/rsdclient/v1/node.py @@ -40,3 +40,11 @@ class NodeManager(base.Manager): def show(self, node_id): node = self.client.get_node(self._get_node_uri(node_id)) return utils.extract_attr(node) + + def list(self): + node_collection = self.client.get_node_collection() + nodes = [utils.extract_attr(self.client.get_node(node_uri)) + for node_uri in node_collection.members_identities] + node_info_table = utils.print_dict( + nodes, ["Identity", "Name", "UUID", "Description"]) + return node_info_table diff --git a/setup.cfg b/setup.cfg index 1eb3553..3fc73d5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -31,6 +31,7 @@ openstack.rsd.v1 = rsd_node_compose = rsdclient.osc.v1.node:ComposeNode rsd_node_delete = rsdclient.osc.v1.node:DeleteNode rsd_node_show = rsdclient.osc.v1.node:ShowNode + rsd_node_list = rsdclient.osc.v1.node:ListNode [build_sphinx] all-files = 1