Fix field names for selection and json

Whenever we list baremetal nodes  with JSON format, there's an
inconsisency between the field names specified in the command and
the field names returned in the JSON output.
Users request field names (e.g. created_at) it should return as
created_at not (e.g. Created At) pretty Json format response.

This change modifies the ListBaremetalNode.take_action() to return the
field name (columns) instead of pretty labels. So that input and output
remains consistent.

Updated all the repeative objects to match change made in the
ListBaremetalNode.take_action() and removed unused labels using Claude.

Closes-bug: #2138466
Change-Id: Ia66f08a020ecf932f21775939c9b436ec147d738
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
Signed-off-by: Abhishek Bongale <abhishekbongale@outlook.com>
This commit is contained in:
Abhishek Bongale
2026-01-20 14:33:50 +00:00
parent 25b7779c54
commit fe9a35908c
26 changed files with 315 additions and 329 deletions

View File

@@ -231,23 +231,20 @@ class ListBaremetalAllocation(command.Lister):
if parsed_args.long:
columns = res_fields.ALLOCATION_DETAILED_RESOURCE.fields
labels = res_fields.ALLOCATION_DETAILED_RESOURCE.labels
elif parsed_args.fields:
fields = itertools.chain.from_iterable(parsed_args.fields)
resource = res_fields.Resource(list(fields))
columns = resource.fields
labels = resource.labels
params['fields'] = columns
else:
columns = res_fields.ALLOCATION_RESOURCE.fields
labels = res_fields.ALLOCATION_RESOURCE.labels
self.log.debug("params(%s)", params)
data = client.allocation.list(**params)
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns) for s in data))

View File

@@ -162,7 +162,6 @@ class ListBaremetalChassis(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.CHASSIS_RESOURCE.fields
labels = res_fields.CHASSIS_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -174,13 +173,11 @@ class ListBaremetalChassis(command.Lister):
if parsed_args.long:
params['detail'] = parsed_args.long
columns = res_fields.CHASSIS_DETAILED_RESOURCE.fields
labels = res_fields.CHASSIS_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)
@@ -188,7 +185,7 @@ class ListBaremetalChassis(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns, formatters={
'Properties': utils.HashColumn},) for s in data))

View File

@@ -79,7 +79,6 @@ class ListBaremetalConductor(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.CONDUCTOR_RESOURCE.fields
labels = res_fields.CONDUCTOR_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -91,13 +90,11 @@ class ListBaremetalConductor(command.Lister):
if parsed_args.long:
params['detail'] = parsed_args.long
columns = res_fields.CONDUCTOR_DETAILED_RESOURCE.fields
labels = res_fields.CONDUCTOR_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)
@@ -105,7 +102,7 @@ class ListBaremetalConductor(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns, formatters={
'Properties': utils.HashColumn},) for s in data))

View File

@@ -313,7 +313,6 @@ class ListBaremetalDeployTemplate(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.DEPLOY_TEMPLATE_RESOURCE.fields
labels = res_fields.DEPLOY_TEMPLATE_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -326,14 +325,12 @@ class ListBaremetalDeployTemplate(command.Lister):
if parsed_args.detail:
params['detail'] = parsed_args.detail
columns = res_fields.DEPLOY_TEMPLATE_DETAILED_RESOURCE.fields
labels = res_fields.DEPLOY_TEMPLATE_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)
@@ -341,5 +338,5 @@ class ListBaremetalDeployTemplate(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns) for s in data))

View File

