diff --git a/ironicclient/osc/v1/baremetal_port.py b/ironicclient/osc/v1/baremetal_port.py index db5289de5..e5e2fc0e8 100644 --- a/ironicclient/osc/v1/baremetal_port.py +++ b/ironicclient/osc/v1/baremetal_port.py @@ -292,6 +292,12 @@ class ListBaremetalPort(command.Lister): metavar='', help="Only show information for the port with this MAC address." ) + parser.add_argument( + '--node', + dest='node', + metavar='', + help="Only list ports of this node (name or UUID)." + ) parser.add_argument( '--limit', metavar='', @@ -351,6 +357,8 @@ class ListBaremetalPort(command.Lister): if parsed_args.address is not None: params['address'] = parsed_args.address + if parsed_args.node is not None: + params['node'] = parsed_args.node if parsed_args.detail: params['detail'] = parsed_args.detail diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py index 9a7829f60..e9d84b9c9 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py @@ -407,6 +407,20 @@ class TestBaremetalPortList(TestBaremetalPort): } self.baremetal_mock.port.list.assert_called_with(**kwargs) + def test_baremetal_port_list_node(self): + arglist = ['--node', baremetal_fakes.baremetal_uuid] + verifylist = [('node', baremetal_fakes.baremetal_uuid)] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + kwargs = { + 'node': baremetal_fakes.baremetal_uuid, + 'marker': None, + 'limit': None, + } + self.baremetal_mock.port.list.assert_called_with(**kwargs) + def test_baremetal_port_list_long(self): arglist = ['--long'] verifylist = [('detail', True)] diff --git a/ironicclient/tests/unit/v1/test_port.py b/ironicclient/tests/unit/v1/test_port.py index 9004e9e0f..81da5c39b 100644 --- a/ironicclient/tests/unit/v1/test_port.py +++ b/ironicclient/tests/unit/v1/test_port.py @@ -110,7 +110,14 @@ fake_responses = { {}, {"ports": [PORT]}, ), - } + }, + '/v1/ports/?node=%s' % PORT['node_uuid']: + { + 'GET': ( + {}, + {"ports": [PORT]}, + ), + }, } fake_responses_pagination = { @@ -187,6 +194,14 @@ class PortManagerTest(testtools.TestCase): self.assertEqual(expect, self.api.calls) self.assertEqual(1, len(ports)) + def test_ports_list_by_node(self): + ports = self.mgr.list(node=PORT['node_uuid']) + expect = [ + ('GET', '/v1/ports/?node=%s' % PORT['node_uuid'], {}, None), + ] + self.assertEqual(expect, self.api.calls) + self.assertEqual(1, len(ports)) + def test_ports_list_detail(self): ports = self.mgr.list(detail=True) expect = [ diff --git a/ironicclient/v1/port.py b/ironicclient/v1/port.py index 703437cb4..a0a52ee50 100644 --- a/ironicclient/v1/port.py +++ b/ironicclient/v1/port.py @@ -32,8 +32,8 @@ class PortManager(base.CreateManager): _resource_name = 'ports' def list(self, address=None, limit=None, marker=None, sort_key=None, - sort_dir=None, detail=False, fields=None): - """Retrieve a list of port. + sort_dir=None, detail=False, fields=None, node=None): + """Retrieve a list of ports. :param address: Optional, MAC address of a port, to get the port which has this MAC address @@ -61,6 +61,9 @@ class PortManager(base.CreateManager): of the resource to be returned. Can not be used when 'detail' is set. + :param node: Optional, name or UUID of a node. Used to get + ports of this node. + :returns: A list of ports. """ @@ -75,6 +78,8 @@ class PortManager(base.CreateManager): fields) if address is not None: filters.append('address=%s' % address) + if node is not None: + filters.append('node=%s' % node) path = '' if detail: