diff --git a/ironicclient/tests/unit/v1/test_node.py b/ironicclient/tests/unit/v1/test_node.py index dd6b9361c..8eae43115 100644 --- a/ironicclient/tests/unit/v1/test_node.py +++ b/ironicclient/tests/unit/v1/test_node.py @@ -51,7 +51,8 @@ NODE2 = {'uuid': '66666666-7777-8888-9999-111111111111', 'driver_info': {'user': 'foo', 'password': 'bar'}, 'properties': {'num_cpu': 4}, 'resource_class': 'bar', - 'extra': {}} + 'extra': {}, + 'owner': '33333333-2222-1111-0000-111111111111'} PORT = {'uuid': '11111111-2222-3333-4444-555555555555', 'node_uuid': '66666666-7777-8888-9999-000000000000', 'address': 'AA:AA:AA:AA:AA:AA', @@ -187,6 +188,13 @@ fake_responses = { {"nodes": [NODE1]}, ) }, + '/v1/nodes/?owner=%s' % NODE2['owner']: + { + 'GET': ( + {}, + {"nodes": [NODE2]}, + ) + }, '/v1/nodes/?driver=fake': { 'GET': ( @@ -803,6 +811,15 @@ class NodeManagerTest(testtools.TestCase): self.assertThat(nodes, HasLength(1)) self.assertEqual(NODE1['uuid'], getattr(nodes[0], 'uuid')) + def test_node_list_owner(self): + nodes = self.mgr.list(owner=NODE2['owner']) + expect = [ + ('GET', '/v1/nodes/?owner=%s' % NODE2['owner'], {}, None), + ] + self.assertEqual(expect, self.api.calls) + self.assertThat(nodes, HasLength(1)) + self.assertEqual(NODE2['owner'], getattr(nodes[0], 'owner')) + def test_node_list_provision_state_fail(self): self.assertRaises(KeyError, self.mgr.list, provision_state="test") diff --git a/ironicclient/v1/node.py b/ironicclient/v1/node.py index d525eedc3..16ed6887b 100644 --- a/ironicclient/v1/node.py +++ b/ironicclient/v1/node.py @@ -60,7 +60,7 @@ class NodeManager(base.CreateManager): detail=False, sort_key=None, sort_dir=None, fields=None, provision_state=None, driver=None, resource_class=None, chassis=None, fault=None, os_ironic_api_version=None, - conductor_group=None, conductor=None): + conductor_group=None, conductor=None, owner=None): """Retrieve a list of nodes. :param associated: Optional. Either a Boolean or a string @@ -116,6 +116,8 @@ class NodeManager(base.CreateManager): with the given conductor group set. :param conductor: Optional. String value to get only nodes mapped to the given conductor. + :param owner: Optional. String value to get only nodes + mapped to a specific owner. :returns: A list of nodes. @@ -147,6 +149,8 @@ class NodeManager(base.CreateManager): filters.append('conductor_group=%s' % conductor_group) if conductor is not None: filters.append('conductor=%s' % conductor) + if owner is not None: + filters.append('owner=%s' % owner) path = '' if detail: diff --git a/releasenotes/notes/fix-owner-feature-2f3f0163ff307727.yaml b/releasenotes/notes/fix-owner-feature-2f3f0163ff307727.yaml new file mode 100644 index 000000000..cf8bde012 --- /dev/null +++ b/releasenotes/notes/fix-owner-feature-2f3f0163ff307727.yaml @@ -0,0 +1,9 @@ +--- +fixes: + - | + ``openstack baremetal node list --owner`` was returning an error + instead of a list of nodes for the specified owner. It has been + fixed. + + See `story 2006563 + `__ for details.