@@ -64,16 +64,13 @@ class ListBaremetalDriver(command.Lister):
params = {'driver_type': parsed_args.type,
'detail': parsed_args.long}
if parsed_args.long:
labels = res_fields.DRIVER_DETAILED_RESOURCE.labels
columns = res_fields.DRIVER_DETAILED_RESOURCE.fields
elif parsed_args.fields:
fields = itertools.chain.from_iterable(parsed_args.fields)
resource = res_fields.Resource(list(fields))
columns = resource.fields
labels = resource.labels
params['fields'] = columns
else:
labels = res_fields.DRIVER_RESOURCE.labels
columns = res_fields.DRIVER_RESOURCE.fields
drivers = client.driver.list(**params)
@@ -84,7 +81,7 @@ class ListBaremetalDriver(command.Lister):
data = [utils.convert_list_props_to_comma_separated(d._info)
for d in drivers]
return (labels,
return (columns,
(oscutils.get_dict_properties(s, columns) for s in data))
@@ -107,8 +104,8 @@ class ListBaremetalDriverProperty(command.Lister):
driver_properties = baremetal_client.driver.properties(
parsed_args.driver)
labels = ['Property', 'Description']
return labels, sorted(driver_properties.items())
columns = ['property', 'description']
return columns, sorted(driver_properties.items())
class ListBaremetalDriverRaidProperty(command.Lister):
@@ -131,8 +128,8 @@ class ListBaremetalDriverRaidProperty(command.Lister):
raid_props = baremetal_client.driver.raid_logical_disk_properties(
parsed_args.driver)
labels = ['Property', 'Description']
return labels, sorted(raid_props.items())
columns = ['property', 'description']
return columns, sorted(raid_props.items())
class PassthruCallBaremetalDriver(command.ShowOne):
@@ -203,7 +200,6 @@ class PassthruListBaremetalDriver(command.Lister):
baremetal_client = self.app.client_manager.baremetal
columns = res_fields.VENDOR_PASSTHRU_METHOD_RESOURCE.fields
labels = res_fields.VENDOR_PASSTHRU_METHOD_RESOURCE.labels
methods = baremetal_client.driver.get_vendor_passthru_methods(
parsed_args.driver)
@@ -215,7 +211,7 @@ class PassthruListBaremetalDriver(command.Lister):
response['http_methods'] = http_methods
params.append(response)
return (labels,
return (columns,
(oscutils.get_dict_properties(s, columns) for s in params))

View File

@@ -380,7 +380,6 @@ class ListBaremetalInspectionRule(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.INSPECTION_RULE_RESOURCE.fields
labels = res_fields.INSPECTION_RULE_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -393,14 +392,12 @@ class ListBaremetalInspectionRule(command.Lister):
if parsed_args.detail:
params['detail'] = parsed_args.detail
columns = res_fields.INSPECTION_RULE_DETAILED_RESOURCE.fields
labels = res_fields.INSPECTION_RULE_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)
@@ -408,5 +405,5 @@ class ListBaremetalInspectionRule(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns) for s in data))

View File

@@ -890,7 +890,6 @@ class ListBaremetalNode(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.NODE_RESOURCE.fields
labels = res_fields.NODE_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -919,13 +918,11 @@ class ListBaremetalNode(command.Lister):
if parsed_args.long:
params['detail'] = parsed_args.long
columns = res_fields.NODE_DETAILED_RESOURCE.fields
labels = res_fields.NODE_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)
@@ -933,7 +930,7 @@ class ListBaremetalNode(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns, formatters={
'Properties': utils.HashColumn},) for s in data))
@@ -2045,12 +2042,11 @@ class VifListBaremetalNode(command.Lister):
self.log.debug("take_action(%s)", parsed_args)
columns = res_fields.VIF_RESOURCE.fields
labels = res_fields.VIF_RESOURCE.labels
baremetal_client = self.app.client_manager.baremetal
data = baremetal_client.node.vif_list(parsed_args.node)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns) for s in data))
@@ -2168,12 +2164,12 @@ class ListTraitsBaremetalNode(command.Lister):
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
labels = res_fields.TRAIT_RESOURCE.labels
columns = res_fields.TRAIT_RESOURCE.fields
baremetal_client = self.app.client_manager.baremetal
traits = baremetal_client.node.get_traits(parsed_args.node)
return (labels, [[trait] for trait in traits])
return (columns, [[trait] for trait in traits])
class AddTraitBaremetalNode(command.Command):
@@ -2299,20 +2295,17 @@ class ListBIOSSettingBaremetalNode(command.Lister):
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
labels = res_fields.BIOS_RESOURCE.labels
fields = res_fields.BIOS_RESOURCE.fields
params = {}
if parsed_args.long:
params['detail'] = parsed_args.long
fields = res_fields.BIOS_DETAILED_RESOURCE.fields
labels = res_fields.BIOS_DETAILED_RESOURCE.labels
elif parsed_args.fields:
params['detail'] = False
fields = itertools.chain.from_iterable(parsed_args.fields)
resource = res_fields.Resource(list(fields))
fields = resource.fields
labels = resource.labels
params['fields'] = fields
self.log.debug("params(%s)", params)
@@ -2321,7 +2314,7 @@ class ListBIOSSettingBaremetalNode(command.Lister):
settings = baremetal_client.node.list_bios_settings(parsed_args.node,
**params)
return (labels,
return (fields,
(oscutils.get_dict_properties(s, fields) for s in settings))
@@ -2381,17 +2374,15 @@ class NodeHistoryList(command.Lister):
baremetal_client = self.app.client_manager.baremetal
if parsed_args.long:
labels = res_fields.NODE_HISTORY_DETAILED_RESOURCE.labels
fields = res_fields.NODE_HISTORY_DETAILED_RESOURCE.fields
else:
labels = res_fields.NODE_HISTORY_RESOURCE.labels
fields = res_fields.NODE_HISTORY_RESOURCE.fields
data = baremetal_client.node.get_history_list(
parsed_args.node,
parsed_args.long)
return (labels,
return (fields,
(oscutils.get_dict_properties(s, fields) for s in data))
@@ -2481,11 +2472,11 @@ class NodeChildrenList(command.ShowOne):
baremetal_client = self.app.client_manager.baremetal
labels = res_fields.CHILDREN_RESOURCE.labels
columns = res_fields.CHILDREN_RESOURCE.fields
data = baremetal_client.node.list_children_of_node(
parsed_args.node)
return (labels, [[node] for node in data])
return (columns, [[node] for node in data])
class ListFirmwareComponentBaremetalNode(command.Lister):
@@ -2507,12 +2498,11 @@ class ListFirmwareComponentBaremetalNode(command.Lister):
def take_action(self, parsed_args):
self.log.debug("take_action(%s)", parsed_args)
labels = res_fields.FIRMWARE_RESOURCE.labels
fields = res_fields.FIRMWARE_RESOURCE.fields
baremetal_client = self.app.client_manager.baremetal
components = baremetal_client.node.list_firmware_components(
parsed_args.node)
return (labels,
return (fields,
(oscutils.get_dict_properties(s, fields) for s in components))

View File

@@ -563,7 +563,6 @@ class ListBaremetalPort(command.Lister):
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:
@@ -583,14 +582,12 @@ class ListBaremetalPort(command.Lister):
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)
@@ -598,6 +595,6 @@ class ListBaremetalPort(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns, formatters={
'extra': utils.HashColumn},) for s in data))

