diff options
| author | Rodion Promyshlennikov <rpromyshlennikov@mirantis.com> | 2016-08-26 10:47:42 +0300 |
|---|---|---|
| committer | Rodion Promyshlennikov <rpromyshlennikov@mirantis.com> | 2016-08-26 10:47:42 +0300 |
| commit | 1add122169c1b1beef61813e588c88ada7b7ca90 (patch) | |
| tree | 0698ded4b75d1363125d3c20d97a9c64908acd9c | |
| parent | 0de23b7c2a74af057c853a16b74cde4423c2b3f4 (diff) | |
| download | python-ironicclient-1add122169c1b1beef61813e588c88ada7b7ca90.tar.gz | |
Add baremetal port list command to OSC plugin
Partial-Bug: #1526479
Change-Id: Ibfba276c3f4c0c090c48897716aaf4fb193370b0
| -rw-r--r-- | ironicclient/osc/v1/baremetal_port.py | 97 | ||||
| -rw-r--r-- | ironicclient/tests/unit/osc/v1/fakes.py | 3 | ||||
| -rw-r--r-- | ironicclient/tests/unit/osc/v1/test_baremetal_port.py | 131 | ||||
| -rw-r--r-- | releasenotes/notes/osc-plugin-7769f5bef627654c.yaml | 6 | ||||
| -rw-r--r-- | setup.cfg | 1 |
5 files changed, 232 insertions, 6 deletions
diff --git a/ironicclient/osc/v1/baremetal_port.py b/ironicclient/osc/v1/baremetal_port.py index 711dacc..db5289d 100644 --- a/ironicclient/osc/v1/baremetal_port.py +++ b/ironicclient/osc/v1/baremetal_port.py @@ -18,6 +18,7 @@ import itertools import logging from osc_lib.command import command +from osc_lib import utils as oscutils from ironicclient.common.i18n import _ from ironicclient.common import utils @@ -276,3 +277,99 @@ class DeleteBaremetalPort(command.Command): if failures: raise exc.ClientException("\n".join(failures)) + + +class ListBaremetalPort(command.Lister): + """List baremetal ports.""" + + log = logging.getLogger(__name__ + ".ListBaremetalPort") + + def get_parser(self, prog_name): + parser = super(ListBaremetalPort, self).get_parser(prog_name) + parser.add_argument( + '--address', + dest='address', + metavar='<mac-address>', + help="Only show information for the port with this MAC address." + ) + parser.add_argument( + '--limit', + metavar='<limit>', + type=int, + help='Maximum number of ports to return per request, ' + '0 for no limit. Default is the maximum number used ' + 'by the Ironic API Service.' + ) + parser.add_argument( + '--marker', + metavar='<port>', + help='Port UUID (for example, of the last port in the list from a ' + 'previous request). ' + 'Returns the list of ports after this UUID.' + ) + parser.add_argument( + '--sort', + metavar="<key>[:<direction>]", + help='Sort output by specified port fields and directions ' + '(asc or desc) (default: asc). Multiple fields and ' + 'directions can be specified, separated by comma.' + ) + display_group = parser.add_mutually_exclusive_group() + display_group.add_argument( + '--long', + dest='detail', + action='store_true', + default=False, + help="Show detailed information about ports.") + display_group.add_argument( + '--fields', + nargs='+', + dest='fields', + metavar='<field>', + action='append', + default=[], + choices=res_fields.PORT_DETAILED_RESOURCE.fields, + help="One or more port fields. Only these fields will be fetched " + "from the server. " + "Can not be used when '--long' is specified.") + return parser + + def take_action(self, parsed_args): + self.log.debug("take_action(%s)" % parsed_args) + client = self.app.client_manager.baremetal + + columns = res_fields.PORT_RESOURCE.fields + labels = res_fields.PORT_RESOURCE.labels + + params = {} + if parsed_args.limit is not None and parsed_args.limit < 0: + raise exc.CommandError( + _('Expected non-negative --limit, got %s') % + parsed_args.limit) + params['limit'] = parsed_args.limit + params['marker'] = parsed_args.marker + + if parsed_args.address is not None: + params['address'] = parsed_args.address + + if parsed_args.detail: + params['detail'] = parsed_args.detail + columns = res_fields.PORT_DETAILED_RESOURCE.fields + labels = res_fields.PORT_DETAILED_RESOURCE.labels + + elif parsed_args.fields: + params['detail'] = False + fields = itertools.chain.from_iterable(parsed_args.fields) + resource = res_fields.Resource(list(fields)) + columns = resource.fields + labels = resource.labels + params['fields'] = columns + + self.log.debug("params(%s)" % params) + data = client.port.list(**params) + + data = oscutils.sort_items(data, parsed_args.sort) + + return (labels, + (oscutils.get_item_properties(s, columns, formatters={ + 'extra': oscutils.format_dict},) for s in data)) diff --git a/ironicclient/tests/unit/osc/v1/fakes.py b/ironicclient/tests/unit/osc/v1/fakes.py index 2f8111e..f0c3f1e 100644 --- a/ironicclient/tests/unit/osc/v1/fakes.py +++ b/ironicclient/tests/unit/osc/v1/fakes.py @@ -38,7 +38,8 @@ BAREMETAL = { baremetal_port_uuid = 'zzz-zzzzzz-zzzz' baremetal_port_address = 'AA:BB:CC:DD:EE:FF' -baremetal_port_extra = {} +baremetal_port_extra = {'key1': 'value1', + 'key2': 'value2'} BAREMETAL_PORT = { 'uuid': baremetal_port_uuid, diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py index e66083b..9a7829f 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py @@ -17,7 +17,8 @@ import copy import mock -from osc_lib.tests import utils as oscutils +from osc_lib.tests import utils as osctestutils +from osc_lib import utils as oscutils from ironicclient import exc from ironicclient.osc.v1 import baremetal_port @@ -181,7 +182,7 @@ class TestShowBaremetalPort(TestBaremetalPort): arglist = [] verifylist = [] - self.assertRaises(oscutils.ParserException, + self.assertRaises(osctestutils.ParserException, self.check_parser, self.cmd, arglist, verifylist) @@ -201,7 +202,7 @@ class TestBaremetalPortUnset(TestBaremetalPort): def test_baremetal_port_unset_no_options(self): arglist = [] verifylist = [] - self.assertRaises(oscutils.ParserException, + self.assertRaises(osctestutils.ParserException, self.check_parser, self.cmd, arglist, verifylist) @@ -293,7 +294,7 @@ class TestBaremetalPortSet(TestBaremetalPort): def test_baremetal_port_set_no_options(self): arglist = [] verifylist = [] - self.assertRaises(oscutils.ParserException, + self.assertRaises(osctestutils.ParserException, self.check_parser, self.cmd, arglist, verifylist) @@ -351,6 +352,126 @@ class TestBaremetalPortDelete(TestBaremetalPort): arglist = [] verifylist = [] - self.assertRaises(oscutils.ParserException, + self.assertRaises(osctestutils.ParserException, + self.check_parser, + self.cmd, arglist, verifylist) + + +class TestBaremetalPortList(TestBaremetalPort): + def setUp(self): + super(TestBaremetalPortList, self).setUp() + + self.baremetal_mock.port.list.return_value = [ + baremetal_fakes.FakeBaremetalResource( + None, + copy.deepcopy(baremetal_fakes.BAREMETAL_PORT), + loaded=True) + ] + + self.cmd = baremetal_port.ListBaremetalPort(self.app, None) + + def test_baremetal_port_list(self): + arglist = [] + verifylist = [] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + kwargs = { + 'marker': None, + 'limit': None} + self.baremetal_mock.port.list.assert_called_with(**kwargs) + + collist = ( + "UUID", + "Address") + self.assertEqual(collist, columns) + + datalist = (( + baremetal_fakes.baremetal_port_uuid, + baremetal_fakes.baremetal_port_address + ), ) + self.assertEqual(datalist, tuple(data)) + + def test_baremetal_port_list_address(self): + arglist = ['--address', baremetal_fakes.baremetal_port_address] + verifylist = [('address', baremetal_fakes.baremetal_port_address)] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + kwargs = { + 'address': baremetal_fakes.baremetal_port_address, + '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)] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + columns, data = self.cmd.take_action(parsed_args) + + kwargs = { + 'detail': True, + 'marker': None, + 'limit': None, + } + self.baremetal_mock.port.list.assert_called_with(**kwargs) + + collist = ('UUID', 'Address', 'Created At', 'Extra', 'Node UUID', + 'Local Link Connection', 'PXE boot enabled', 'Updated At', + 'Internal Info') + self.assertEqual(collist, columns) + + datalist = (( + baremetal_fakes.baremetal_port_uuid, + baremetal_fakes.baremetal_port_address, + '', + oscutils.format_dict(baremetal_fakes.baremetal_port_extra), + baremetal_fakes.baremetal_uuid, + '', + '', + '', + '' + ), ) + self.assertEqual(datalist, tuple(data)) + + def test_baremetal_port_list_fields(self): + arglist = ['--fields', 'uuid', 'address'] + verifylist = [('fields', [['uuid', 'address']])] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.cmd.take_action(parsed_args) + + kwargs = { + 'marker': None, + 'limit': None, + 'detail': False, + 'fields': ('uuid', 'address') + } + self.baremetal_mock.port.list.assert_called_with(**kwargs) + + def test_baremetal_port_list_fields_multiple(self): + arglist = ['--fields', 'uuid', 'address', '--fields', 'extra'] + verifylist = [('fields', [['uuid', 'address'], ['extra']])] + + parsed_args = self.check_parser(self.cmd, arglist, verifylist) + self.cmd.take_action(parsed_args) + + kwargs = { + 'marker': None, + 'limit': None, + 'detail': False, + 'fields': ('uuid', 'address', 'extra') + } + self.baremetal_mock.port.list.assert_called_with(**kwargs) + + def test_baremetal_port_list_invalid_fields(self): + arglist = ['--fields', 'uuid', 'invalid'] + verifylist = [('fields', [['uuid', 'invalid']])] + self.assertRaises(osctestutils.ParserException, self.check_parser, self.cmd, arglist, verifylist) diff --git a/releasenotes/notes/osc-plugin-7769f5bef627654c.yaml b/releasenotes/notes/osc-plugin-7769f5bef627654c.yaml new file mode 100644 index 0000000..2d45c83 --- /dev/null +++ b/releasenotes/notes/osc-plugin-7769f5bef627654c.yaml @@ -0,0 +1,6 @@ +--- +features: + - | + Extend the OpenStackClient plugin with the new command: + + * openstack baremetal port list @@ -53,6 +53,7 @@ openstack.baremetal.v1 = baremetal_node_unset = ironicclient.osc.v1.baremetal_node:UnsetBaremetalNode baremetal_port_create = ironicclient.osc.v1.baremetal_port:CreateBaremetalPort baremetal_port_delete = ironicclient.osc.v1.baremetal_port:DeleteBaremetalPort + baremetal_port_list = ironicclient.osc.v1.baremetal_port:ListBaremetalPort baremetal_port_set = ironicclient.osc.v1.baremetal_port:SetBaremetalPort baremetal_port_show = ironicclient.osc.v1.baremetal_port:ShowBaremetalPort baremetal_port_unset = ironicclient.osc.v1.baremetal_port:UnsetBaremetalPort |
