Add DRIVER_RESOURCE to remove duplicated strings
This cleans up the driver-related code so that the fields and labels used for driver resources are in v1/resource_fields.py. This makes it consistent with the other resources (node, port, etc). Change-Id: I4d546d1ad3be997a23be4e2d9c919644bf8ce804
This commit is contained in:
parent
addae9f500
commit
c2a0ef1bce
|
@ -38,8 +38,8 @@ class ListBaremetalDriver(command.Lister):
|
|||
self.log.debug("take_action(%s)", parsed_args)
|
||||
client = self.app.client_manager.baremetal
|
||||
|
||||
labels = ['Supported driver(s)', 'Active host(s)']
|
||||
columns = ['name', 'hosts']
|
||||
labels = res_fields.DRIVER_RESOURCE.labels
|
||||
columns = res_fields.DRIVER_RESOURCE.fields
|
||||
|
||||
drivers = client.driver.list()
|
||||
drivers = oscutils.sort_items(drivers, 'name')
|
||||
|
|
|
@ -62,6 +62,31 @@ class ResourceTest(testtools.TestCase):
|
|||
['item_3', 'item1', '2nd_item'],
|
||||
sort_excluded=['item1', 'foo'])
|
||||
|
||||
def test_override_labels(self):
|
||||
# Test overriding labels
|
||||
foo = resource_fields.Resource(['item_3', 'item1', '2nd_item'],
|
||||
override_labels={'item1': 'One'})
|
||||
self.assertEqual(('Third item', 'One', 'A second item'), foo.labels)
|
||||
self.assertEqual(('Third item', 'One', 'A second item'),
|
||||
foo.sort_labels)
|
||||
|
||||
def test_override_labels_unknown(self):
|
||||
# Test overriding labels with key not in field_ids
|
||||
self.assertRaises(
|
||||
ValueError,
|
||||
resource_fields.Resource,
|
||||
['item_3', 'item1', '2nd_item'],
|
||||
override_labels={'foo': 'One'})
|
||||
|
||||
def test_sort_excluded_override_labels(self):
|
||||
# Test excluding of fields for sort purposes and overriding labels
|
||||
foo = resource_fields.Resource(['item_3', 'item1', '2nd_item'],
|
||||
sort_excluded=['item1'],
|
||||
override_labels={'item_3': 'Three'})
|
||||
self.assertEqual(('Three', 'ITEM1', 'A second item'), foo.labels)
|
||||
self.assertEqual(('item_3', '2nd_item'), foo.sort_fields)
|
||||
self.assertEqual(('Three', 'A second item'), foo.sort_labels)
|
||||
|
||||
def test_unknown_field_id(self):
|
||||
self.assertRaises(
|
||||
KeyError,
|
||||
|
|
|
@ -22,7 +22,7 @@ from ironicclient.v1 import utils as v1_utils
|
|||
|
||||
|
||||
def _print_driver_show(driver, json=False):
|
||||
fields = ['name', 'hosts']
|
||||
fields = res_fields.DRIVER_RESOURCE.fields
|
||||
data = dict([(f, getattr(driver, f, '')) for f in fields])
|
||||
cliutils.print_dict(data, wrap=72, json_flag=json)
|
||||
|
||||
|
@ -34,8 +34,8 @@ def do_driver_list(cc, args):
|
|||
# It's easier to read.
|
||||
for d in drivers:
|
||||
d.hosts = ', '.join(d.hosts)
|
||||
field_labels = ['Supported driver(s)', 'Active host(s)']
|
||||
fields = ['name', 'hosts']
|
||||
field_labels = res_fields.DRIVER_RESOURCE.labels
|
||||
fields = res_fields.DRIVER_RESOURCE.fields
|
||||
cliutils.print_list(drivers, fields, field_labels=field_labels,
|
||||
json_flag=args.json)
|
||||
|
||||
|
|
|
@ -43,6 +43,7 @@ class Resource(object):
|
|||
'driver_info': 'Driver Info',
|
||||
'driver_internal_info': 'Driver Internal Info',
|
||||
'extra': 'Extra',
|
||||
'hosts': 'Active host(s)',
|
||||
'http_methods': 'Supported HTTP methods',
|
||||
'inspection_finished_at': 'Inspection Finished At',
|
||||
'inspection_started_at': 'Inspection Started At',
|
||||
|
@ -83,7 +84,7 @@ class Resource(object):
|
|||
'id': 'ID',
|
||||
}
|
||||
|
||||
def __init__(self, field_ids, sort_excluded=None):
|
||||
def __init__(self, field_ids, sort_excluded=None, override_labels=None):
|
||||
"""Create a Resource object
|
||||
|
||||
:param field_ids: A list of strings that the Resource object will
|
||||
|
@ -91,21 +92,39 @@ class Resource(object):
|
|||
FIELDS.
|
||||
:param sort_excluded: Optional. A list of strings that will not be used
|
||||
for sorting. Must be a subset of 'field_ids'.
|
||||
:param override_labels: Optional. A dictionary, where key is a field ID
|
||||
and value is the label to be used. If
|
||||
unspecified, uses the labels associated with
|
||||
the fields from global FIELDS.
|
||||
|
||||
:raises: ValueError if sort_excluded contains value not in field_ids
|
||||
:raises: ValueError if sort_excluded or override_labels contains values
|
||||
not in field_ids
|
||||
"""
|
||||
def check_param_fields(param_name, param_fields):
|
||||
not_existing = set(param_fields) - set(field_ids)
|
||||
if not_existing:
|
||||
raise ValueError(
|
||||
_("%(param)s specified with value not contained in "
|
||||
"field_ids. Unknown value(s): %(unknown)s")
|
||||
% {'param': param_name, 'unknown': ','.join(not_existing)})
|
||||
|
||||
if override_labels is None:
|
||||
override_labels = {}
|
||||
else:
|
||||
check_param_fields('override_labels', override_labels.keys())
|
||||
|
||||
self._fields = tuple(field_ids)
|
||||
self._labels = tuple([self.FIELDS[x] for x in field_ids])
|
||||
self._labels = tuple([override_labels.get(x) or self.FIELDS[x]
|
||||
for x in field_ids])
|
||||
|
||||
if sort_excluded is None:
|
||||
sort_excluded = []
|
||||
not_existing = set(sort_excluded) - set(field_ids)
|
||||
if not_existing:
|
||||
raise ValueError(
|
||||
_("sort_excluded specified with value not contained in "
|
||||
"field_ids. Unknown value(s): %s") % ','.join(not_existing))
|
||||
else:
|
||||
check_param_fields('sort_excluded', sort_excluded)
|
||||
self._sort_fields = tuple(
|
||||
[x for x in field_ids if x not in sort_excluded])
|
||||
self._sort_labels = tuple([self.FIELDS[x] for x in self._sort_fields])
|
||||
self._sort_labels = tuple([override_labels.get(x) or self.FIELDS[x]
|
||||
for x in self._sort_fields])
|
||||
|
||||
@property
|
||||
def fields(self):
|
||||
|
@ -270,3 +289,11 @@ PORTGROUP_RESOURCE = Resource(
|
|||
VIF_RESOURCE = Resource(
|
||||
['id'],
|
||||
)
|
||||
|
||||
# Drivers
|
||||
DRIVER_RESOURCE = Resource(
|
||||
['name',
|
||||
'hosts',
|
||||
],
|
||||
override_labels={'name': 'Supported driver(s)'}
|
||||
)
|
||||
|
|
Loading…
Reference in New Issue