summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRodion Promyshlennikov <rpromyshlennikov@mirantis.com>2016-08-26 10:47:42 +0300
committerRodion Promyshlennikov <rpromyshlennikov@mirantis.com>2016-08-26 10:47:42 +0300
commit1add122169c1b1beef61813e588c88ada7b7ca90 (patch)
tree0698ded4b75d1363125d3c20d97a9c64908acd9c
parent0de23b7c2a74af057c853a16b74cde4423c2b3f4 (diff)
downloadpython-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.py97
-rw-r--r--ironicclient/tests/unit/osc/v1/fakes.py3
-rw-r--r--ironicclient/tests/unit/osc/v1/test_baremetal_port.py131
-rw-r--r--releasenotes/notes/osc-plugin-7769f5bef627654c.yaml6
-rw-r--r--setup.cfg1
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
diff --git a/setup.cfg b/setup.cfg
index be3acce..443f0a8 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -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