Filtering nodes by provision state
Add support for filtering nodes by provision state in the node-list command. For provision states with spaces, like 'wait call-back' ironicclient will encode it to %20 in the uri. And bump the default version to 1.9. Closes-Bug: #1468229 Depends-On: Ifcd554de04cdc42bffea1a116307b045f39c8416 Change-Id: I9967ff6124e2e7e9958098b41cc892f2c55df5d2
This commit is contained in:
parent
8e23e8add4
commit
32c6c3cfb3
@ -36,7 +36,7 @@ from ironicclient import exc
|
||||
# microversion support in the client properly! See
|
||||
# http://specs.openstack.org/openstack/ironic-specs/specs/kilo/api-microversions.html # noqa
|
||||
# for full details.
|
||||
DEFAULT_VER = '1.8'
|
||||
DEFAULT_VER = '1.9'
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -28,6 +28,7 @@ NODE1 = {'id': 123,
|
||||
'uuid': '66666666-7777-8888-9999-000000000000',
|
||||
'chassis_uuid': 'aaaaaaaa-1111-bbbb-2222-cccccccccccc',
|
||||
'maintenance': False,
|
||||
'provision_state': 'available',
|
||||
'driver': 'fake',
|
||||
'driver_info': {'user': 'foo', 'password': 'bar'},
|
||||
'properties': {'num_cpu': 4},
|
||||
@ -75,6 +76,7 @@ CREATE_NODE = copy.deepcopy(NODE1)
|
||||
del CREATE_NODE['id']
|
||||
del CREATE_NODE['uuid']
|
||||
del CREATE_NODE['maintenance']
|
||||
del CREATE_NODE['provision_state']
|
||||
|
||||
UPDATED_NODE = copy.deepcopy(NODE1)
|
||||
NEW_DRIVER = 'new-driver'
|
||||
@ -83,6 +85,7 @@ UPDATED_NODE['driver'] = NEW_DRIVER
|
||||
CREATE_WITH_UUID = copy.deepcopy(NODE1)
|
||||
del CREATE_WITH_UUID['id']
|
||||
del CREATE_WITH_UUID['maintenance']
|
||||
del CREATE_WITH_UUID['provision_state']
|
||||
|
||||
fake_responses = {
|
||||
'/v1/nodes':
|
||||
@ -145,6 +148,13 @@ fake_responses = {
|
||||
{"nodes": [NODE2]},
|
||||
)
|
||||
},
|
||||
'/v1/nodes/?provision_state=available':
|
||||
{
|
||||
'GET': (
|
||||
{},
|
||||
{"nodes": [NODE1]},
|
||||
)
|
||||
},
|
||||
'/v1/nodes/detail?instance_uuid=%s' % NODE2['instance_uuid']:
|
||||
{
|
||||
'GET': (
|
||||
@ -472,6 +482,19 @@ class NodeManagerTest(testtools.TestCase):
|
||||
self.assertThat(nodes, HasLength(1))
|
||||
self.assertEqual(NODE2['uuid'], getattr(nodes[0], 'uuid'))
|
||||
|
||||
def test_node_list_provision_state(self):
|
||||
nodes = self.mgr.list(provision_state="available")
|
||||
expect = [
|
||||
('GET', '/v1/nodes/?provision_state=available', {}, None),
|
||||
]
|
||||
self.assertEqual(expect, self.api.calls)
|
||||
self.assertThat(nodes, HasLength(1))
|
||||
self.assertEqual(NODE1['uuid'], getattr(nodes[0], 'uuid'))
|
||||
|
||||
def test_node_list_provision_state_fail(self):
|
||||
self.assertRaises(KeyError, self.mgr.list,
|
||||
provision_state="test")
|
||||
|
||||
def test_node_list_no_maintenance(self):
|
||||
nodes = self.mgr.list(maintenance=False)
|
||||
expect = [
|
||||
|
@ -488,11 +488,12 @@ class NodeShellTest(utils.BaseTestCase):
|
||||
def _get_client_mock_args(self, node=None, associated=None,
|
||||
maintenance=None, marker=None, limit=None,
|
||||
sort_dir=None, sort_key=None, detail=False,
|
||||
fields=None):
|
||||
fields=None, provision_state=None):
|
||||
args = mock.MagicMock()
|
||||
args.node = node
|
||||
args.associated = associated
|
||||
args.maintenance = maintenance
|
||||
args.provision_state = provision_state
|
||||
args.marker = marker
|
||||
args.limit = limit
|
||||
args.sort_dir = sort_dir
|
||||
@ -509,6 +510,15 @@ class NodeShellTest(utils.BaseTestCase):
|
||||
n_shell.do_node_list(client_mock, args)
|
||||
client_mock.node.list.assert_called_once_with(detail=False)
|
||||
|
||||
def test_do_node_list_provison_state(self):
|
||||
client_mock = mock.MagicMock()
|
||||
args = self._get_client_mock_args(provision_state='wait call-back')
|
||||
|
||||
n_shell.do_node_list(client_mock, args)
|
||||
client_mock.node.list.assert_called_once_with(
|
||||
provision_state='wait call-back',
|
||||
detail=False)
|
||||
|
||||
def test_do_node_list_detail(self):
|
||||
client_mock = mock.MagicMock()
|
||||
args = self._get_client_mock_args(detail=True)
|
||||
|
@ -38,7 +38,8 @@ class NodeManager(base.Manager):
|
||||
return '/v1/nodes/%s' % id if id else '/v1/nodes'
|
||||
|
||||
def list(self, associated=None, maintenance=None, marker=None, limit=None,
|
||||
detail=False, sort_key=None, sort_dir=None, fields=None):
|
||||
detail=False, sort_key=None, sort_dir=None, fields=None,
|
||||
provision_state=None):
|
||||
"""Retrieve a list of nodes.
|
||||
|
||||
:param associated: Optional. Either a Boolean or a string
|
||||
@ -50,6 +51,8 @@ class NodeManager(base.Manager):
|
||||
to return nodes in maintenance mode (True or
|
||||
"True"), or not in maintenance mode (False or
|
||||
"False").
|
||||
:param provision_state: Optional. String value to get only nodes in
|
||||
that provision state.
|
||||
:param marker: Optional, the UUID of a node, eg the last
|
||||
node from a previous result set. Return
|
||||
the next result set.
|
||||
@ -90,6 +93,8 @@ class NodeManager(base.Manager):
|
||||
filters.append('associated=%s' % associated)
|
||||
if maintenance is not None:
|
||||
filters.append('maintenance=%s' % maintenance)
|
||||
if provision_state is not None:
|
||||
filters.append('provision_state=%s' % provision_state)
|
||||
|
||||
path = ''
|
||||
if detail:
|
||||
|
@ -95,6 +95,10 @@ def do_node_show(cc, args):
|
||||
'--associated',
|
||||
metavar='<boolean>',
|
||||
help="List nodes by instance association: 'true' or 'false'.")
|
||||
@cliutils.arg(
|
||||
'--provision-state',
|
||||
metavar='<provision-state>',
|
||||
help="List nodes in specified provision state.")
|
||||
@cliutils.arg(
|
||||
'--detail',
|
||||
dest='detail',
|
||||
@ -119,6 +123,8 @@ def do_node_list(cc, args):
|
||||
if args.maintenance is not None:
|
||||
params['maintenance'] = utils.bool_argument_value("--maintenance",
|
||||
args.maintenance)
|
||||
if args.provision_state is not None:
|
||||
params['provision_state'] = args.provision_state
|
||||
params['detail'] = args.detail
|
||||
|
||||
if args.detail:
|
||||
|
Loading…
x
Reference in New Issue
Block a user