View File

@@ -235,7 +235,6 @@ class ListBaremetalPortGroup(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.PORTGROUP_RESOURCE.fields
labels = res_fields.PORTGROUP_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -254,13 +253,11 @@ class ListBaremetalPortGroup(command.Lister):
if parsed_args.detail:
params['detail'] = parsed_args.detail
columns = res_fields.PORTGROUP_DETAILED_RESOURCE.fields
labels = res_fields.PORTGROUP_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)
@@ -268,7 +265,7 @@ class ListBaremetalPortGroup(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns, formatters={
'Properties': utils.HashColumn},) for s in data))

View File

@@ -382,7 +382,6 @@ class ListBaremetalRunbook(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.RUNBOOK_RESOURCE.fields
labels = res_fields.RUNBOOK_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -395,14 +394,12 @@ class ListBaremetalRunbook(command.Lister):
if parsed_args.detail:
params['detail'] = parsed_args.detail
columns = res_fields.RUNBOOK_DETAILED_RESOURCE.fields
labels = res_fields.RUNBOOK_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)
@@ -410,5 +407,5 @@ class ListBaremetalRunbook(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns) for s in data))

View File

@@ -30,7 +30,6 @@ class ListBaremetalShard(command.Lister):
data = client.shard.list()
columns = res_fields.SHARD_RESOURCE.fields
labels = res_fields.SHARD_RESOURCE.labels
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns) for s in data))

View File

@@ -187,7 +187,6 @@ class ListBaremetalVolumeConnector(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.VOLUME_CONNECTOR_RESOURCE.fields
labels = res_fields.VOLUME_CONNECTOR_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -202,13 +201,11 @@ class ListBaremetalVolumeConnector(command.Lister):
if parsed_args.detail:
params['detail'] = parsed_args.detail
columns = res_fields.VOLUME_CONNECTOR_DETAILED_RESOURCE.fields
labels = res_fields.VOLUME_CONNECTOR_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)
@@ -216,7 +213,7 @@ class ListBaremetalVolumeConnector(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns, formatters={
'Properties': utils.HashColumn},) for s in data))

View File

