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:
Ruby Loo 2017-03-02 23:27:14 -05:00
parent addae9f500
commit c2a0ef1bce
4 changed files with 66 additions and 14 deletions

View File

@ -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')

View File

@ -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,

View File

@ -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)

View File

@ -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)'}
)