diff --git a/ironicclient/osc/v1/baremetal_node.py b/ironicclient/osc/v1/baremetal_node.py index e4fd32ef9..9945a0d5b 100644 --- a/ironicclient/osc/v1/baremetal_node.py +++ b/ironicclient/osc/v1/baremetal_node.py @@ -395,6 +395,11 @@ class ListBaremetalNode(command.Lister): dest='resource_class', metavar='<resource class>', help="Limit list to nodes with resource class <resource class>") + parser.add_argument( + '--chassis', + dest='chassis', + metavar='<chassis UUID>', + help="Limit list to nodes of this chassis") display_group = parser.add_mutually_exclusive_group(required=False) display_group.add_argument( '--long', @@ -436,6 +441,8 @@ class ListBaremetalNode(command.Lister): params['provision_state'] = parsed_args.provision_state if parsed_args.resource_class: params['resource_class'] = parsed_args.resource_class + if parsed_args.chassis: + params['chassis'] = parsed_args.chassis if parsed_args.long: params['detail'] = parsed_args.long columns = res_fields.NODE_DETAILED_RESOURCE.fields diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_node.py b/ironicclient/tests/unit/osc/v1/test_baremetal_node.py index b25ff9310..91eb1d58c 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_node.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_node.py @@ -552,6 +552,31 @@ class TestBaremetalList(TestBaremetal): **kwargs ) + def test_baremetal_list_chassis(self): + chassis_uuid = 'aaaaaaaa-1111-bbbb-2222-cccccccccccc' + arglist = [ + '--chassis', chassis_uuid, + ] + verifylist = [ + ('chassis', chassis_uuid), + ] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + + # DisplayCommandBase.take_action() returns two tuples + self.cmd.take_action(parsed_args) + + # Set expected values + kwargs = { + 'marker': None, + 'limit': None, + 'chassis': chassis_uuid + } + + self.baremetal_mock.node.list.assert_called_with( + **kwargs + ) + def test_baremetal_list_fields(self): arglist = [ '--fields', 'uuid', 'name', diff --git a/ironicclient/tests/unit/v1/test_node.py b/ironicclient/tests/unit/v1/test_node.py index ff2b18185..8b4d4d386 100644 --- a/ironicclient/tests/unit/v1/test_node.py +++ b/ironicclient/tests/unit/v1/test_node.py @@ -181,6 +181,13 @@ fake_responses = { {"nodes": [NODE1]}, ) }, + '/v1/nodes/?chassis_uuid=%s' % NODE2['chassis_uuid']: + { + 'GET': ( + {}, + {"nodes": [NODE2]}, + ) + }, '/v1/nodes/detail?instance_uuid=%s' % NODE2['instance_uuid']: { 'GET': ( @@ -567,6 +574,16 @@ class NodeManagerTest(testtools.TestCase): self.assertThat(nodes, HasLength(1)) self.assertEqual(NODE1['uuid'], getattr(nodes[0], 'uuid')) + def test_node_list_chassis(self): + ch2 = NODE2['chassis_uuid'] + nodes = self.mgr.list(chassis=ch2) + expect = [ + ('GET', '/v1/nodes/?chassis_uuid=%s' % ch2, {}, None), + ] + self.assertEqual(expect, self.api.calls) + self.assertThat(nodes, HasLength(1)) + self.assertEqual(NODE2['uuid'], getattr(nodes[0], 'uuid')) + def test_node_list_no_maintenance(self): nodes = self.mgr.list(maintenance=False) expect = [ diff --git a/ironicclient/v1/node.py b/ironicclient/v1/node.py index b64202b23..9327308a5 100644 --- a/ironicclient/v1/node.py +++ b/ironicclient/v1/node.py @@ -49,7 +49,8 @@ class NodeManager(base.CreateManager): def list(self, associated=None, maintenance=None, marker=None, limit=None, detail=False, sort_key=None, sort_dir=None, fields=None, - provision_state=None, driver=None, resource_class=None): + provision_state=None, driver=None, resource_class=None, + chassis=None): """Retrieve a list of nodes. :param associated: Optional. Either a Boolean or a string @@ -93,6 +94,9 @@ class NodeManager(base.CreateManager): :param resource_class: Optional. String value to get only nodes with the given resource class set. + :param chassis: Optional, the UUID of a chassis. Used to get only + nodes of this chassis. + :returns: A list of nodes. """ @@ -115,6 +119,8 @@ class NodeManager(base.CreateManager): filters.append('driver=%s' % driver) if resource_class is not None: filters.append('resource_class=%s' % resource_class) + if chassis is not None: + filters.append('chassis_uuid=%s' % chassis) path = '' if detail: diff --git a/releasenotes/notes/osc-node-list-chassis-091d080684cdccf8.yaml b/releasenotes/notes/osc-node-list-chassis-091d080684cdccf8.yaml new file mode 100644 index 000000000..c929f91b9 --- /dev/null +++ b/releasenotes/notes/osc-node-list-chassis-091d080684cdccf8.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Adds an optional '--chassis' (chassis UUID) to the + "openstack baremetal node list" command. It provides the + ability to get a list of the nodes of the specified chassis.