From a543a9149107fa3f3fedbcadf7c321dd67ca63d6 Mon Sep 17 00:00:00 2001 From: OpenStack Release Bot Date: Fri, 6 Sep 2024 13:09:10 +0000 Subject: [PATCH 1/5] Update .gitreview for stable/2024.2 Change-Id: Ib0eaa97eddff510185197e9feb48cdfdea9a6863 --- .gitreview | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitreview b/.gitreview index 130a080b0..c2e8be74b 100644 --- a/.gitreview +++ b/.gitreview @@ -2,3 +2,4 @@ host=review.opendev.org port=29418 project=openstack/python-ironicclient.git +defaultbranch=stable/2024.2 From c4740ae52e396c6eb571696d4d8b911aa61ed719 Mon Sep 17 00:00:00 2001 From: OpenStack Release Bot Date: Fri, 6 Sep 2024 13:09:13 +0000 Subject: [PATCH 2/5] Update TOX_CONSTRAINTS_FILE for stable/2024.2 Update the URL to the upper-constraints file to point to the redirect rule on releases.openstack.org so that anyone working on this branch will switch to the correct upper-constraints list automatically when the requirements repository branches. Until the requirements repository has as stable/2024.2 branch, tests will continue to use the upper-constraints list on master. Change-Id: Id8b5a762ec1086adfd02be86e376c24a925d144c --- tox.ini | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tox.ini b/tox.ini index e526977b4..24e083cc7 100644 --- a/tox.ini +++ b/tox.ini @@ -11,7 +11,7 @@ setenv = VIRTUAL_ENV={envdir} TESTS_DIR=./ironicclient/tests/unit usedevelop = True deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2024.2} -r{toxinidir}/requirements.txt -r{toxinidir}/test-requirements.txt commands = @@ -19,7 +19,7 @@ commands = [testenv:releasenotes] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2024.2} -r{toxinidir}/doc/requirements.txt commands = sphinx-build -a -E -W -d releasenotes/build/doctrees -b html releasenotes/source releasenotes/build/html @@ -30,7 +30,7 @@ deps = flake8-import-order>=0.17.1 # LGPLv3 pycodestyle>=2.0.0,<3.0.0 # MIT Pygments>=2.2.0 # BSD - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2024.2} commands = flake8 {posargs} doc8 doc/source CONTRIBUTING.rst README.rst @@ -47,7 +47,7 @@ commands = [testenv:venv] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2024.2} -r{toxinidir}/test-requirements.txt -r{toxinidir}/requirements.txt -r{toxinidir}/doc/requirements.txt @@ -61,7 +61,7 @@ setenv = TESTS_DIR=./ironicclient/tests/functional [testenv:docs] deps = - -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/master} + -c{env:TOX_CONSTRAINTS_FILE:https://releases.openstack.org/constraints/upper/2024.2} -r{toxinidir}/doc/requirements.txt commands = sphinx-build -W -b html doc/source doc/build/html From a8eb41cb7db32a5e5f409e6b11b802a4c11fd7e1 Mon Sep 17 00:00:00 2001 From: Takashi Kajinami Date: Thu, 24 Oct 2024 18:50:52 +0900 Subject: [PATCH 3/5] Replace outdated python job template We should use non-versioned template now. Change-Id: I6cf3ee362c7bc657e604498d98f1b44599700cd4 (cherry picked from commit 8d7a6e7419d50118bc4015805a48a20a7c6d906a) --- zuul.d/project.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml index 555aa4e80..d71a66e10 100644 --- a/zuul.d/project.yaml +++ b/zuul.d/project.yaml @@ -2,7 +2,7 @@ templates: - check-requirements - openstack-cover-jobs - - openstack-python3-antelope-jobs + - openstack-python3-jobs - openstackclient-plugin-jobs - publish-openstack-docs-pti - release-notes-jobs-python3 From 40cae66e1d92d176d3c38154fdbda37a295308ef Mon Sep 17 00:00:00 2001 From: Doug Goldstein Date: Wed, 30 Oct 2024 09:40:05 -0500 Subject: [PATCH 4/5] fix port name in Port resource The name of the port is in the 'name' field coming back from the API and not in the 'port_name' field. Change-Id: Iad986ea693396a1bdb93345c7c9e778560ae7c06 Signed-off-by: Doug Goldstein (cherry picked from commit 2caa47fdf058cd68d8f9661adf302dafe9f1fef2) --- ironicclient/tests/unit/osc/v1/test_baremetal_port.py | 2 +- ironicclient/v1/resource_fields.py | 3 +-- releasenotes/notes/fix-port-name-0d8190665b89c6d7.yaml | 4 ++++ 3 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 releasenotes/notes/fix-port-name-0d8190665b89c6d7.yaml diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py index 7c1504a76..01797f72a 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py @@ -806,7 +806,7 @@ def test_baremetal_port_list_long(self): 'Local Link Connection', 'Portgroup UUID', 'PXE boot enabled', 'Physical Network', 'Updated At', 'Internal Info', 'Is Smart NIC port', - 'Port Name') + 'Name') self.assertEqual(collist, columns) datalist = (( diff --git a/ironicclient/v1/resource_fields.py b/ironicclient/v1/resource_fields.py index 5d278bec1..b45c9a11f 100644 --- a/ironicclient/v1/resource_fields.py +++ b/ironicclient/v1/resource_fields.py @@ -157,7 +157,6 @@ class Resource(object): 'parent_node': 'Parent Node', 'children': 'Child Nodes', 'firmware_interface': 'Firmware Interface', - 'port_name': 'Port Name', 'public': 'Public' } @@ -347,7 +346,7 @@ def sort_labels(self): 'updated_at', 'internal_info', 'is_smartnic', - 'port_name', + 'name', ], sort_excluded=[ 'extra', diff --git a/releasenotes/notes/fix-port-name-0d8190665b89c6d7.yaml b/releasenotes/notes/fix-port-name-0d8190665b89c6d7.yaml new file mode 100644 index 000000000..013a9e905 --- /dev/null +++ b/releasenotes/notes/fix-port-name-0d8190665b89c6d7.yaml @@ -0,0 +1,4 @@ +--- +fixes: + - | + Display correct field for the port name of the Port resource. From 11909b83709e441a257ba763938ae51b5aa1f866 Mon Sep 17 00:00:00 2001 From: Jay Faulkner Date: Tue, 13 May 2025 09:36:34 -0700 Subject: [PATCH 5/5] Stop using deprecated format_* from osc_utils Added our own formatter which replaces the deprecated/removed one. It's contents are essentially format_dict from osc-lib 3.2.0 stuffed into a cliff column object. Change-Id: If28bda0a11f3e4a0d02a6a52040e8ca65611822f --- ironicclient/common/utils.py | 24 +++++++++++++++++++ ironicclient/osc/v1/baremetal_chassis.py | 2 +- ironicclient/osc/v1/baremetal_conductor.py | 3 ++- ironicclient/osc/v1/baremetal_node.py | 2 +- ironicclient/osc/v1/baremetal_port.py | 2 +- ironicclient/osc/v1/baremetal_portgroup.py | 2 +- .../osc/v1/baremetal_volume_connector.py | 2 +- .../osc/v1/baremetal_volume_target.py | 2 +- .../tests/unit/osc/v1/test_baremetal_port.py | 4 ++-- ironicclient/tests/unit/v1/test_node.py | 2 +- 10 files changed, 35 insertions(+), 10 deletions(-) diff --git a/ironicclient/common/utils.py b/ironicclient/common/utils.py index 498dfabe4..33227771b 100644 --- a/ironicclient/common/utils.py +++ b/ironicclient/common/utils.py @@ -25,6 +25,7 @@ import tempfile import time +from cliff import columns from oslo_utils import strutils import yaml @@ -462,3 +463,26 @@ def get_json_data(data): return json.loads(data) except ValueError: return None + + +def format_hash(data): + if data is None: + return None + + output = "" + for s in sorted(data): + key_str = s + if isinstance(data[s], dict): + # NOTE(dtroyer): Only append the separator chars here, quoting + # is completely handled in the terminal case. + output = output + format_hash(data[s], prefix=key_str) + ", " + elif data[s] is not None: + output = output + key_str + "='" + str(data[s]) + "', " + else: + output = output + key_str + "=, " + return output[:-2] + + +class HashColumn(columns.FormattableColumn): + def human_readable(self): + return format_hash(self._value) diff --git a/ironicclient/osc/v1/baremetal_chassis.py b/ironicclient/osc/v1/baremetal_chassis.py index a84fc52f4..58dc5bb61 100644 --- a/ironicclient/osc/v1/baremetal_chassis.py +++ b/ironicclient/osc/v1/baremetal_chassis.py @@ -190,7 +190,7 @@ def take_action(self, parsed_args): return (labels, (oscutils.get_item_properties(s, columns, formatters={ - 'Properties': oscutils.format_dict},) for s in data)) + 'Properties': utils.HashColumn},) for s in data)) class SetBaremetalChassis(command.Command): diff --git a/ironicclient/osc/v1/baremetal_conductor.py b/ironicclient/osc/v1/baremetal_conductor.py index 627fd6227..2dbb9c8c5 100755 --- a/ironicclient/osc/v1/baremetal_conductor.py +++ b/ironicclient/osc/v1/baremetal_conductor.py @@ -21,6 +21,7 @@ from osc_lib import utils as oscutils from ironicclient.common.i18n import _ +from ironicclient.common import utils from ironicclient import exc from ironicclient.v1 import resource_fields as res_fields @@ -106,7 +107,7 @@ def take_action(self, parsed_args): return (labels, (oscutils.get_item_properties(s, columns, formatters={ - 'Properties': oscutils.format_dict},) for s in data)) + 'Properties': utils.HashColumn},) for s in data)) class ShowBaremetalConductor(command.ShowOne): diff --git a/ironicclient/osc/v1/baremetal_node.py b/ironicclient/osc/v1/baremetal_node.py index 94b582db6..4bde18d09 100755 --- a/ironicclient/osc/v1/baremetal_node.py +++ b/ironicclient/osc/v1/baremetal_node.py @@ -920,7 +920,7 @@ def take_action(self, parsed_args): return (labels, (oscutils.get_item_properties(s, columns, formatters={ - 'Properties': oscutils.format_dict},) for s in data)) + 'Properties': utils.HashColumn},) for s in data)) class MaintenanceSetBaremetalNode(command.Command): diff --git a/ironicclient/osc/v1/baremetal_port.py b/ironicclient/osc/v1/baremetal_port.py index d6fc424a1..b51634728 100644 --- a/ironicclient/osc/v1/baremetal_port.py +++ b/ironicclient/osc/v1/baremetal_port.py @@ -547,4 +547,4 @@ def take_action(self, parsed_args): return (labels, (oscutils.get_item_properties(s, columns, formatters={ - 'extra': oscutils.format_dict},) for s in data)) + 'extra': utils.HashColumn},) for s in data)) diff --git a/ironicclient/osc/v1/baremetal_portgroup.py b/ironicclient/osc/v1/baremetal_portgroup.py index bd7f1a2be..a1dc40486 100644 --- a/ironicclient/osc/v1/baremetal_portgroup.py +++ b/ironicclient/osc/v1/baremetal_portgroup.py @@ -252,7 +252,7 @@ def take_action(self, parsed_args): return (labels, (oscutils.get_item_properties(s, columns, formatters={ - 'Properties': oscutils.format_dict},) for s in data)) + 'Properties': utils.HashColumn},) for s in data)) class DeleteBaremetalPortGroup(command.Command): diff --git a/ironicclient/osc/v1/baremetal_volume_connector.py b/ironicclient/osc/v1/baremetal_volume_connector.py index f8b270ad1..cb2e9cd4b 100644 --- a/ironicclient/osc/v1/baremetal_volume_connector.py +++ b/ironicclient/osc/v1/baremetal_volume_connector.py @@ -218,7 +218,7 @@ def take_action(self, parsed_args): return (labels, (oscutils.get_item_properties(s, columns, formatters={ - 'Properties': oscutils.format_dict},) for s in data)) + 'Properties': utils.HashColumn},) for s in data)) class DeleteBaremetalVolumeConnector(command.Command): diff --git a/ironicclient/osc/v1/baremetal_volume_target.py b/ironicclient/osc/v1/baremetal_volume_target.py index 7940e482c..614781aae 100644 --- a/ironicclient/osc/v1/baremetal_volume_target.py +++ b/ironicclient/osc/v1/baremetal_volume_target.py @@ -234,7 +234,7 @@ def take_action(self, parsed_args): return (labels, (oscutils.get_item_properties(s, columns, formatters={ - 'Properties': oscutils.format_dict},) for s in data)) + 'Properties': utils.HashColumn},) for s in data)) class DeleteBaremetalVolumeTarget(command.Command): diff --git a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py index 01797f72a..ef507c34c 100644 --- a/ironicclient/tests/unit/osc/v1/test_baremetal_port.py +++ b/ironicclient/tests/unit/osc/v1/test_baremetal_port.py @@ -18,8 +18,8 @@ from unittest import mock from osc_lib.tests import utils as osctestutils -from osc_lib import utils as oscutils +from ironicclient.common import utils from ironicclient import exc from ironicclient.osc.v1 import baremetal_port from ironicclient.tests.unit.osc.v1 import fakes as baremetal_fakes @@ -813,7 +813,7 @@ def test_baremetal_port_list_long(self): baremetal_fakes.baremetal_port_uuid, baremetal_fakes.baremetal_port_address, '', - oscutils.format_dict(baremetal_fakes.baremetal_port_extra), + utils.HashColumn(baremetal_fakes.baremetal_port_extra), baremetal_fakes.baremetal_uuid, '', '', diff --git a/ironicclient/tests/unit/v1/test_node.py b/ironicclient/tests/unit/v1/test_node.py index 9b23623cc..6cb5bcc8f 100644 --- a/ironicclient/tests/unit/v1/test_node.py +++ b/ironicclient/tests/unit/v1/test_node.py @@ -2240,7 +2240,7 @@ def side_effect(node_manager, node_ident, *args, **kwargs): mock_get.side_effect = side_effect self.assertRaisesRegex(exc.StateTransitionTimeout, - r'Node\(s\) node2', + r'.*node2.*', self.mgr.wait_for_provision_state, ['node1', 'node2'], 'active', timeout=0.001)