From 416dba9bba8915cd1903e5740d9aa637b35c81ee Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Tue, 19 May 2026 19:32:50 +0100 Subject: [PATCH 01/15] Remove logic around Python 3-only branches Ussuri through Zed are dead. All branches are Python 3-only now. Change-Id: I65fd1ae3a4c00a4fd6186f4cd915ae4095c2916f Signed-off-by: Stephen Finucane --- openstack_requirements/check.py | 25 +--- openstack_requirements/tests/test_check.py | 108 ------------------ .../files/project-requirements-change.py | 8 -- 3 files changed, 3 insertions(+), 138 deletions(-) diff --git a/openstack_requirements/check.py b/openstack_requirements/check.py index 7b6711b24..69e417e5e 100644 --- a/openstack_requirements/check.py +++ b/openstack_requirements/check.py @@ -129,7 +129,6 @@ def _is_requirement_in_global_reqs( local_req, global_reqs, backports, - allow_3_only=False, ): req_exclusions = _get_exclusions(local_req) for global_req in global_reqs: @@ -138,10 +137,10 @@ def _is_requirement_in_global_reqs( local_req_val = getattr(local_req, aname) global_req_val = getattr(global_req, aname) if local_req_val != global_req_val: - # if a python 3 version is not spefied in only one of + # if a python 3 version is not specified in only one of # global requirements or local requirements, allow it since # python 3-only is okay - if allow_3_only and matching and aname == 'markers': + if matching and aname == 'markers': if not local_req_val and PY3_GLOBAL_SPECIFIER_RE.match( global_req_val ): @@ -250,7 +249,6 @@ def _validate_one( denylist, global_reqs, backports, - allow_3_only=False, ): """Returns True if there is a failure.""" @@ -276,7 +274,6 @@ def _validate_one( req, global_reqs[name], backports, - allow_3_only, ): return True @@ -289,22 +286,8 @@ def _validate_one( return True for extra, count in counts.items(): - # Make sure the number of entries matches. If allow_3_only, then we - # just need to make sure we have at least the number of entries for - # supported Python 3 versions. + # Make sure the number of entries matches. if count != len(global_reqs[name]): - if allow_3_only and count >= len( - _get_python3_reqs(global_reqs[name]) - ): - print( - "WARNING (probably OK for Ussuri and later): " - "Package '{}{}' is only tracking python 3 " - "requirements".format( - name, (f'[{extra}]') if extra else '' - ) - ) - continue - print( "ERROR: Package '{}{}' requirement does not match " "number of lines ({}) in " @@ -324,7 +307,6 @@ def validate( denylist, global_reqs, backports, - allow_3_only=False, ): failed = False # iterate through the changing entries and see if they match the global @@ -339,7 +321,6 @@ def validate( denylist, global_reqs, backports, - allow_3_only, ) or failed ) diff --git a/openstack_requirements/tests/test_check.py b/openstack_requirements/tests/test_check.py index ef34a74e9..032e465d9 100644 --- a/openstack_requirements/tests/test_check.py +++ b/openstack_requirements/tests/test_check.py @@ -113,7 +113,6 @@ def test_match_with_local_markers(self): req, self.global_reqs['name'], self.backports, - allow_3_only=True, ) ) @@ -133,7 +132,6 @@ def test_match_without_python3_markers(self): req, self.global_reqs['withmarker'], self.backports, - allow_3_only=True, ) ) @@ -451,110 +449,6 @@ def test_new_item_mismatches_global_list_with_extra(self): ) ) - def test_new_item_matches_py3_allowed_no_version(self): - # If the global list has multiple entries for an item but the branch - # allows python 3 only, then only the py3 entries need to match. - # Requirements without a python_version marker should always be used. - r_content = textwrap.dedent(""" - name>=1.5;python_version=='3.5' - other-name - """) - reqs = [r for r, line in requirement.parse(r_content)['name']] - global_reqs = check.get_global_reqs( - textwrap.dedent(""" - name>=1.5;python_version=='3.5' - name>=1.2,!=1.4;python_version=='2.6' - other-name - """) - ) - self.assertFalse( - check._validate_one( - 'name', - reqs=reqs, - denylist=requirement.parse(''), - backports=self.backports, - global_reqs=global_reqs, - allow_3_only=True, - ) - ) - - def test_new_item_matches_py3_allowed(self): - # If the global list has multiple entries for an item but the branch - # allows python 3 only, then only the py3 entries need to match. - # Requirements without a python_version marker should always be used. - r_content = textwrap.dedent(""" - name>=1.5 - other-name - """) - reqs = [r for r, line in requirement.parse(r_content)['name']] - global_reqs = check.get_global_reqs( - textwrap.dedent(""" - name>=1.5;python_version>='3.5' - name>=1.2,!=1.4;python_version=='2.6' - other-name - """) - ) - self.assertFalse( - check._validate_one( - 'name', - reqs=reqs, - denylist=requirement.parse(''), - backports=self.backports, - global_reqs=global_reqs, - allow_3_only=True, - ) - ) - - def test_new_item_matches_py3_allowed_with_py2(self): - # If the global list has multiple entries for an item but the branch - # allows python 3 only, then only the py3 entries need to match. - # It should continue to pass with py2 entries though. - r_content = textwrap.dedent(""" - name>=1.5;python_version=='3.5' - name>=1.2,!=1.4;python_version=='2.6' - """) - reqs = [r for r, line in requirement.parse(r_content)['name']] - global_reqs = check.get_global_reqs( - textwrap.dedent(""" - name>=1.5;python_version=='3.5' - name>=1.2,!=1.4;python_version=='2.6' - """) - ) - self.assertFalse( - check._validate_one( - 'name', - reqs=reqs, - denylist=requirement.parse(''), - backports=self.backports, - global_reqs=global_reqs, - allow_3_only=True, - ) - ) - - def test_new_item_matches_py3_allowed_no_py2(self): - # If the global list has multiple entries for an item but the branch - # allows python 3 only, then only the py3 entries need to match. - r_content = textwrap.dedent(""" - name>=1.5;python_version=='3.5' - """) - reqs = [r for r, line in requirement.parse(r_content)['name']] - global_reqs = check.get_global_reqs( - textwrap.dedent(""" - name>=1.5;python_version=='3.5' - name>=1.2,!=1.4;python_version=='2.6' - """) - ) - self.assertFalse( - check._validate_one( - 'name', - reqs=reqs, - denylist=requirement.parse(''), - backports=self.backports, - global_reqs=global_reqs, - allow_3_only=True, - ) - ) - class TestBackportPythonMarkers(testtools.TestCase): def setUp(self): @@ -581,7 +475,6 @@ def test_notmatching_no_backport(self): self.req, self.global_reqs["name"], list(backports.keys()), - allow_3_only=True, ) ) @@ -595,6 +488,5 @@ def test_notmatching_with_backport(self): self.req, self.global_reqs["name"], list(backports.keys()), - allow_3_only=True, ) ) diff --git a/playbooks/files/project-requirements-change.py b/playbooks/files/project-requirements-change.py index 1a997e486..85b227d1e 100755 --- a/playbooks/files/project-requirements-change.py +++ b/playbooks/files/project-requirements-change.py @@ -18,7 +18,6 @@ import argparse import contextlib import os -import re import shlex import shutil import subprocess @@ -30,9 +29,6 @@ from openstack_requirements import requirement # noqa -PYTHON_3_BRANCH = re.compile(r'^stable\/[u-z].*') - - def run_command(cmd): print(cmd) cmd_list = shlex.split(str(cmd)) @@ -144,16 +140,12 @@ def main(): # either. head_strict = not branch.startswith('stable/') head_reqs.process(strict=head_strict) - # Starting with Ussuri and later, we only need to be strict about - # Python 3 requirements. - python_3_branch = head_strict or PYTHON_3_BRANCH.match(branch) failed = check.validate( head_reqs, denylist, global_reqs, list(backports.keys()), - allow_3_only=python_3_branch, ) # report the results From df8c1d8697a531140de152d548ae02b731e1a235 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Mon, 8 Jun 2026 12:48:22 +0000 Subject: [PATCH 02/15] update constraint for os-traits to new release 3.7.0 meta: version: 3.7.0 meta: team: nova meta: diff-start: - meta: series: independent meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Balazs Gibizer meta: release:Commit: Balazs Gibizer meta: release:Change-Id: I2291b42c9e31244e51b6ddffa1cbff59fa66e174 meta: release:Code-Review+1: ribaudr meta: release:Code-Review+2: Elod Illes meta: release:Workflow+1: Elod Illes Change-Id: I4642ba4acc0150df75fdfdfad8129d8e00d83db1 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index 3ad73d84c..340caeae5 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -354,7 +354,7 @@ keystonemiddleware===13.0.0 django-formtools===2.6.1 XStatic-Spin===1.2.5.3 rich===15.0.0 -os-traits===3.6.0 +os-traits===3.7.0 typepy===1.3.5 SecretStorage===3.5.0 XStatic-Rickshaw===1.5.1.3 From 05c8c102e638a9667a820b43840f5077c07da7f6 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Tue, 9 Jun 2026 13:10:13 +0000 Subject: [PATCH 03/15] update constraint for etcd3gw to new release 2.7.0 meta: version: 2.7.0 meta: team: oslo meta: diff-start: - meta: series: independent meta: branch: master meta: release-type: release meta: pypi: no meta: first: no meta: release:Author: Takashi Kajinami meta: release:Commit: Takashi Kajinami meta: release:Change-Id: Ib3bf1166afa51835fbf90abe3a9fbf019a6c93de meta: release:Code-Review+1: Stephen Finucane meta: release:Code-Review+2: Elod Illes meta: release:Workflow+1: Elod Illes Change-Id: Ic4dce82d699e1398ff7976f7147ad1d440342661 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index 340caeae5..992404bdf 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -453,7 +453,7 @@ requestsexceptions===1.4.0 testresources===2.1.2 falcon===4.2.0 tomlkit===0.15.0 -etcd3gw===2.6.0 +etcd3gw===2.7.0 Flask-RESTful===0.3.10 GitPython===3.1.50 python-ironicclient===6.1.0 From 254e753b1e8b7d7e62f8f66b37749c805165ee76 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Tue, 9 Jun 2026 13:10:28 +0000 Subject: [PATCH 04/15] update constraint for openstacksdk to new release 4.15.0 meta: version: 4.15.0 meta: team: OpenStackSDK meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Stephen Finucane meta: release:Commit: Stephen Finucane meta: release:Change-Id: Id70b1c9f58acb1fb6e0f3149fa2a78c4b0415120 meta: release:Workflow+1: Elod Illes meta: release:Code-Review+2: Elod Illes Change-Id: Idfdea119469d2fc45cf0e35c00fbfd43e0b1f186 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index 340caeae5..52f659ab0 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -438,7 +438,7 @@ cotyledon===2.2.0 xattr===1.3.0 systemd-python===235 python-memcached===1.62 -openstacksdk===4.14.0 +openstacksdk===4.15.0 infi.dtypes.nqn===0.1.0 six===1.17.0 h2===4.3.0 From 2b3923716bc085b3b30238566f2ef773f728c550 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Tue, 9 Jun 2026 13:20:31 +0000 Subject: [PATCH 05/15] update constraint for oslo.utils to new release 10.1.1 meta: version: 10.1.1 meta: team: oslo meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Stephen Finucane meta: release:Commit: Stephen Finucane meta: release:Change-Id: Ida7850bd8cdb0298952080eb970d6119a90ac160 meta: release:Workflow+1: Elod Illes meta: release:Code-Review+2: Elod Illes meta: release:Code-Review+1: Takashi Kajinami Change-Id: I2ce459332d392ac0ebfc9de4326cd650ca0c52b5 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index 340caeae5..0b85d0731 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -559,7 +559,7 @@ python-linstor===1.28.1 filelock===3.29.1 python-tackerclient===2.5.0 python-heatclient===5.2.0 -oslo.utils===10.1.0 +oslo.utils===10.1.1 requests-kerberos===0.15.0 itsdangerous===2.2.0 XStatic-jquery-ui===1.13.0.2 From 9faec191e5cc2c60ede2a200fd083aa4cd8c3b6d Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Tue, 9 Jun 2026 16:54:31 +0000 Subject: [PATCH 06/15] update constraint for os-traits to new release 3.8.0 meta: version: 3.8.0 meta: team: nova meta: diff-start: - meta: series: independent meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Balazs Gibizer meta: release:Commit: Balazs Gibizer meta: release:Change-Id: I276d06d3026d2fa658b2fd7cfcdb1a14693d4b50 meta: release:Code-Review+2: Elod Illes meta: release:Workflow+1: Elod Illes meta: release:Code-Review+1: ribaudr Change-Id: Ibb8383c48896894dfd6afe3d6fa87df49a71c4b2 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index 340caeae5..46dfff261 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -354,7 +354,7 @@ keystonemiddleware===13.0.0 django-formtools===2.6.1 XStatic-Spin===1.2.5.3 rich===15.0.0 -os-traits===3.7.0 +os-traits===3.8.0 typepy===1.3.5 SecretStorage===3.5.0 XStatic-Rickshaw===1.5.1.3 From f98f5d08412043d87029256bdbfdf701be3ad0d0 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Wed, 10 Jun 2026 15:22:38 +0000 Subject: [PATCH 07/15] update constraint for python-openstackclient to new release 10.1.0 meta: version: 10.1.0 meta: team: OpenStackSDK meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Stephen Finucane meta: release:Commit: Stephen Finucane meta: release:Change-Id: I2eba5d757397435c94f180c819a20a25db107407 meta: release:Code-Review+2: Elod Illes meta: release:Workflow+1: Elod Illes Change-Id: I2828f9ba5a7125f93d5a1a63a33131a5b572ba62 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index b2636c520..f11ccec7f 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -460,7 +460,7 @@ python-ironicclient===6.1.0 babel===2.18.0 XStatic===1.0.3 XStatic-Angular-FileUpload===12.2.13.2 -python-openstackclient===10.0.0 +python-openstackclient===10.1.0 pyzmq===27.1.0 oslo.db===18.0.0 simplegeneric===0.8.1 From 3d4eef13ba933bfce9d4ab6e934ebdb2e1abf4a6 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Thu, 11 Jun 2026 13:32:54 +0000 Subject: [PATCH 08/15] update constraint for oslo.config to new release 10.5.0 meta: version: 10.5.0 meta: team: oslo meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Takashi Kajinami meta: release:Commit: Takashi Kajinami meta: release:Change-Id: I96a0aa930e8b5db2cca8fc4fcd2ccc55595dfa63 meta: release:Code-Review+2: Elod Illes meta: release:Workflow+1: Elod Illes meta: release:Code-Review+2: Thierry Carrez Change-Id: I730ec0449325834122f2ae12e5851665e0251bbf Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index b2636c520..068b83a8e 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -387,7 +387,7 @@ seqdiag===3.0.0 numpy===2.4.6 msgpack===1.1.2 Sphinx===9.0.4 -oslo.config===10.4.0 +oslo.config===10.5.0 openstackdocstheme===3.6.0 osc-placement===4.8.0 rpds-py===2026.5.1 From e198674f86cf5ebd927d35720a8fe176695e1556 Mon Sep 17 00:00:00 2001 From: Stephen Finucane Date: Tue, 19 May 2026 19:54:34 +0100 Subject: [PATCH 09/15] Insist on minimal pyproject.toml file Change-Id: I9e8a134067593c393cff063b6c02a40afdd18c89 Signed-off-by: Stephen Finucane --- openstack_requirements/project.py | 29 ++++++++ openstack_requirements/tests/test_project.py | 68 +++++++++++++++++++ .../files/project-requirements-change.py | 14 ++++ 3 files changed, 111 insertions(+) diff --git a/openstack_requirements/project.py b/openstack_requirements/project.py index a83035f9f..4f8eafcd2 100644 --- a/openstack_requirements/project.py +++ b/openstack_requirements/project.py @@ -123,6 +123,35 @@ def _read_setup_cfg_extras(root: str) -> dict[str, list[str]] | None: return result +def verify_pyproject_toml(root: str) -> bool: + data = _read_pyproject_toml(root) + + if data is None: + print('Missing pyproject.toml file', file=sys.stderr) + return False + + if 'build-system' not in data: + print("pyproject.toml is missing 'build-system' table", file=sys.stderr) + return False + + if (build_backend := data['build-system'].get('build-backend')) != 'pbr.build': + print( + f"pyproject.toml has invalid 'build-system.build-backend'. " + f"Expected 'pbr.build'; got {build_backend!r}", + file=sys.stderr, + ) + return False + + if 'project' not in data: + print( + "pyproject.toml is missing 'project' table. This is not currently " + "an error but may be in the future", + file=sys.stderr, + ) + + return True + + class Project(TypedDict): # The root directory path root: str diff --git a/openstack_requirements/tests/test_project.py b/openstack_requirements/tests/test_project.py index d61831bdd..596eec274 100644 --- a/openstack_requirements/tests/test_project.py +++ b/openstack_requirements/tests/test_project.py @@ -10,6 +10,7 @@ # License for the specific language governing permissions and limitations # under the License. +from io import StringIO import os import textwrap @@ -56,6 +57,73 @@ def test_empty(self): ) +class TestVerifyPyprojectToml(testtools.TestCase): + def setUp(self): + super().setUp() + self.stderr = StringIO() + self.useFixture(fixtures.MonkeyPatch('sys.stderr', self.stderr)) + + def test_valid(self): + root = self.useFixture(common.pep_518_fixture).root + self.assertTrue(project.verify_pyproject_toml(root)) + self.assertEqual('', self.stderr.getvalue()) + + def test_missing_file(self): + root = self.useFixture(fixtures.TempDir()).path + self.assertFalse(project.verify_pyproject_toml(root)) + self.assertEqual( + 'Missing pyproject.toml file\n', self.stderr.getvalue() + ) + + def test_missing_build_system(self): + root = self.useFixture(fixtures.TempDir()).path + with open(os.path.join(root, 'pyproject.toml'), 'w') as fh: + fh.write( + textwrap.dedent(""" + [project] + name = "foo" + """) + ) + self.assertFalse(project.verify_pyproject_toml(root)) + self.assertIn( + "pyproject.toml is missing 'build-system' table", + self.stderr.getvalue(), + ) + + def test_invalid_build_backend(self): + root = self.useFixture(fixtures.TempDir()).path + with open(os.path.join(root, 'pyproject.toml'), 'w') as fh: + fh.write( + textwrap.dedent(""" + [build-system] + requires = ["setuptools"] + build-backend = "setuptools.build_meta" + """) + ) + self.assertFalse(project.verify_pyproject_toml(root)) + self.assertIn( + "pyproject.toml has invalid 'build-system.build-backend'. " + "Expected 'pbr.build'; got 'setuptools.build_meta'", + self.stderr.getvalue(), + ) + + def test_missing_project_table(self): + root = self.useFixture(fixtures.TempDir()).path + with open(os.path.join(root, 'pyproject.toml'), 'w') as fh: + fh.write( + textwrap.dedent(""" + [build-system] + requires = ["pbr>=6.0.0", "setuptools>=64.0.0"] + build-backend = "pbr.build" + """) + ) + self.assertTrue(project.verify_pyproject_toml(root)) + self.assertIn( + "pyproject.toml is missing 'project' table", + self.stderr.getvalue(), + ) + + class TestProjectExtras(testtools.TestCase): def test_pyproject_toml(self): root = self.useFixture(fixtures.TempDir()).path diff --git a/playbooks/files/project-requirements-change.py b/playbooks/files/project-requirements-change.py index 85b227d1e..1baf73733 100755 --- a/playbooks/files/project-requirements-change.py +++ b/playbooks/files/project-requirements-change.py @@ -126,6 +126,14 @@ def main(): backports = {} cwd = os.getcwd() + + # Verify that pyproject.toml is present and contains the required + # attributes. We only do this on master since we don't want to be + # strict on already released branches + pyproject_found = None + if branch in ('master', 'main'): + pyproject_found = project.verify_pyproject_toml(cwd) + # build a list of requirements in the proposed change, # and check them for style violations while doing so head_proj = project.read(cwd) @@ -149,8 +157,14 @@ def main(): ) # report the results + error = False if failed or head_reqs.failed: print("*** Incompatible requirement found!") + error = True + if pyproject_found is False: + print("*** Invalid or missing pyproject.toml!") + error = True + if error: print("*** See https://docs.openstack.org/requirements/latest/") sys.exit(1) From eba28fa2422034f326790c0b9e34526573f2ae36 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Fri, 12 Jun 2026 06:13:53 +0000 Subject: [PATCH 10/15] update constraint for os-ken to new release 4.2.1 meta: version: 4.2.1 meta: team: neutron meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Rodolfo Alonso Hernandez meta: release:Commit: Rodolfo Alonso meta: release:Change-Id: I782bf231cdfb799962dfc3eeafc6da1a9ea9e769 meta: release:Code-Review+2: Elod Illes meta: release:Workflow+1: Elod Illes meta: release:Code-Review+1: Brian Haley Change-Id: I9e39ba8a71a2414a3028862308b41ba5a12b1c15 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index cb7ccb7b0..ee62c9c2b 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -286,7 +286,7 @@ pydantic_core===2.46.4 uritemplate===4.2.0 docutils===0.21.2 threadpoolctl===3.6.0 -os-ken===4.2.0 +os-ken===4.2.1 ujson===5.12.1 selenium===4.44.0 pytest-subtests===0.15.0 From b83fbd73926b84db0c913b943f72c71c1cadc641 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Sat, 13 Jun 2026 08:19:09 +0000 Subject: [PATCH 11/15] Updated from generate-constraints Fixes applied to automated upper-constraints.txt update: Pin versions for packages that are not ready for updating: - pyroute2: Nova/os-vif issues Co-Authored-by: Dr. Jens Harbott Change-Id: Iccaa9553d658295165cf678cec2fae94519b06ff Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:playbooks/proposal/propose_update.sh --- upper-constraints.txt | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index ee62c9c2b..fe309e9e6 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -58,7 +58,7 @@ python-mistralclient===6.2.0 oslo.context===6.4.0 rcssmin===1.2.2 pycadf===4.0.1 -grpcio===1.81.0 +grpcio===1.81.1 sniffio===1.3.1 fixtures===4.3.2 neutron-lib===4.0.0 @@ -69,7 +69,7 @@ storage-interfaces===1.0.5 pydantic===2.13.4 pystache===0.6.8 XStatic-Font-Awesome===6.2.1.2 -aiohttp===3.14.0 +aiohttp===3.14.1 waitress===3.0.2 os-refresh-config===14.0.1 pysnmp===7.1.27 @@ -80,7 +80,7 @@ sphinx-copybutton===0.5.2 beartype===0.22.9 ddt===1.7.2 pyserial===3.5 -moto===5.2.1 +moto===5.2.2 infi.dtypes.wwn===0.1.1 awscrt===0.34.1 pcre2===0.6.0 @@ -129,11 +129,11 @@ jsonpointer===3.1.1 defusedxml===0.7.1 opentelemetry-sdk===1.42.1 netaddr===1.3.0 -pyghmi===1.6.16 +pyghmi===1.6.17 sphinxcontrib-blockdiag===3.0.0 aiosqlite===0.22.1 gnocchiclient===7.2.0 -wcwidth===0.8.0 +wcwidth===0.8.1 sphinxcontrib.datatemplates===0.11.0 jsonpath-rw===1.4.0 prettytable===3.17.0 @@ -147,7 +147,7 @@ async-timeout===5.0.1 virtualbmc===3.3.0 SQLAlchemy===2.0.50 pyroute2===0.8.1 -google-auth===2.53.0 +google-auth===2.54.0 kazoo===2.11.0 pyspnego===0.12.1 trio-websocket===0.12.2 @@ -177,7 +177,7 @@ python-subunit===1.4.6 pycparser===3.0 mock===5.2.0 PyYAML===6.0.3 -beautifulsoup4===4.14.3 +beautifulsoup4===4.15.0 ovs===3.7.1 cryptography===43.0.3 httpcore===1.0.9 @@ -197,7 +197,7 @@ tzlocal===5.3.1 sysv_ipc===1.2.0 sphinxcontrib-jsmath===1.0.1 django_compressor===4.6.0 -awscurl===0.42 +awscurl===0.44 trio===0.33.0 python-novaclient===18.13.0 pact===1.12.0 @@ -300,7 +300,7 @@ capacity===1.3.14 playwright===1.60.0 markdown-it-py===4.2.0 retrying===1.4.2 -python-discovery===1.4.0 +python-discovery===1.4.2 platformdirs===4.10.0 pydotplus===2.0.2 boto3===1.35.99 @@ -385,7 +385,7 @@ python-consul===1.1.0 more-itertools===11.1.0 seqdiag===3.0.0 numpy===2.4.6 -msgpack===1.1.2 +msgpack===1.2.0 Sphinx===9.0.4 oslo.config===10.5.0 openstackdocstheme===3.6.0 @@ -405,7 +405,7 @@ pytest-metadata===3.1.1 pyparsing===3.3.2 geomet===1.1.0 opentelemetry-exporter-otlp-proto-common===1.42.1 -distlib===0.4.1 +distlib===0.4.3 ast_serialize===0.5.0 dogpile.cache===1.5.0 python-barbicanclient===7.4.0 @@ -556,7 +556,7 @@ importlib_metadata===9.0.0 sortedcontainers===2.4.0 microversion_parse===2.1.0 python-linstor===1.28.1 -filelock===3.29.1 +filelock===3.29.3 python-tackerclient===2.5.0 python-heatclient===5.2.0 oslo.utils===10.1.1 @@ -565,7 +565,7 @@ itsdangerous===2.2.0 XStatic-jquery-ui===1.13.0.2 monasca-statsd===2.7.0 python-dateutil===2.9.0.post0 -virtualenv===21.4.2 +virtualenv===21.4.3 colorama===0.4.6 confetti===2.5.3 ironic-lib===7.0.0 From 1cef3126f3b5b739b832a88d4980af7c02407f1f Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Wed, 17 Jun 2026 08:37:29 +0000 Subject: [PATCH 12/15] update constraint for neutron-lib to new release 4.1.0 meta: version: 4.1.0 meta: team: neutron meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Bence Romsics meta: release:Commit: Bence Romsics meta: release:Change-Id: Ia47d55d263b1415d21a9e67d8d5cea2e36a2fcb3 meta: release:Code-Review+1: Brian Haley meta: release:Workflow+1: Elod Illes meta: release:Code-Review+1: Lajos Katona meta: release:Code-Review+2: Elod Illes Change-Id: I629d548dbb49e2401deab02f695539b558643177 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index fe309e9e6..c86f46989 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -61,7 +61,7 @@ pycadf===4.0.1 grpcio===1.81.1 sniffio===1.3.1 fixtures===4.3.2 -neutron-lib===4.0.0 +neutron-lib===4.1.0 XStatic-FileSaver===1.3.2.1 jaraco.functools===4.5.0 oslo.metrics===0.16.0 From 8bd62aaa0c53cd0de5ed70dd77ec9a73d049180f Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Wed, 17 Jun 2026 08:40:51 +0000 Subject: [PATCH 13/15] update constraint for python-freezerclient to new release 6.4.0 meta: version: 6.4.0 meta: team: freezer meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Dmitriy Rabotyagov meta: release:Commit: Dmitriy Rabotyagov meta: release:Change-Id: I23be065fbc3123560558d68cd1ac4b38f1deff46 meta: release:Code-Review+1: Ivan Anfimov meta: release:Workflow+1: Elod Illes meta: release:Code-Review+2: Elod Illes Change-Id: Icfc04832d20c7605efb331cf31d21b1eaccfc74c Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index fe309e9e6..00a195b82 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -84,7 +84,7 @@ moto===5.2.2 infi.dtypes.wwn===0.1.1 awscrt===0.34.1 pcre2===0.6.0 -python-freezerclient===6.3.0 +python-freezerclient===6.4.0 python-vitrageclient===5.4.0 py-pure-client===1.88.0 krest===1.3.8 From 72d979fb9480ad935ba5110ad9fe91019144df23 Mon Sep 17 00:00:00 2001 From: OpenStack Proposal Bot Date: Wed, 17 Jun 2026 08:51:33 +0000 Subject: [PATCH 14/15] update constraint for openstacksdk to new release 4.16.0 meta: version: 4.16.0 meta: team: OpenStackSDK meta: diff-start: - meta: series: hibiscus meta: branch: master meta: release-type: release meta: pypi: yes meta: first: no meta: release:Author: Stephen Finucane meta: release:Commit: Stephen Finucane meta: release:Change-Id: Ibc3d9c7113f4ed9b53a0767bc85db1a969324ec6 meta: release:Code-Review+2: Elod Illes meta: release:Workflow+1: Elod Illes Change-Id: I39ba20ac333c5334417261081adc032d7fa7e352 Signed-off-by: OpenStack Proposal Bot Generated-By: openstack/project-config:roles/copy-release-tools-scripts/files/release-tools/update_constraints.sh --- upper-constraints.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/upper-constraints.txt b/upper-constraints.txt index fe309e9e6..66f3a37ab 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -438,7 +438,7 @@ cotyledon===2.2.0 xattr===1.3.0 systemd-python===235 python-memcached===1.62 -openstacksdk===4.15.0 +openstacksdk===4.16.0 infi.dtypes.nqn===0.1.0 six===1.17.0 h2===4.3.0 From afc42e2cfd7ae3f35ad2583e4323d7e2aef9a4c9 Mon Sep 17 00:00:00 2001 From: Adam Harwell Date: Tue, 16 Jun 2026 05:09:16 -0400 Subject: [PATCH 15/15] Add hypercorn Hypercorn is an HTTP/2-capable ASGI/WSGI server needed by the oslo.messaging HTTP transport driver to replace cheroot. It provides native HTTP/2 via h2, fd:// socket binding for TOCTOU-free port handoff, and clean async shutdown primitives for embedding in managed threads. * Is the library actively maintained? Yes. 57 releases over 7+ years (2018-2025). Author Phil Jones (pgjones) is a member of both the Pallets org (Flask/Werkzeug) and the python-hyper org (h2/h11/wsproto). Latest release 0.18.0 (November 2025) added Python 3.14 support. * Is the library good code? Yes. mypy strict mode, h2spec HTTP/2 conformance suite, Autobahn WebSocket fuzz testing, pytest + hypothesis property-based testing. CI tests Python 3.10-3.14. Zero published security advisories. * Is the library license compatible? Yes, MIT licensed. * Is the library already packaged in the distros we target? Yes. Ubuntu (noble 24.04 LTS): python3-hypercorn 0.14.4-1 Ubuntu (resolute 26.04 LTS): python3-hypercorn 0.17.3-4 Debian (trixie stable): python3-hypercorn 0.17.3-2 Zero open Debian bugs. * Is the function of this library already covered by other libraries in global-requirements.txt? No ASGI server exists in global-requirements. cheroot is WSGI-only and cannot serve HTTP/2. gunicorn added experimental ASGI support but lacks native HTTP/2 and fd:// socket binding. Hypercorn replaces cheroot in the HTTP driver with native ASGI + HTTP/2 support. Its core transitive dependencies (h2, h11, wsproto) are already in upper-constraints as indirect dependencies. * Is the library required for an OpenStack project? Which? Yes, oslo.messaging HTTP transport driver (blueprint oslo-http-driver). * If the library release is managed by the OpenStack release process? No, it is not managed by OpenStack. Needed-By: https://review.opendev.org/c/openstack/oslo.messaging/+/993525 Change-Id: I85dedd459472b18d53a17ec71c1ac28a026675f7 Assisted-By: claude-opus-4-6 (OpenCode) Signed-off-by: Adam Harwell --- global-requirements.txt | 1 + upper-constraints.txt | 1 + 2 files changed, 2 insertions(+) diff --git a/global-requirements.txt b/global-requirements.txt index a0913e3c8..bc1e8f5fb 100644 --- a/global-requirements.txt +++ b/global-requirements.txt @@ -72,6 +72,7 @@ grpcio # Apache-2.0 gunicorn # MIT httplib2 # MIT httpx # BSD +Hypercorn # MIT hvac # Apache-2.0 icalendar # BSD # Do not make importlib-metadata conditional on Python version: we depend on diff --git a/upper-constraints.txt b/upper-constraints.txt index fe309e9e6..7721526d2 100644 --- a/upper-constraints.txt +++ b/upper-constraints.txt @@ -67,6 +67,7 @@ jaraco.functools===4.5.0 oslo.metrics===0.16.0 storage-interfaces===1.0.5 pydantic===2.13.4 +Hypercorn===0.18.0 pystache===0.6.8 XStatic-Font-Awesome===6.2.1.2 aiohttp===3.14.1