@@ -203,7 +203,6 @@ class ListBaremetalVolumeTarget(command.Lister):
client = self.app.client_manager.baremetal
columns = res_fields.VOLUME_TARGET_RESOURCE.fields
labels = res_fields.VOLUME_TARGET_RESOURCE.labels
params = {}
if parsed_args.limit is not None and parsed_args.limit < 0:
@@ -218,13 +217,11 @@ class ListBaremetalVolumeTarget(command.Lister):
if parsed_args.detail:
params['detail'] = parsed_args.detail
columns = res_fields.VOLUME_TARGET_DETAILED_RESOURCE.fields
labels = res_fields.VOLUME_TARGET_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)
@@ -232,7 +229,7 @@ class ListBaremetalVolumeTarget(command.Lister):
data = oscutils.sort_items(data, parsed_args.sort)
return (labels,
return (columns,
(oscutils.get_item_properties(s, columns, formatters={
'Properties': utils.HashColumn},) for s in data))

View File

@@ -294,11 +294,11 @@ class TestBaremetalAllocationList(TestBaremetalAllocation):
self.baremetal_mock.allocation.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Name",
"Resource Class",
"State",
"Node UUID")
"uuid",
"name",
"resource_class",
"state",
"node_uuid")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_uuid,
@@ -322,11 +322,11 @@ class TestBaremetalAllocationList(TestBaremetalAllocation):
self.baremetal_mock.allocation.list.assert_called_once_with(**kwargs)
collist = (
"UUID",
"Name",
"Resource Class",
"State",
"Node UUID")
"uuid",
"name",
"resource_class",
"state",
"node_uuid")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_uuid,
@@ -352,11 +352,11 @@ class TestBaremetalAllocationList(TestBaremetalAllocation):
self.baremetal_mock.allocation.list.assert_called_once_with(**kwargs)
collist = (
"UUID",
"Name",
"Resource Class",
"State",
"Node UUID")
"uuid",
"name",
"resource_class",
"state",
"node_uuid")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_uuid,
@@ -382,11 +382,11 @@ class TestBaremetalAllocationList(TestBaremetalAllocation):
self.baremetal_mock.allocation.list.assert_called_once_with(**kwargs)
collist = (
"UUID",
"Name",
"Resource Class",
"State",
"Node UUID")
"uuid",
"name",
"resource_class",
"state",
"node_uuid")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_uuid,
@@ -410,11 +410,11 @@ class TestBaremetalAllocationList(TestBaremetalAllocation):
self.baremetal_mock.allocation.list.assert_called_once_with(**kwargs)
collist = (
"UUID",
"Name",
"Resource Class",
"State",
"Node UUID")
"uuid",
"name",
"resource_class",
"state",
"node_uuid")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_uuid,
@@ -437,18 +437,18 @@ class TestBaremetalAllocationList(TestBaremetalAllocation):
}
self.baremetal_mock.allocation.list.assert_called_once_with(**kwargs)
collist = ('UUID',
'Name',
'State',
'Owner',
'Node UUID',
'Last Error',
'Resource Class',
'Traits',
'Candidate Nodes',
'Extra',
'Created At',
'Updated At')
collist = ('uuid',
'name',
'state',
'owner',
'node_uuid',
'last_error',
'resource_class',
'traits',
'candidate_nodes',
'extra',
'created_at',
'updated_at')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_uuid,

View File

@@ -209,8 +209,8 @@ class TestChassisList(TestChassis):
)
collist = (
"UUID",
"Description",
"uuid",
"description",
)
self.assertEqual(collist, columns)
datalist = ((
@@ -243,7 +243,7 @@ class TestChassisList(TestChassis):
**kwargs
)
collist = ('UUID', 'Description', 'Created At', 'Updated At', 'Extra')
collist = ('uuid', 'description', 'created_at', 'updated_at', 'extra')
self.assertEqual(collist, columns)
datalist = ((
baremetal_fakes.baremetal_chassis_uuid,

View File

@@ -64,9 +64,9 @@ class TestBaremetalConductorList(TestBaremetalConductor):
)
collist = (
"Hostname",
"Conductor Group",
"Alive",
"hostname",
"conductor_group",
"alive",
)
self.assertEqual(collist, columns)
datalist = ((
@@ -100,21 +100,21 @@ class TestBaremetalConductorList(TestBaremetalConductor):
**kwargs
)
collist = [
'Hostname',
'Conductor Group',
'Alive',
'Drivers',
'Created At',
'Updated At',
]
self.assertEqual(tuple(collist), columns)
collist = tuple([
'hostname',
'conductor_group',
'alive',
'drivers',
'created_at',
'updated_at',
])
self.assertEqual(collist, columns)
fake_values = {
'Hostname': baremetal_fakes.baremetal_hostname,
'Conductor Group': baremetal_fakes.baremetal_conductor_group,
'Alive': baremetal_fakes.baremetal_alive,
'Drivers': baremetal_fakes.baremetal_drivers,
'hostname': baremetal_fakes.baremetal_hostname,
'conductor_group': baremetal_fakes.baremetal_conductor_group,
'alive': baremetal_fakes.baremetal_alive,
'drivers': baremetal_fakes.baremetal_drivers,
}
values = tuple(fake_values.get(name, '') for name in collist)
self.assertEqual((values,), tuple(data))

View File

@@ -374,8 +374,8 @@ class TestBaremetalDeployTemplateList(TestBaremetalDeployTemplate):
self.baremetal_mock.deploy_template.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Name")
"uuid",
"name")
self.assertEqual(collist, columns)
datalist = ((
@@ -398,8 +398,8 @@ class TestBaremetalDeployTemplateList(TestBaremetalDeployTemplate):
}
self.baremetal_mock.deploy_template.list.assert_called_with(**kwargs)
collist = ('UUID', 'Name', 'Steps', 'Extra', 'Created At',
'Updated At')
collist = ('uuid', 'name', 'steps', 'extra', 'created_at',
'updated_at')
self.assertEqual(collist, columns)
datalist = ((

View File

@@ -51,8 +51,8 @@ class TestListBaremetalDriver(TestBaremetalDriver):
columns, data = self.cmd.take_action(parsed_args)
collist = (
"Supported driver(s)",
"Active host(s)")
"name",
"hosts")
self.assertEqual(collist, tuple(columns))
datalist = ((
@@ -68,8 +68,8 @@ class TestListBaremetalDriver(TestBaremetalDriver):
columns, data = self.cmd.take_action(parsed_args)
collist = (
"Supported driver(s)",
"Active host(s)")
"name",
"hosts")
self.assertEqual(collist, tuple(columns))
datalist = ((
@@ -85,35 +85,35 @@ class TestListBaremetalDriver(TestBaremetalDriver):
columns, data = self.cmd.take_action(parsed_args)
collist = (
"Supported driver(s)",
"Type",
"Active host(s)",
'Default BIOS Interface',
'Default Boot Interface',
'Default Console Interface',
'Default Deploy Interface',
'Default Firmware Interface',
'Default Inspect Interface',
'Default Management Interface',
'Default Network Interface',
'Default Power Interface',
'Default RAID Interface',
'Default Rescue Interface',
'Default Storage Interface',
'Default Vendor Interface',
'Enabled BIOS Interfaces',
'Enabled Boot Interfaces',
'Enabled Console Interfaces',
'Enabled Deploy Interfaces',
'Enabled Firmware Interfaces',
'Enabled Inspect Interfaces',
'Enabled Management Interfaces',
'Enabled Network Interfaces',
'Enabled Power Interfaces',
'Enabled RAID Interfaces',
'Enabled Rescue Interfaces',
'Enabled Storage Interfaces',
'Enabled Vendor Interfaces'
"name",
"type",
"hosts",
'default_bios_interface',
'default_boot_interface',
'default_console_interface',
'default_deploy_interface',
'default_firmware_interface',
'default_inspect_interface',
'default_management_interface',
'default_network_interface',
'default_power_interface',
'default_raid_interface',
'default_rescue_interface',
'default_storage_interface',
'default_vendor_interface',
'enabled_bios_interfaces',
'enabled_boot_interfaces',
'enabled_console_interfaces',
'enabled_deploy_interfaces',
'enabled_firmware_interfaces',
'enabled_inspect_interfaces',
'enabled_management_interfaces',
'enabled_network_interfaces',
'enabled_power_interfaces',
'enabled_raid_interfaces',
'enabled_rescue_interfaces',
'enabled_storage_interfaces',
'enabled_vendor_interfaces'
)
self.assertEqual(collist, tuple(columns))
@@ -232,7 +232,7 @@ class TestListBaremetalDriverProperty(TestBaremetalDriver):
columns, data = self.cmd.take_action(parsed_args)
self.baremetal_mock.driver.properties.assert_called_with(*arglist)
collist = ['Property', 'Description']
collist = ['property', 'description']
self.assertEqual(collist, columns)
expected_data = [('property1', 'description1'),
('property2', 'description2')]
@@ -272,7 +272,7 @@ class TestListBaremetalDriverRaidProperty(TestBaremetalDriver):
(self.baremetal_mock.driver.
raid_logical_disk_properties.assert_called_with(*arglist))
collist = ('Property', 'Description')
collist = ('property', 'description')
self.assertEqual(collist, tuple(columns))
expected_data = [('RAIDProperty1', 'driver_raid_property1'),
@@ -388,11 +388,11 @@ class TestPassthruListBaremetalDriver(TestBaremetalDriver):
assert_called_with(*args))
collist = (
"Name",
"Supported HTTP methods",
"Async",
"Description",
"Response is attachment",
"name",
"http_methods",
"async",
"description",
"attach",
)
self.assertEqual(collist, tuple(columns))

View File

@@ -1101,12 +1101,12 @@ class TestBaremetalList(TestBaremetal):
)
collist = (
"UUID",
"Name",
"Instance UUID",
"Power State",
"Provisioning State",
"Maintenance",
"uuid",
"name",
"instance_uuid",
"power_state",
"provision_state",
"maintenance",
)
self.assertEqual(collist, columns)
datalist = ((
@@ -1142,83 +1142,80 @@ class TestBaremetalList(TestBaremetal):
self.baremetal_mock.node.list.assert_called_with(
**kwargs
)
# NOTE(dtantsur): please keep this list sorted for sanity reasons
collist = [
'Allocation UUID',
'Automated Clean',
'BIOS Interface',
'Boot Interface',
'Boot Mode',
'Chassis UUID',
'Clean Step',
'Conductor',
'Conductor Group',
'Console Enabled',
'Console Interface',
'Created At',
'Current RAID configuration',
'Deploy Interface',
'Deploy Step',
'Description',
'Disable Power Off',
'Driver',
'Driver Info',
'Driver Internal Info',
'Extra',
'Fault',
'Firmware Interface',
'Health',
'Inspect Interface',
'Inspection Finished At',
'Inspection Started At',
'Instance Info',
'Instance Name',
'Instance UUID',
'Last Error',
'Lessee',
'Maintenance',
'Maintenance Reason',
'Management Interface',
'Name',
'Network Configuration',
'Network Interface',
'Owner',
'Parent Node',
'Power Interface',
'Power State',
'Properties',
'Protected',
'Protected Reason',
'Provision Updated At',
'Provisioning State',
'RAID Interface',
'Rescue Interface',
'Reservation',
'Resource Class',
'Retired',
'Retired Reason',
'Secure Boot',
'Storage Interface',
'Target Power State',
'Target Provision State',
'Target RAID configuration',
'Traits',
'UUID',
'Updated At',
'Vendor Interface'
]
# Enforce sorting
collist.sort()
self.assertEqual(tuple(collist), columns)
collist = tuple([
'allocation_uuid',
'automated_clean',
'bios_interface',
'boot_interface',
'boot_mode',
'chassis_uuid',
'clean_step',
'conductor',
'conductor_group',
'console_enabled',
'console_interface',
'created_at',
'raid_config',
'deploy_interface',
'deploy_step',
'description',
'disable_power_off',
'driver',
'driver_info',
'driver_internal_info',
'extra',
'fault',
'firmware_interface',
'health',
'inspect_interface',
'inspection_finished_at',
'inspection_started_at',
'instance_info',
'instance_name',
'instance_uuid',
'last_error',
'lessee',
'maintenance',
'maintenance_reason',
'management_interface',
'name',
'network_data',
'network_interface',
'owner',
'parent_node',
'power_interface',
'power_state',
'properties',
'protected',
'protected_reason',
'provision_updated_at',
'provision_state',
'raid_interface',
'rescue_interface',
'reservation',
'resource_class',
'retired',
'retired_reason',
'secure_boot',
'storage_interface',
'target_power_state',
'target_provision_state',
'target_raid_config',
'traits',
'uuid',
'updated_at',
'vendor_interface'
])
self.assertEqual(collist, columns)
fake_values = {
'Instance UUID': baremetal_fakes.baremetal_instance_uuid,
'Maintenance': baremetal_fakes.baremetal_maintenance,
'Name': baremetal_fakes.baremetal_name,
'Power State': baremetal_fakes.baremetal_power_state,
'Provisioning State': baremetal_fakes.baremetal_provision_state,
'UUID': baremetal_fakes.baremetal_uuid,
'instance_uuid': baremetal_fakes.baremetal_instance_uuid,
'maintenance': baremetal_fakes.baremetal_maintenance,
'name': baremetal_fakes.baremetal_name,
'power_state': baremetal_fakes.baremetal_power_state,
'provision_state': baremetal_fakes.baremetal_provision_state,
'uuid': baremetal_fakes.baremetal_uuid,
}
values = tuple(fake_values.get(name, '') for name in collist)
self.assertEqual((values,), tuple(data))
@@ -4575,7 +4572,7 @@ class TestListTraits(TestBaremetal):
self.baremetal_mock.node.get_traits.assert_called_once_with(
'node_uuid')
self.assertEqual(('Traits',), columns)
self.assertEqual(('traits',), columns)
self.assertEqual([[trait] for trait in baremetal_fakes.TRAITS], data)
@@ -4760,7 +4757,7 @@ class TestListBIOSSetting(TestBaremetal):
self.baremetal_mock.node.list_bios_settings.assert_called_once_with(
'node_uuid')
expected_columns = ('BIOS setting name', 'BIOS setting value')
expected_columns = ('name', 'value')
self.assertEqual(expected_columns, columns)
expected_data = ([(s['name'], s['value'])
@@ -4788,10 +4785,10 @@ class TestListBIOSSetting(TestBaremetal):
self.baremetal_mock.node.list_bios_settings.assert_called_once_with(
'node_uuid', **kwargs)
expected_columns = ('Name', 'Value', 'Attribute Type',
'Allowable Values', 'Lower Bound',
'Minimum Length', 'Maximum Length', 'Read Only',
'Reset Required', 'Unique', 'Upper Bound')
expected_columns = ('name', 'value', 'attribute_type',
'allowable_values', 'lower_bound',
'min_length', 'max_length', 'read_only',
'reset_required', 'unique', 'upper_bound')
self.assertEqual(expected_columns, columns)
expected_data = (('SysName', 'my-system', 'String', '', '', '1', '16',
@@ -4815,9 +4812,9 @@ class TestListBIOSSetting(TestBaremetal):
baremetal_fakes.BIOS_DETAILED_SETTINGS)
columns, data = self.cmd.take_action(parsed_args)
self.assertNotIn('Value', columns)
self.assertIn('Name', columns)
self.assertIn('Attribute Type', columns)
self.assertNotIn('value', columns)
self.assertIn('name', columns)
self.assertIn('attribute_type', columns)
kwargs = {
'detail': False,
@@ -4871,9 +4868,9 @@ class TestNodeHistoryEventList(TestBaremetal):
columns, data = self.cmd.take_action(parsed_args)
self.baremetal_mock.node.get_history_list.assert_called_once_with(
'node_uuid', True)
expected_columns = ('UUID', 'Created At', 'Severity',
'Event Origin Type', 'Description of the event',
'Conductor', 'User')
expected_columns = ('uuid', 'created_at', 'severity',
'event_type', 'event',
'conductor', 'user')
expected_data = (('abcdef1', 'time', 'info', 'purring', 'meow',
'lap-conductor', '0191'),)
self.assertEqual(expected_columns, columns)
@@ -4965,7 +4962,7 @@ class TestNodeChildrenList(TestBaremetal):
self.baremetal_mock.node.list_children_of_node \
.assert_called_once_with('node_uuid')
self.assertEqual(('Child Nodes',), columns)
self.assertEqual(('children',), columns)
self.assertEqual([[node] for node in baremetal_fakes.CHILDREN], data)
@@ -5014,9 +5011,9 @@ class TestListFirmwareComponents(TestBaremetal):
self.baremetal_mock.node.list_firmware_components \
.assert_called_once_with('node_uuid')
expected_columns = ('Component', 'Initial Version',
'Current Version', 'Last Version Flashed',
'Created At', 'Updated At')
expected_columns = ('component', 'initial_version',
'current_version', 'last_version_flashed',
'created_at', 'updated_at')
self.assertEqual(expected_columns, columns)
expected_data = (

View File

@@ -882,8 +882,8 @@ class TestBaremetalPortList(TestBaremetalPort):
self.baremetal_mock.port.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Address")
"uuid",
"address")
self.assertEqual(collist, columns)
datalist = ((
@@ -949,12 +949,12 @@ class TestBaremetalPortList(TestBaremetalPort):
}
self.baremetal_mock.port.list.assert_called_with(**kwargs)
collist = ('UUID', 'Address', 'Created At', 'Extra', 'Node UUID',
'Category', 'Vendor',
'Local Link Connection', 'Portgroup UUID',
'PXE boot enabled', 'Physical Network', 'Updated At',
'Internal Info', 'Is Smart NIC port',
'Name')
collist = ('uuid', 'address', 'created_at', 'extra', 'node_uuid',
'category', 'vendor',
'local_link_connection', 'portgroup_uuid',
'pxe_enabled', 'physical_network', 'updated_at',
'internal_info', 'is_smartnic',
'name')
self.assertEqual(collist, columns)
datalist = ((

View File

@@ -371,9 +371,9 @@ class TestBaremetalPortGroupList(TestBaremetalPortGroup):
self.baremetal_mock.portgroup.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Address",
"Name")
"uuid",
"address",
"name")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_portgroup_uuid,
@@ -395,9 +395,9 @@ class TestBaremetalPortGroupList(TestBaremetalPortGroup):
self.baremetal_mock.portgroup.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Address",
"Name")
"uuid",
"address",
"name")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_portgroup_uuid,
@@ -419,9 +419,9 @@ class TestBaremetalPortGroupList(TestBaremetalPortGroup):
self.baremetal_mock.portgroup.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Address",
"Name")
"uuid",
"address",
"name")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_portgroup_uuid,
@@ -443,10 +443,11 @@ class TestBaremetalPortGroupList(TestBaremetalPortGroup):
}
self.baremetal_mock.portgroup.list.assert_called_with(**kwargs)
collist = ('UUID', 'Address', 'Created At', 'Extra',
'Standalone Ports Supported', 'Node UUID', 'Name',
'Updated At', 'Internal Info', 'Mode', 'Properties',
'Physical Network', 'Category')
collist = ('uuid', 'address', 'created_at', 'extra',
'standalone_ports_supported', 'node_uuid', 'name',
'updated_at', 'internal_info', 'mode', 'properties',
'physical_network', 'category')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_portgroup_uuid,
@@ -516,9 +517,9 @@ class TestBaremetalPortGroupList(TestBaremetalPortGroup):
self.baremetal_mock.portgroup.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Address",
"Name")
"uuid",
"address",
"name")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_portgroup_uuid,

View File

@@ -400,8 +400,8 @@ class TestBaremetalRunbookList(TestBaremetalRunbook):
self.baremetal_mock.runbook.list.assert_called_with(**kwargs)
collist = (
"UUID",
"Name")
"uuid",
"name")
self.assertEqual(collist, columns)
datalist = ((
@@ -424,14 +424,14 @@ class TestBaremetalRunbookList(TestBaremetalRunbook):
}
self.baremetal_mock.runbook.list.assert_called_with(**kwargs)
collist = ('UUID',
'Name',
'Owner',
'Public',
'Steps',
'Extra',
'Created At',
'Updated At')
collist = ('uuid',
'name',
'owner',
'public',
'steps',
'extra',
'created_at',
'updated_at')
self.assertEqual(collist, columns)
datalist = ((

View File

@@ -49,7 +49,7 @@ class TestBaremetalShardList(TestBaremetalShard):
columns, data = self.cmd.take_action(parsed_args)
# Define expected columns and data output
collist = ("Name", "Count")
collist = ("name", "count")
datalist = ((baremetal_fakes.baremetal_shard_name,
baremetal_fakes.baremetal_shard_count), )

View File

@@ -331,10 +331,10 @@ class TestListBaremetalVolumeConnector(TestBaremetalVolumeConnector):
**kwargs)
collist = (
"UUID",
"Node UUID",
"Type",
"Connector ID")
"uuid",
"node_uuid",
"type",
"connector_id")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_connector_uuid,
@@ -358,10 +358,10 @@ class TestListBaremetalVolumeConnector(TestBaremetalVolumeConnector):
**kwargs)
collist = (
"UUID",
"Node UUID",
"Type",
"Connector ID")
"uuid",
"node_uuid",
"type",
"connector_id")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_connector_uuid,
@@ -384,8 +384,8 @@ class TestListBaremetalVolumeConnector(TestBaremetalVolumeConnector):
}
self.baremetal_mock.volume_connector.list.assert_called_with(**kwargs)
collist = ('UUID', 'Node UUID', 'Type', 'Connector ID', 'Extra',
'Created At', 'Updated At')
collist = ('uuid', 'node_uuid', 'type', 'connector_id', 'extra',
'created_at', 'updated_at')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_connector_uuid,
@@ -423,7 +423,7 @@ class TestListBaremetalVolumeConnector(TestBaremetalVolumeConnector):
}
self.baremetal_mock.volume_connector.list.assert_called_with(**kwargs)
collist = ('UUID', 'Connector ID')
collist = ('uuid', 'connector_id')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_connector_uuid,
@@ -455,7 +455,7 @@ class TestListBaremetalVolumeConnector(TestBaremetalVolumeConnector):
}
self.baremetal_mock.volume_connector.list.assert_called_with(**kwargs)
collist = ('UUID', 'Connector ID', 'Extra')
collist = ('uuid', 'connector_id', 'extra')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_connector_uuid,

View File

@@ -393,11 +393,11 @@ class TestListBaremetalVolumeTarget(TestBaremetalVolumeTarget):
**kwargs)
collist = (
"UUID",
"Node UUID",
"Driver Volume Type",
"Boot Index",
"Volume ID")
"uuid",
"node_uuid",
"volume_type",
"boot_index",
"volume_id")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_target_uuid,
@@ -422,11 +422,11 @@ class TestListBaremetalVolumeTarget(TestBaremetalVolumeTarget):
**kwargs)
collist = (
"UUID",
"Node UUID",
"Driver Volume Type",
"Boot Index",
"Volume ID")
"uuid",
"node_uuid",
"volume_type",
"boot_index",
"volume_id")
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_target_uuid,
@@ -450,9 +450,9 @@ class TestListBaremetalVolumeTarget(TestBaremetalVolumeTarget):
}
self.baremetal_mock.volume_target.list.assert_called_with(**kwargs)
collist = ('UUID', 'Node UUID', 'Driver Volume Type', 'Properties',
'Boot Index', 'Extra', 'Volume ID', 'Created At',
'Updated At')
collist = ('uuid', 'node_uuid', 'volume_type', 'properties',
'boot_index', 'extra', 'volume_id', 'created_at',
'updated_at')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_target_uuid,
@@ -494,7 +494,7 @@ class TestListBaremetalVolumeTarget(TestBaremetalVolumeTarget):
}
self.baremetal_mock.volume_target.list.assert_called_with(**kwargs)
collist = ('UUID', 'Boot Index')
collist = ('uuid', 'boot_index')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_target_uuid,
@@ -528,7 +528,7 @@ class TestListBaremetalVolumeTarget(TestBaremetalVolumeTarget):
}
self.baremetal_mock.volume_target.list.assert_called_with(**kwargs)
collist = ('UUID', 'Boot Index', 'Extra')
collist = ('uuid', 'boot_index', 'extra')
self.assertEqual(collist, columns)
datalist = ((baremetal_fakes.baremetal_volume_target_uuid,

View File

@@ -0,0 +1,33 @@
---
upgrade:
- |
All baremetal list commands now use actual resource field names
(e.g., "uuid", "name", "resource_class") as column headers instead
of human-friendly labels (e.g., "UUID", "Name", "Resource Class").
This change ensures consistency between table output, JSON output,
and field selection via the ``--fields`` option.
**Action Required**: Scripts that parse the output of baremetal list
commands will need to be updated to use the new lowercase,
snake_case column headers. For example:
- "UUID" → "uuid"
- "Name" → "name"
- "Resource Class" → "resource_class"
- "Instance UUID" → "instance_uuid"
- "Power State" → "power_state"
- "Provisioning State" → "provision_state"
- "Supported driver(s)" → "name"
- "Active host(s)" → "hosts"
This affects all list commands including node list, port list,
portgroup list, allocation list, chassis list, conductor list,
deploy template list, driver list, volume connector list,
volume target list, runbook list, shard list, and inspection rule list.
fixes:
- |
Fixes an inconsistency where column headers in list command table
output used different names than the actual resource fields,
causing confusion when using the ``--fields`` option or comparing
with JSON output format (``-f json``).