From 4be3ad2287b77b2beaa2df479c4b8bb72f4ee55a Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 25 Mar 2026 14:05:58 -0700 Subject: [PATCH 01/34] Bump python version to 3.12 --- .github/workflows/ci.yml | 14 +++++++------- .github/workflows/nightly.yml | 14 +++++++------- .github/workflows/scheduled.yml | 14 +++++++------- .github/workflows/staging.yml | 14 +++++++------- cicd/shared-gh-workflows-context.yml | 2 +- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6d2c98b6280e..9b5fbaa3f424 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -470,7 +470,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -487,7 +487,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -504,7 +504,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -519,10 +519,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -539,7 +539,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: ${{ fromJSON(needs.prepare-workflow.outputs.config)['skip_code_coverage'] }} testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -557,7 +557,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: ${{ fromJSON(needs.prepare-workflow.outputs.config)['skip_code_coverage'] }} workflow-slug: ci default-timeout: 180 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 5020f2a760e8..8e7c34b28860 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -465,7 +465,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -482,7 +482,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -503,7 +503,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -522,10 +522,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -542,7 +542,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: true testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -560,7 +560,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: true workflow-slug: nightly default-timeout: 360 diff --git a/.github/workflows/scheduled.yml b/.github/workflows/scheduled.yml index 83d32acdeef7..007ef715d89e 100644 --- a/.github/workflows/scheduled.yml +++ b/.github/workflows/scheduled.yml @@ -513,7 +513,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -530,7 +530,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -547,7 +547,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -562,10 +562,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -582,7 +582,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: true testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -600,7 +600,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: true workflow-slug: scheduled default-timeout: 360 diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 0b5de3fadb67..ce8cb4e7419c 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -497,7 +497,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -515,7 +515,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -537,7 +537,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -556,10 +556,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.11.14" + python-version: "3.12.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -576,7 +576,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: true testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -594,7 +594,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.11.14 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 skip-code-coverage: true workflow-slug: staging default-timeout: 180 diff --git a/cicd/shared-gh-workflows-context.yml b/cicd/shared-gh-workflows-context.yml index 1632de2dd513..3f7df6dd43bb 100644 --- a/cicd/shared-gh-workflows-context.yml +++ b/cicd/shared-gh-workflows-context.yml @@ -3,7 +3,7 @@ # Tool versions nox_version: "2022.8.7" -python_version: "3.11.14" +python_version: "3.12.12" relenv_version: "0.22.4" release_branches: - "3006.x" From 1a7bdf70a84db6e8ba1703a78a4867f646a8bdee Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 25 Mar 2026 20:36:26 -0700 Subject: [PATCH 02/34] Use wheel for attrs to avoid building setuptools-scm --- tools/pkg/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pkg/build.py b/tools/pkg/build.py index 36c6c838329e..9b437c44dddf 100644 --- a/tools/pkg/build.py +++ b/tools/pkg/build.py @@ -627,7 +627,7 @@ def onedir_dependencies( python_bin = env_scripts_dir / "python3" install_args.append("--no-binary=:all:") install_args.append( - "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling" + "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling,attrs" ) # Cryptography needs openssl dir set to link to the proper openssl libs. From c6e85be0ae6b1436f682e06c74690d1a1112bf64 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 25 Mar 2026 23:10:10 -0700 Subject: [PATCH 03/34] Use binary setuptools-scm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The setuptools-scm 10.0.2 sdist contains a pyproject.toml with a backend-path entry (../vcs-versioning/src) that points outside its own source tree — a developer's local monorepo path that was accidentally shipped in the release. pip 25.2 now validates that backend-path entries stay inside the source tree and rejects it. The wheel is fine since it bypasses pyproject.toml processing entirely. --- tools/pkg/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pkg/build.py b/tools/pkg/build.py index 9b437c44dddf..613f4b69412f 100644 --- a/tools/pkg/build.py +++ b/tools/pkg/build.py @@ -627,7 +627,7 @@ def onedir_dependencies( python_bin = env_scripts_dir / "python3" install_args.append("--no-binary=:all:") install_args.append( - "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling,attrs" + "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling,attrs,setuptools-scm" ) # Cryptography needs openssl dir set to link to the proper openssl libs. From c0c2b057aefcd20f48ab59f8265bd59ae3c46141 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Thu, 26 Mar 2026 13:45:56 -0700 Subject: [PATCH 04/34] Add pluggy to only-binary to avoid setuptools-scm --- tools/pkg/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pkg/build.py b/tools/pkg/build.py index 613f4b69412f..e78be5e4c7ca 100644 --- a/tools/pkg/build.py +++ b/tools/pkg/build.py @@ -627,7 +627,7 @@ def onedir_dependencies( python_bin = env_scripts_dir / "python3" install_args.append("--no-binary=:all:") install_args.append( - "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling,attrs,setuptools-scm" + "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling,attrs,setuptools-scm,pluggy" ) # Cryptography needs openssl dir set to link to the proper openssl libs. From ec03b88ef0acbd0ec2df9ab6a8fd55d0847c900a Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Thu, 26 Mar 2026 15:12:59 -0700 Subject: [PATCH 05/34] Revert only binary changes --- tools/pkg/build.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/pkg/build.py b/tools/pkg/build.py index e78be5e4c7ca..36c6c838329e 100644 --- a/tools/pkg/build.py +++ b/tools/pkg/build.py @@ -627,7 +627,7 @@ def onedir_dependencies( python_bin = env_scripts_dir / "python3" install_args.append("--no-binary=:all:") install_args.append( - "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling,attrs,setuptools-scm,pluggy" + "--only-binary=maturin,apache-libcloud,pymssql,cassandra-driver,hatchling" ) # Cryptography needs openssl dir set to link to the proper openssl libs. From 6c49fdd1d1bb23582d2618e95298773a90b92469 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 14:12:03 -0700 Subject: [PATCH 06/34] Fix multidict build on macos --- pkg/macos/install_salt.sh | 2 +- tools/pkg/build.py | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/pkg/macos/install_salt.sh b/pkg/macos/install_salt.sh index fc6d23d7b88a..5e3211fab8f6 100755 --- a/pkg/macos/install_salt.sh +++ b/pkg/macos/install_salt.sh @@ -127,7 +127,7 @@ fi # Install Requirements into the Python Environment #------------------------------------------------------------------------------- _msg "Installing Salt requirements" -$PIP_BIN install -r "$REQ_FILE" > /dev/null 2>&1 +CFLAGS="${CFLAGS} -Wno-int-conversion" $PIP_BIN install -r "$REQ_FILE" > /dev/null 2>&1 if [ -f "$BUILD_DIR/bin/distro" ]; then _success else diff --git a/tools/pkg/build.py b/tools/pkg/build.py index 36c6c838329e..6e193aa0961f 100644 --- a/tools/pkg/build.py +++ b/tools/pkg/build.py @@ -633,6 +633,10 @@ def onedir_dependencies( # Cryptography needs openssl dir set to link to the proper openssl libs. if platform == "macos": env["OPENSSL_DIR"] = f"{dest}" + # Apple Clang 16+ (Xcode 16, macOS 14+) treats pointer-to-integer + # conversions as hard errors. Suppress for packages with older C code + # (e.g. multidict 6.0.4) that predate stricter Clang defaults. + env["CFLAGS"] = env.get("CFLAGS", "") + " -Wno-int-conversion" if platform == "linux": # This installs the ppbt package. We'll remove it after installing all From 7e540e8ef8f1eee219f5144bc6f8697ca84b7f31 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 15:54:23 -0700 Subject: [PATCH 07/34] Update ci deps for python 3.12 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `lxml` → requirements/base.txt: added lxml>=5.0.0; sys_platform != 'win32' (no cp312 wheels before 5.0.0) `ncclient` → requirements/static/ci/common.in: added ncclient>=0.6.16; sys_platform != 'win32' (SafeConfigParser removed in Python 3.12) `pygit2` → requirements/static/ci/{linux,darwin,windows}.in: bumped >=1.10.1 → >=1.14.0 (no cp312 wheels before 1.14.0) --- requirements/base.txt | 1 + requirements/static/ci/common.in | 1 + requirements/static/ci/darwin.in | 2 +- requirements/static/ci/linux.in | 2 +- requirements/static/ci/py3.10/cloud.txt | 25 ++++++++++++--------- requirements/static/ci/py3.10/darwin.txt | 25 ++++++++++++--------- requirements/static/ci/py3.10/docs.txt | 4 ++++ requirements/static/ci/py3.10/freebsd.txt | 19 ++++++++-------- requirements/static/ci/py3.10/lint.txt | 26 ++++++++++++---------- requirements/static/ci/py3.10/linux.txt | 25 ++++++++++++--------- requirements/static/ci/py3.10/windows.txt | 2 +- requirements/static/ci/py3.11/cloud.txt | 25 ++++++++++++--------- requirements/static/ci/py3.11/darwin.txt | 25 ++++++++++++--------- requirements/static/ci/py3.11/docs.txt | 4 ++++ requirements/static/ci/py3.11/freebsd.txt | 19 ++++++++-------- requirements/static/ci/py3.11/lint.txt | 26 ++++++++++++---------- requirements/static/ci/py3.11/linux.txt | 25 ++++++++++++--------- requirements/static/ci/py3.11/windows.txt | 2 +- requirements/static/ci/py3.12/cloud.txt | 25 ++++++++++++--------- requirements/static/ci/py3.12/darwin.txt | 25 ++++++++++++--------- requirements/static/ci/py3.12/docs.txt | 4 ++++ requirements/static/ci/py3.12/freebsd.txt | 19 ++++++++-------- requirements/static/ci/py3.12/lint.txt | 26 ++++++++++++---------- requirements/static/ci/py3.12/linux.txt | 25 ++++++++++++--------- requirements/static/ci/py3.12/windows.txt | 2 +- requirements/static/ci/py3.13/cloud.txt | 5 ++++- requirements/static/ci/py3.13/darwin.txt | 8 +++++-- requirements/static/ci/py3.13/docs.txt | 4 ++++ requirements/static/ci/py3.13/freebsd.txt | 4 +++- requirements/static/ci/py3.13/lint.txt | 5 ++++- requirements/static/ci/py3.13/linux.txt | 8 +++++-- requirements/static/ci/py3.9/cloud.txt | 21 ++++++++++------- requirements/static/ci/py3.9/darwin.txt | 21 +++++++++-------- requirements/static/ci/py3.9/docs.txt | 4 ++++ requirements/static/ci/py3.9/freebsd.txt | 17 +++++++------- requirements/static/ci/py3.9/lint.txt | 23 +++++++++++-------- requirements/static/ci/py3.9/linux.txt | 21 +++++++++-------- requirements/static/ci/py3.9/windows.txt | 2 +- requirements/static/ci/windows.in | 2 +- requirements/static/pkg/py3.10/darwin.txt | 2 ++ requirements/static/pkg/py3.10/freebsd.txt | 2 +- requirements/static/pkg/py3.10/linux.txt | 2 ++ requirements/static/pkg/py3.11/darwin.txt | 2 ++ requirements/static/pkg/py3.11/freebsd.txt | 2 +- requirements/static/pkg/py3.11/linux.txt | 2 ++ requirements/static/pkg/py3.12/darwin.txt | 2 ++ requirements/static/pkg/py3.12/freebsd.txt | 2 +- requirements/static/pkg/py3.12/linux.txt | 2 ++ requirements/static/pkg/py3.13/darwin.txt | 2 ++ requirements/static/pkg/py3.13/freebsd.txt | 2 +- requirements/static/pkg/py3.13/linux.txt | 2 ++ requirements/static/pkg/py3.9/darwin.txt | 2 ++ requirements/static/pkg/py3.9/freebsd.txt | 2 +- requirements/static/pkg/py3.9/linux.txt | 2 ++ 54 files changed, 335 insertions(+), 224 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 627a9bed58ca..97463944bc8e 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -27,6 +27,7 @@ jaraco.text>=4.0.0 Jinja2>=3.1.5 jmespath>=1.1.0 looseversion +lxml>=5.0.0; sys_platform != 'win32' lxml>=6.0.2; sys_platform == 'win32' MarkupSafe<3.0.0 msgpack>=1.0.0 ; python_version < '3.13' diff --git a/requirements/static/ci/common.in b/requirements/static/ci/common.in index 6358a8b1f95d..78b74709d74e 100644 --- a/requirements/static/ci/common.in +++ b/requirements/static/ci/common.in @@ -24,6 +24,7 @@ google-auth==2.35.0; python_version == '3.9' jmespath>=1.1.0 jsonschema junos-eznc; sys_platform != 'win32' +ncclient>=0.6.16; sys_platform != 'win32' junit-xml>=1.9 jxmlease; sys_platform != 'win32' kazoo; sys_platform != 'win32' and sys_platform != 'darwin' diff --git a/requirements/static/ci/darwin.in b/requirements/static/ci/darwin.in index 96ded57cab8f..5bebd6101667 100644 --- a/requirements/static/ci/darwin.in +++ b/requirements/static/ci/darwin.in @@ -1,4 +1,4 @@ -pygit2>=1.10.1 +pygit2>=1.14.0 yamllint mercurial hglib diff --git a/requirements/static/ci/linux.in b/requirements/static/ci/linux.in index 73cd0bfed347..1c98af4275bf 100644 --- a/requirements/static/ci/linux.in +++ b/requirements/static/ci/linux.in @@ -1,6 +1,6 @@ # Linux static CI requirements pyiface -pygit2>=1.10.1 +pygit2>=1.14.0 pymysql>=1.1.1 ansible>=10.7.0; python_version >= '3.10' and python_version < '3.11' ansible>=12.3.0; python_version >= '3.11' and python_version < '3.12' diff --git a/requirements/static/ci/py3.10/cloud.txt b/requirements/static/ci/py3.10/cloud.txt index 16a7f05de3e3..b62094c4c4e1 100644 --- a/requirements/static/ci/py3.10/cloud.txt +++ b/requirements/static/ci/py3.10/cloud.txt @@ -231,6 +231,10 @@ iniconfig==2.0.0 # via # -c requirements/static/ci/py3.10/linux.txt # pytest +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.10/linux.txt + # paramiko jaraco-collections==4.1.0 # via # -c requirements/static/ci/py3.10/linux.txt @@ -279,7 +283,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/common.in @@ -308,9 +312,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.10/linux.txt # -c requirements/static/pkg/py3.10/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.10/linux.txt + # -c requirements/static/pkg/py3.10/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -357,15 +363,13 @@ multidict==6.7.1 # -c requirements/static/pkg/py3.10/linux.txt # aiohttp # yarl -ncclient==0.6.13 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.10/linux.txt + # -r requirements/static/ci/common.in # junos-eznc netaddr==0.8.0 - # via - # -c requirements/static/ci/py3.10/linux.txt - # -r requirements/static/ci/cloud.in - # junos-eznc + # via -r requirements/static/ci/cloud.in oauthlib==3.3.1 # via # -c requirements/static/ci/py3.10/linux.txt @@ -380,7 +384,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.10/linux.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/common.in @@ -580,7 +584,7 @@ pyyaml==6.0.1 # kubernetes # pytest-salt-factories # responses - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.10/linux.txt @@ -653,7 +657,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # profitbricks # python-dateutil # pyvmomi @@ -783,7 +786,7 @@ xmltodict==0.13.0 # -c requirements/static/ci/py3.10/linux.txt # moto # pywinrm -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.10/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.10/darwin.txt b/requirements/static/ci/py3.10/darwin.txt index 81faf76e4d30..ed5f2d4bc31f 100644 --- a/requirements/static/ci/py3.10/darwin.txt +++ b/requirements/static/ci/py3.10/darwin.txt @@ -176,6 +176,8 @@ importlib-metadata==8.7.0 # -r requirements/base.txt iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.10/darwin.txt @@ -214,7 +216,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via -r requirements/static/ci/common.in jxmlease==1.0.3 # via -r requirements/static/ci/common.in @@ -226,8 +228,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.10/darwin.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.10/darwin.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -265,10 +269,10 @@ multidict==6.7.1 # -c requirements/static/pkg/py3.10/darwin.txt # aiohttp # yarl -ncclient==0.6.13 - # via junos-eznc -netaddr==0.8.0 - # via junos-eznc +ncclient==0.7.0 + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 @@ -278,7 +282,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.10/darwin.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # junos-eznc # ncclient @@ -325,7 +329,7 @@ pycryptodomex==3.19.1 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.18.2 # via -r requirements/static/ci/darwin.in pynacl==1.5.0 # via @@ -416,7 +420,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.10/darwin.txt @@ -460,7 +464,6 @@ six==1.16.0 # junit-xml # junos-eznc # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -548,7 +551,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/darwin.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.23.0 # via diff --git a/requirements/static/ci/py3.10/docs.txt b/requirements/static/ci/py3.10/docs.txt index 24cd0ad991f6..250594d0f033 100644 --- a/requirements/static/ci/py3.10/docs.txt +++ b/requirements/static/ci/py3.10/docs.txt @@ -148,6 +148,10 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/base.txt +lxml==6.0.2 + # via + # -c requirements/static/ci/py3.10/linux.txt + # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.10/freebsd.txt b/requirements/static/ci/py3.10/freebsd.txt index ff7e3794f3d8..665bb01c22af 100644 --- a/requirements/static/ci/py3.10/freebsd.txt +++ b/requirements/static/ci/py3.10/freebsd.txt @@ -186,6 +186,8 @@ importlib-metadata==8.7.0 # -r requirements/static/pkg/freebsd.in iniconfig==2.0.0 # via pytest +invoke==2.2.1 ; sys_platform != 'win32' + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.10/freebsd.txt @@ -224,7 +226,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 ; sys_platform != 'win32' +junos-eznc==2.7.6 ; sys_platform != 'win32' # via -r requirements/static/ci/common.in jxmlease==1.0.3 ; sys_platform != 'win32' # via -r requirements/static/ci/common.in @@ -281,10 +283,10 @@ multidict==6.7.1 # -c requirements/static/pkg/py3.10/freebsd.txt # aiohttp # yarl -ncclient==0.6.13 ; sys_platform != 'win32' - # via junos-eznc -netaddr==0.8.0 ; sys_platform != 'win32' - # via junos-eznc +ncclient==0.7.0 ; sys_platform != 'win32' + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 ; sys_platform != 'win32' @@ -294,7 +296,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.10/freebsd.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 ; sys_platform != 'win32' +paramiko==4.0.0 ; sys_platform != 'win32' # via # -r requirements/static/ci/common.in # junos-eznc @@ -460,7 +462,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==27.1.0 # via # -c requirements/static/pkg/py3.10/freebsd.txt @@ -523,7 +525,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -619,7 +620,7 @@ xmltodict==1.0.4 # moto yamllint==1.32.0 # via -r requirements/static/ci/freebsd.in -yamlordereddictloader==0.4.0 ; sys_platform != 'win32' +yamlloader==1.6.0 ; sys_platform != 'win32' # via junos-eznc yarl==1.23.0 # via diff --git a/requirements/static/ci/py3.10/lint.txt b/requirements/static/ci/py3.10/lint.txt index b9269590b1f2..478e1e564d52 100644 --- a/requirements/static/ci/py3.10/lint.txt +++ b/requirements/static/ci/py3.10/lint.txt @@ -255,6 +255,10 @@ importlib-metadata==8.7.0 # -c requirements/static/pkg/py3.10/linux.txt # -r requirements/base.txt # -r requirements/static/pkg/linux.in +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.10/linux.txt + # paramiko isort==4.3.21 # via pylint jaraco-collections==4.1.0 @@ -306,7 +310,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/common.in @@ -335,9 +339,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.10/linux.txt # -c requirements/static/pkg/py3.10/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.10/linux.txt + # -c requirements/static/pkg/py3.10/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -384,13 +390,10 @@ multidict==6.7.1 # -c requirements/static/pkg/py3.10/linux.txt # aiohttp # yarl -ncclient==0.6.13 - # via - # -c requirements/static/ci/py3.10/linux.txt - # junos-eznc -netaddr==0.8.0 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.10/linux.txt + # -r requirements/static/ci/common.in # junos-eznc oauthlib==3.3.1 # via @@ -406,7 +409,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.10/linux.txt # -r requirements/base.txt # ansible-core -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/common.in @@ -461,7 +464,7 @@ pycryptodomex==3.19.1 # -c requirements/static/ci/py3.10/linux.txt # -c requirements/static/pkg/py3.10/linux.txt # -r requirements/crypto.txt -pygit2==1.13.1 +pygit2==1.18.2 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/linux.in @@ -565,7 +568,7 @@ pyyaml==6.0.1 # kubernetes # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.10/linux.txt @@ -648,7 +651,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -791,7 +793,7 @@ yamllint==1.32.0 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.10/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.10/linux.txt b/requirements/static/ci/py3.10/linux.txt index 5872ad58aeaf..3b0650c98dc1 100644 --- a/requirements/static/ci/py3.10/linux.txt +++ b/requirements/static/ci/py3.10/linux.txt @@ -197,6 +197,8 @@ importlib-metadata==8.7.0 # -r requirements/base.txt iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.10/linux.txt @@ -236,7 +238,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via -r requirements/static/ci/common.in jxmlease==1.0.3 # via -r requirements/static/ci/common.in @@ -252,8 +254,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.10/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.10/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -291,10 +295,10 @@ multidict==6.7.1 # -c requirements/static/pkg/py3.10/linux.txt # aiohttp # yarl -ncclient==0.6.13 - # via junos-eznc -netaddr==0.8.0 - # via junos-eznc +ncclient==0.7.0 + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 @@ -305,7 +309,7 @@ packaging==24.0 # -r requirements/base.txt # ansible-core # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -r requirements/static/ci/common.in # junos-eznc @@ -353,7 +357,7 @@ pycryptodomex==3.19.1 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.18.2 # via -r requirements/static/ci/linux.in pyiface==0.0.11 # via -r requirements/static/ci/linux.in @@ -458,7 +462,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.10/linux.txt @@ -515,7 +519,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -615,7 +618,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.23.0 # via diff --git a/requirements/static/ci/py3.10/windows.txt b/requirements/static/ci/py3.10/windows.txt index 235bdf6522cb..950268e22741 100644 --- a/requirements/static/ci/py3.10/windows.txt +++ b/requirements/static/ci/py3.10/windows.txt @@ -316,7 +316,7 @@ pycryptodomex==3.23.0 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.18.2 # via -r requirements/static/ci/windows.in pygments==2.19.2 # via diff --git a/requirements/static/ci/py3.11/cloud.txt b/requirements/static/ci/py3.11/cloud.txt index 6c740b8bf15d..669ef35f19ed 100644 --- a/requirements/static/ci/py3.11/cloud.txt +++ b/requirements/static/ci/py3.11/cloud.txt @@ -221,6 +221,10 @@ iniconfig==2.0.0 # via # -c requirements/static/ci/py3.11/linux.txt # pytest +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.11/linux.txt + # paramiko jaraco-collections==4.1.0 # via # -c requirements/static/ci/py3.11/linux.txt @@ -269,7 +273,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/common.in @@ -298,9 +302,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.11/linux.txt # -c requirements/static/pkg/py3.11/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.11/linux.txt + # -c requirements/static/pkg/py3.11/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -347,15 +353,13 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.11/linux.txt # aiohttp # yarl -ncclient==0.6.13 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.11/linux.txt + # -r requirements/static/ci/common.in # junos-eznc netaddr==0.8.0 - # via - # -c requirements/static/ci/py3.11/linux.txt - # -r requirements/static/ci/cloud.in - # junos-eznc + # via -r requirements/static/ci/cloud.in oauthlib==3.3.1 # via # -c requirements/static/ci/py3.11/linux.txt @@ -370,7 +374,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.11/linux.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/common.in @@ -570,7 +574,7 @@ pyyaml==6.0.1 # kubernetes # pytest-salt-factories # responses - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.11/linux.txt @@ -643,7 +647,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # profitbricks # python-dateutil # pyvmomi @@ -766,7 +769,7 @@ xmltodict==0.13.0 # -c requirements/static/ci/py3.11/linux.txt # moto # pywinrm -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.11/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.11/darwin.txt b/requirements/static/ci/py3.11/darwin.txt index 0c73963ce52b..2ba296d81e23 100644 --- a/requirements/static/ci/py3.11/darwin.txt +++ b/requirements/static/ci/py3.11/darwin.txt @@ -169,6 +169,8 @@ importlib-metadata==8.7.0 # -r requirements/base.txt iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.11/darwin.txt @@ -207,7 +209,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via -r requirements/static/ci/common.in jxmlease==1.0.3 # via -r requirements/static/ci/common.in @@ -219,8 +221,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.11/darwin.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.11/darwin.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -258,10 +262,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.11/darwin.txt # aiohttp # yarl -ncclient==0.6.13 - # via junos-eznc -netaddr==0.8.0 - # via junos-eznc +ncclient==0.7.0 + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 @@ -271,7 +275,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.11/darwin.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # junos-eznc # ncclient @@ -318,7 +322,7 @@ pycryptodomex==3.19.1 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.19.1 # via -r requirements/static/ci/darwin.in pynacl==1.5.0 # via @@ -409,7 +413,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.11/darwin.txt @@ -453,7 +457,6 @@ six==1.16.0 # junit-xml # junos-eznc # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -536,7 +539,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/darwin.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.20.1 # via diff --git a/requirements/static/ci/py3.11/docs.txt b/requirements/static/ci/py3.11/docs.txt index 7e41a185b70b..c63df7b2c6a0 100644 --- a/requirements/static/ci/py3.11/docs.txt +++ b/requirements/static/ci/py3.11/docs.txt @@ -144,6 +144,10 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/base.txt +lxml==6.0.2 + # via + # -c requirements/static/ci/py3.11/linux.txt + # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.11/freebsd.txt b/requirements/static/ci/py3.11/freebsd.txt index 2d3e3b711873..b6d16b56d90b 100644 --- a/requirements/static/ci/py3.11/freebsd.txt +++ b/requirements/static/ci/py3.11/freebsd.txt @@ -179,6 +179,8 @@ importlib-metadata==8.7.0 # -r requirements/static/pkg/freebsd.in iniconfig==2.0.0 # via pytest +invoke==2.2.1 ; sys_platform != 'win32' + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.11/freebsd.txt @@ -217,7 +219,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 ; sys_platform != 'win32' +junos-eznc==2.7.6 ; sys_platform != 'win32' # via -r requirements/static/ci/common.in jxmlease==1.0.3 ; sys_platform != 'win32' # via -r requirements/static/ci/common.in @@ -274,10 +276,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.11/freebsd.txt # aiohttp # yarl -ncclient==0.6.13 ; sys_platform != 'win32' - # via junos-eznc -netaddr==0.8.0 ; sys_platform != 'win32' - # via junos-eznc +ncclient==0.7.0 ; sys_platform != 'win32' + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 ; sys_platform != 'win32' @@ -287,7 +289,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.11/freebsd.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 ; sys_platform != 'win32' +paramiko==4.0.0 ; sys_platform != 'win32' # via # -r requirements/static/ci/common.in # junos-eznc @@ -449,7 +451,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==27.1.0 # via # -c requirements/static/pkg/py3.11/freebsd.txt @@ -499,7 +501,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -590,7 +591,7 @@ xmltodict==1.0.4 # moto yamllint==1.32.0 # via -r requirements/static/ci/freebsd.in -yamlordereddictloader==0.4.0 ; sys_platform != 'win32' +yamlloader==1.6.0 ; sys_platform != 'win32' # via junos-eznc yarl==1.20.1 # via diff --git a/requirements/static/ci/py3.11/lint.txt b/requirements/static/ci/py3.11/lint.txt index 02f477da4f74..64f6565c8f88 100644 --- a/requirements/static/ci/py3.11/lint.txt +++ b/requirements/static/ci/py3.11/lint.txt @@ -246,6 +246,10 @@ importlib-metadata==8.7.0 # -c requirements/static/pkg/py3.11/linux.txt # -r requirements/base.txt # -r requirements/static/pkg/linux.in +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.11/linux.txt + # paramiko isort==4.3.21 # via pylint jaraco-collections==4.1.0 @@ -297,7 +301,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/common.in @@ -326,9 +330,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.11/linux.txt # -c requirements/static/pkg/py3.11/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.11/linux.txt + # -c requirements/static/pkg/py3.11/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -375,13 +381,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.11/linux.txt # aiohttp # yarl -ncclient==0.6.13 - # via - # -c requirements/static/ci/py3.11/linux.txt - # junos-eznc -netaddr==0.8.0 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.11/linux.txt + # -r requirements/static/ci/common.in # junos-eznc oauthlib==3.3.1 # via @@ -397,7 +400,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.11/linux.txt # -r requirements/base.txt # ansible-core -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/common.in @@ -452,7 +455,7 @@ pycryptodomex==3.19.1 # -c requirements/static/ci/py3.11/linux.txt # -c requirements/static/pkg/py3.11/linux.txt # -r requirements/crypto.txt -pygit2==1.13.1 +pygit2==1.19.1 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/linux.in @@ -556,7 +559,7 @@ pyyaml==6.0.1 # kubernetes # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.11/linux.txt @@ -639,7 +642,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -774,7 +776,7 @@ yamllint==1.32.0 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.11/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.11/linux.txt b/requirements/static/ci/py3.11/linux.txt index 582578864518..414ad83083c2 100644 --- a/requirements/static/ci/py3.11/linux.txt +++ b/requirements/static/ci/py3.11/linux.txt @@ -188,6 +188,8 @@ importlib-metadata==8.7.0 # -r requirements/base.txt iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.11/linux.txt @@ -227,7 +229,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via -r requirements/static/ci/common.in jxmlease==1.0.3 # via -r requirements/static/ci/common.in @@ -243,8 +245,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.11/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.11/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -282,10 +286,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.11/linux.txt # aiohttp # yarl -ncclient==0.6.13 - # via junos-eznc -netaddr==0.8.0 - # via junos-eznc +ncclient==0.7.0 + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 @@ -296,7 +300,7 @@ packaging==24.0 # -r requirements/base.txt # ansible-core # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -r requirements/static/ci/common.in # junos-eznc @@ -344,7 +348,7 @@ pycryptodomex==3.19.1 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.19.1 # via -r requirements/static/ci/linux.in pyiface==0.0.11 # via -r requirements/static/ci/linux.in @@ -449,7 +453,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.11/linux.txt @@ -506,7 +510,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -601,7 +604,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.20.1 # via diff --git a/requirements/static/ci/py3.11/windows.txt b/requirements/static/ci/py3.11/windows.txt index 28bf09af259f..cf27539d1ec6 100644 --- a/requirements/static/ci/py3.11/windows.txt +++ b/requirements/static/ci/py3.11/windows.txt @@ -309,7 +309,7 @@ pycryptodomex==3.23.0 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.19.1 # via -r requirements/static/ci/windows.in pygments==2.19.2 # via diff --git a/requirements/static/ci/py3.12/cloud.txt b/requirements/static/ci/py3.12/cloud.txt index 5a4dbfe58f58..1c1469e4dd5c 100644 --- a/requirements/static/ci/py3.12/cloud.txt +++ b/requirements/static/ci/py3.12/cloud.txt @@ -216,6 +216,10 @@ iniconfig==2.0.0 # via # -c requirements/static/ci/py3.12/linux.txt # pytest +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.12/linux.txt + # paramiko jaraco-collections==4.1.0 # via # -c requirements/static/ci/py3.12/linux.txt @@ -264,7 +268,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/common.in @@ -293,9 +297,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.12/linux.txt # -c requirements/static/pkg/py3.12/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.12/linux.txt + # -c requirements/static/pkg/py3.12/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -342,15 +348,13 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.12/linux.txt # aiohttp # yarl -ncclient==0.6.13 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.12/linux.txt + # -r requirements/static/ci/common.in # junos-eznc netaddr==0.8.0 - # via - # -c requirements/static/ci/py3.12/linux.txt - # -r requirements/static/ci/cloud.in - # junos-eznc + # via -r requirements/static/ci/cloud.in oauthlib==3.3.1 # via # -c requirements/static/ci/py3.12/linux.txt @@ -365,7 +369,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.12/linux.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/common.in @@ -565,7 +569,7 @@ pyyaml==6.0.1 # kubernetes # pytest-salt-factories # responses - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.12/linux.txt @@ -638,7 +642,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # profitbricks # python-dateutil # pyvmomi @@ -761,7 +764,7 @@ xmltodict==0.13.0 # -c requirements/static/ci/py3.12/linux.txt # moto # pywinrm -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.12/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.12/darwin.txt b/requirements/static/ci/py3.12/darwin.txt index 04495d5eda4b..c97db46d12dd 100644 --- a/requirements/static/ci/py3.12/darwin.txt +++ b/requirements/static/ci/py3.12/darwin.txt @@ -165,6 +165,8 @@ importlib-metadata==8.7.0 # -r requirements/base.txt iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.12/darwin.txt @@ -203,7 +205,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via -r requirements/static/ci/common.in jxmlease==1.0.3 # via -r requirements/static/ci/common.in @@ -215,8 +217,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.12/darwin.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.12/darwin.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -254,10 +258,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.12/darwin.txt # aiohttp # yarl -ncclient==0.6.13 - # via junos-eznc -netaddr==0.8.0 - # via junos-eznc +ncclient==0.7.0 + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 @@ -267,7 +271,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.12/darwin.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # junos-eznc # ncclient @@ -314,7 +318,7 @@ pycryptodomex==3.19.1 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.19.1 # via -r requirements/static/ci/darwin.in pynacl==1.5.0 # via @@ -405,7 +409,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.12/darwin.txt @@ -449,7 +453,6 @@ six==1.16.0 # junit-xml # junos-eznc # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -532,7 +535,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/darwin.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.20.1 # via diff --git a/requirements/static/ci/py3.12/docs.txt b/requirements/static/ci/py3.12/docs.txt index 4ccb967d5125..3341625bfb77 100644 --- a/requirements/static/ci/py3.12/docs.txt +++ b/requirements/static/ci/py3.12/docs.txt @@ -140,6 +140,10 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/base.txt +lxml==6.0.2 + # via + # -c requirements/static/ci/py3.12/linux.txt + # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.12/freebsd.txt b/requirements/static/ci/py3.12/freebsd.txt index 87d254484423..eb1188ecc026 100644 --- a/requirements/static/ci/py3.12/freebsd.txt +++ b/requirements/static/ci/py3.12/freebsd.txt @@ -175,6 +175,8 @@ importlib-metadata==8.7.0 # -r requirements/static/pkg/freebsd.in iniconfig==2.0.0 # via pytest +invoke==2.2.1 ; sys_platform != 'win32' + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.12/freebsd.txt @@ -213,7 +215,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 ; sys_platform != 'win32' +junos-eznc==2.7.6 ; sys_platform != 'win32' # via -r requirements/static/ci/common.in jxmlease==1.0.3 ; sys_platform != 'win32' # via -r requirements/static/ci/common.in @@ -270,10 +272,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.12/freebsd.txt # aiohttp # yarl -ncclient==0.6.13 ; sys_platform != 'win32' - # via junos-eznc -netaddr==0.8.0 ; sys_platform != 'win32' - # via junos-eznc +ncclient==0.7.0 ; sys_platform != 'win32' + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 ; sys_platform != 'win32' @@ -283,7 +285,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.12/freebsd.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 ; sys_platform != 'win32' +paramiko==4.0.0 ; sys_platform != 'win32' # via # -r requirements/static/ci/common.in # junos-eznc @@ -445,7 +447,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==27.1.0 # via # -c requirements/static/pkg/py3.12/freebsd.txt @@ -495,7 +497,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -586,7 +587,7 @@ xmltodict==1.0.4 # moto yamllint==1.32.0 # via -r requirements/static/ci/freebsd.in -yamlordereddictloader==0.4.0 ; sys_platform != 'win32' +yamlloader==1.6.0 ; sys_platform != 'win32' # via junos-eznc yarl==1.20.1 # via diff --git a/requirements/static/ci/py3.12/lint.txt b/requirements/static/ci/py3.12/lint.txt index f8e2658e3166..780086b5e95f 100644 --- a/requirements/static/ci/py3.12/lint.txt +++ b/requirements/static/ci/py3.12/lint.txt @@ -241,6 +241,10 @@ importlib-metadata==8.7.0 # -c requirements/static/pkg/py3.12/linux.txt # -r requirements/base.txt # -r requirements/static/pkg/linux.in +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.12/linux.txt + # paramiko isort==4.3.21 # via pylint jaraco-collections==4.1.0 @@ -292,7 +296,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/common.in @@ -321,9 +325,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.12/linux.txt # -c requirements/static/pkg/py3.12/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.12/linux.txt + # -c requirements/static/pkg/py3.12/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -370,13 +376,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.12/linux.txt # aiohttp # yarl -ncclient==0.6.13 - # via - # -c requirements/static/ci/py3.12/linux.txt - # junos-eznc -netaddr==0.8.0 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.12/linux.txt + # -r requirements/static/ci/common.in # junos-eznc oauthlib==3.3.1 # via @@ -392,7 +395,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.12/linux.txt # -r requirements/base.txt # ansible-core -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/common.in @@ -447,7 +450,7 @@ pycryptodomex==3.19.1 # -c requirements/static/ci/py3.12/linux.txt # -c requirements/static/pkg/py3.12/linux.txt # -r requirements/crypto.txt -pygit2==1.13.1 +pygit2==1.19.1 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/linux.in @@ -551,7 +554,7 @@ pyyaml==6.0.1 # kubernetes # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.12/linux.txt @@ -634,7 +637,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -769,7 +771,7 @@ yamllint==1.32.0 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.12/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.12/linux.txt b/requirements/static/ci/py3.12/linux.txt index 94948773e8b3..d13827b70c2b 100644 --- a/requirements/static/ci/py3.12/linux.txt +++ b/requirements/static/ci/py3.12/linux.txt @@ -184,6 +184,8 @@ importlib-metadata==8.7.0 # -r requirements/base.txt iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.12/linux.txt @@ -223,7 +225,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via -r requirements/static/ci/common.in jxmlease==1.0.3 # via -r requirements/static/ci/common.in @@ -239,8 +241,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.12/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.12/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -278,10 +282,10 @@ multidict==6.0.4 # -c requirements/static/pkg/py3.12/linux.txt # aiohttp # yarl -ncclient==0.6.13 - # via junos-eznc -netaddr==0.8.0 - # via junos-eznc +ncclient==0.7.0 + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 @@ -292,7 +296,7 @@ packaging==24.0 # -r requirements/base.txt # ansible-core # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -r requirements/static/ci/common.in # junos-eznc @@ -340,7 +344,7 @@ pycryptodomex==3.19.1 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.19.1 # via -r requirements/static/ci/linux.in pyiface==0.0.11 # via -r requirements/static/ci/linux.in @@ -445,7 +449,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.12/linux.txt @@ -502,7 +506,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -597,7 +600,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.20.1 # via diff --git a/requirements/static/ci/py3.12/windows.txt b/requirements/static/ci/py3.12/windows.txt index 397f9e083d05..3e21e6b9e159 100644 --- a/requirements/static/ci/py3.12/windows.txt +++ b/requirements/static/ci/py3.12/windows.txt @@ -303,7 +303,7 @@ pycryptodomex==3.23.0 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.19.1 # via -r requirements/static/ci/windows.in pygments==2.19.2 # via diff --git a/requirements/static/ci/py3.13/cloud.txt b/requirements/static/ci/py3.13/cloud.txt index f05a5ca8a6d0..2fc648636ae2 100644 --- a/requirements/static/ci/py3.13/cloud.txt +++ b/requirements/static/ci/py3.13/cloud.txt @@ -299,9 +299,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.13/linux.txt # -c requirements/static/pkg/py3.13/linux.txt # -r requirements/base.txt -lxml==5.3.0 +lxml==6.0.2 # via # -c requirements/static/ci/py3.13/linux.txt + # -c requirements/static/pkg/py3.13/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -351,6 +353,7 @@ multidict==6.1.0 ncclient==0.6.16 # via # -c requirements/static/ci/py3.13/linux.txt + # -r requirements/static/ci/common.in # junos-eznc netaddr==1.3.0 # via -r requirements/static/ci/cloud.in diff --git a/requirements/static/ci/py3.13/darwin.txt b/requirements/static/ci/py3.13/darwin.txt index 9685edcea1d5..95e031cfacba 100644 --- a/requirements/static/ci/py3.13/darwin.txt +++ b/requirements/static/ci/py3.13/darwin.txt @@ -219,8 +219,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.13/darwin.txt # -r requirements/base.txt -lxml==5.3.0 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.13/darwin.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -259,7 +261,9 @@ multidict==6.1.0 # aiohttp # yarl ncclient==0.6.16 - # via junos-eznc + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 diff --git a/requirements/static/ci/py3.13/docs.txt b/requirements/static/ci/py3.13/docs.txt index a2a9976691d4..1fb546e2f074 100644 --- a/requirements/static/ci/py3.13/docs.txt +++ b/requirements/static/ci/py3.13/docs.txt @@ -140,6 +140,10 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.13/linux.txt # -r requirements/base.txt +lxml==6.0.2 + # via + # -c requirements/static/ci/py3.13/linux.txt + # -r requirements/base.txt markdown-it-py==3.0.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.13/freebsd.txt b/requirements/static/ci/py3.13/freebsd.txt index 7e5fca466c97..7bb5a25c1d43 100644 --- a/requirements/static/ci/py3.13/freebsd.txt +++ b/requirements/static/ci/py3.13/freebsd.txt @@ -270,7 +270,9 @@ multidict==6.1.0 # aiohttp # yarl ncclient==0.6.16 ; sys_platform != 'win32' - # via junos-eznc + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 ; sys_platform != 'win32' diff --git a/requirements/static/ci/py3.13/lint.txt b/requirements/static/ci/py3.13/lint.txt index f4d99db1356c..abf1a7da739f 100644 --- a/requirements/static/ci/py3.13/lint.txt +++ b/requirements/static/ci/py3.13/lint.txt @@ -326,9 +326,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.13/linux.txt # -c requirements/static/pkg/py3.13/linux.txt # -r requirements/base.txt -lxml==5.3.0 +lxml==6.0.2 # via # -c requirements/static/ci/py3.13/linux.txt + # -c requirements/static/pkg/py3.13/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -378,6 +380,7 @@ multidict==6.1.0 ncclient==0.6.16 # via # -c requirements/static/ci/py3.13/linux.txt + # -r requirements/static/ci/common.in # junos-eznc oauthlib==3.3.1 # via diff --git a/requirements/static/ci/py3.13/linux.txt b/requirements/static/ci/py3.13/linux.txt index f345c9f6c4cc..fdc8c72bbd5c 100644 --- a/requirements/static/ci/py3.13/linux.txt +++ b/requirements/static/ci/py3.13/linux.txt @@ -243,8 +243,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.13/linux.txt # -r requirements/base.txt -lxml==5.3.0 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.13/linux.txt + # -r requirements/base.txt # junos-eznc # ncclient # xmldiff @@ -283,7 +285,9 @@ multidict==6.1.0 # aiohttp # yarl ncclient==0.6.16 - # via junos-eznc + # via + # -r requirements/static/ci/common.in + # junos-eznc oauthlib==3.3.1 # via requests-oauthlib oscrypto==1.3.0 diff --git a/requirements/static/ci/py3.9/cloud.txt b/requirements/static/ci/py3.9/cloud.txt index e651184fe2ad..7129a29a565e 100644 --- a/requirements/static/ci/py3.9/cloud.txt +++ b/requirements/static/ci/py3.9/cloud.txt @@ -241,6 +241,10 @@ iniconfig==2.0.0 # via # -c requirements/static/ci/py3.9/linux.txt # pytest +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.9/linux.txt + # paramiko jaraco-collections==4.1.0 # via # -c requirements/static/ci/py3.9/linux.txt @@ -290,7 +294,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in @@ -320,9 +324,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.9/linux.txt # -c requirements/static/pkg/py3.9/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.9/linux.txt + # -c requirements/static/pkg/py3.9/linux.txt + # -r requirements/base.txt # junos-eznc # napalm # ncclient @@ -374,16 +380,16 @@ napalm==4.1.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in -ncclient==0.6.13 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.9/linux.txt + # -r requirements/static/ci/common.in # junos-eznc # napalm netaddr==0.8.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/cloud.in - # junos-eznc # napalm # pyeapi netmiko==4.2.0 @@ -412,7 +418,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.9/linux.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in @@ -628,7 +634,7 @@ pyyaml==6.0.1 # netmiko # pytest-salt-factories # responses - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.9/linux.txt @@ -708,7 +714,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # profitbricks # python-dateutil # pyvmomi @@ -849,7 +854,7 @@ xmltodict==0.13.0 # -c requirements/static/ci/py3.9/linux.txt # moto # pywinrm -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.9/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.9/darwin.txt b/requirements/static/ci/py3.9/darwin.txt index 6684a383c374..2cd65936775d 100644 --- a/requirements/static/ci/py3.9/darwin.txt +++ b/requirements/static/ci/py3.9/darwin.txt @@ -183,6 +183,8 @@ importlib-metadata==8.7.0 # -r requirements/base.txt iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.9/darwin.txt @@ -222,7 +224,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -r requirements/static/ci/common.in # napalm @@ -236,8 +238,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.9/darwin.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.9/darwin.txt + # -r requirements/base.txt # junos-eznc # napalm # ncclient @@ -278,13 +282,13 @@ multidict==6.7.1 # yarl napalm==4.1.0 # via -r requirements/static/ci/common.in -ncclient==0.6.13 +ncclient==0.7.0 # via + # -r requirements/static/ci/common.in # junos-eznc # napalm netaddr==0.8.0 # via - # junos-eznc # napalm # pyeapi netmiko==4.2.0 @@ -302,7 +306,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.9/darwin.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # junos-eznc # napalm @@ -359,7 +363,7 @@ pyeapi==1.0.0 # via napalm pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.15.1 # via -r requirements/static/ci/darwin.in pynacl==1.5.0 # via @@ -454,7 +458,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.9/darwin.txt @@ -504,7 +508,6 @@ six==1.16.0 # junit-xml # junos-eznc # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -605,7 +608,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/darwin.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.22.0 # via diff --git a/requirements/static/ci/py3.9/docs.txt b/requirements/static/ci/py3.9/docs.txt index 0cb79d1ba033..c72265f63820 100644 --- a/requirements/static/ci/py3.9/docs.txt +++ b/requirements/static/ci/py3.9/docs.txt @@ -149,6 +149,10 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/base.txt +lxml==6.0.2 + # via + # -c requirements/static/ci/py3.9/linux.txt + # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.9/freebsd.txt b/requirements/static/ci/py3.9/freebsd.txt index f8f737f2926a..3fba3b7e57e7 100644 --- a/requirements/static/ci/py3.9/freebsd.txt +++ b/requirements/static/ci/py3.9/freebsd.txt @@ -210,6 +210,8 @@ importlib-metadata==8.7.0 # -r requirements/static/pkg/freebsd.in iniconfig==2.0.0 # via pytest +invoke==2.2.1 ; sys_platform != 'win32' + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.9/freebsd.txt @@ -249,7 +251,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 ; sys_platform != 'win32' +junos-eznc==2.7.6 ; sys_platform != 'win32' # via # -r requirements/static/ci/common.in # napalm @@ -311,13 +313,13 @@ multidict==6.7.1 # yarl napalm==4.1.0 ; python_full_version < '3.10' and sys_platform != 'win32' # via -r requirements/static/ci/common.in -ncclient==0.6.13 ; sys_platform != 'win32' +ncclient==0.7.0 ; sys_platform != 'win32' # via + # -r requirements/static/ci/common.in # junos-eznc # napalm -netaddr==0.8.0 ; sys_platform != 'win32' +netaddr==0.8.0 ; python_full_version < '3.10' and sys_platform != 'win32' # via - # junos-eznc # napalm # pyeapi netmiko==4.2.0 ; python_full_version < '3.10' and sys_platform != 'win32' @@ -335,7 +337,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.9/freebsd.txt # -r requirements/base.txt # pytest -paramiko==3.4.0 ; sys_platform != 'win32' +paramiko==4.0.0 ; sys_platform != 'win32' # via # -r requirements/static/ci/common.in # junos-eznc @@ -525,7 +527,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==27.1.0 # via # -c requirements/static/pkg/py3.9/freebsd.txt @@ -594,7 +596,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-dateutil # pyvmomi # textfsm @@ -713,7 +714,7 @@ xmltodict==1.0.4 # moto yamllint==1.32.0 # via -r requirements/static/ci/freebsd.in -yamlordereddictloader==0.4.0 ; sys_platform != 'win32' +yamlloader==1.6.0 ; sys_platform != 'win32' # via junos-eznc yarl==1.22.0 ; python_full_version < '3.10' # via diff --git a/requirements/static/ci/py3.9/lint.txt b/requirements/static/ci/py3.9/lint.txt index fdcdae808574..82a749097545 100644 --- a/requirements/static/ci/py3.9/lint.txt +++ b/requirements/static/ci/py3.9/lint.txt @@ -269,6 +269,10 @@ importlib-resources==5.0.7 # via # -c requirements/static/ci/py3.9/linux.txt # ansible-core +invoke==2.2.1 + # via + # -c requirements/static/ci/py3.9/linux.txt + # paramiko isort==4.3.21 # via pylint jaraco-collections==4.1.0 @@ -321,7 +325,7 @@ junit-xml==1.9 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in @@ -351,9 +355,11 @@ looseversion==1.3.0 # -c requirements/static/ci/py3.9/linux.txt # -c requirements/static/pkg/py3.9/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via # -c requirements/static/ci/py3.9/linux.txt + # -c requirements/static/pkg/py3.9/linux.txt + # -r requirements/base.txt # junos-eznc # napalm # ncclient @@ -405,15 +411,15 @@ napalm==4.1.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in -ncclient==0.6.13 +ncclient==0.7.0 # via # -c requirements/static/ci/py3.9/linux.txt + # -r requirements/static/ci/common.in # junos-eznc # napalm netaddr==0.8.0 # via # -c requirements/static/ci/py3.9/linux.txt - # junos-eznc # napalm # pyeapi netmiko==4.2.0 @@ -442,7 +448,7 @@ packaging==24.0 # -c requirements/static/pkg/py3.9/linux.txt # -r requirements/base.txt # ansible-core -paramiko==3.4.0 +paramiko==4.0.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/common.in @@ -510,7 +516,7 @@ pyeapi==1.0.0 # via # -c requirements/static/ci/py3.9/linux.txt # napalm -pygit2==1.13.1 +pygit2==1.15.1 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/linux.in @@ -617,7 +623,7 @@ pyyaml==6.0.1 # netmiko # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/ci/py3.9/linux.txt @@ -707,7 +713,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -861,7 +866,7 @@ yamllint==1.32.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via # -c requirements/static/ci/py3.9/linux.txt # junos-eznc diff --git a/requirements/static/ci/py3.9/linux.txt b/requirements/static/ci/py3.9/linux.txt index cb7b1eea8a6c..2f01d81f0fd7 100644 --- a/requirements/static/ci/py3.9/linux.txt +++ b/requirements/static/ci/py3.9/linux.txt @@ -206,6 +206,8 @@ importlib-resources==5.0.7 # via ansible-core iniconfig==2.0.0 # via pytest +invoke==2.2.1 + # via paramiko jaraco-collections==4.1.0 # via # -c requirements/static/pkg/py3.9/linux.txt @@ -246,7 +248,7 @@ jsonschema==3.2.0 # via -r requirements/static/ci/common.in junit-xml==1.9 # via -r requirements/static/ci/common.in -junos-eznc==2.6.7 +junos-eznc==2.7.6 # via # -r requirements/static/ci/common.in # napalm @@ -264,8 +266,10 @@ looseversion==1.3.0 # via # -c requirements/static/pkg/py3.9/linux.txt # -r requirements/base.txt -lxml==4.9.2 +lxml==6.0.2 # via + # -c requirements/static/pkg/py3.9/linux.txt + # -r requirements/base.txt # junos-eznc # napalm # ncclient @@ -306,13 +310,13 @@ multidict==6.7.1 # yarl napalm==4.1.0 # via -r requirements/static/ci/common.in -ncclient==0.6.13 +ncclient==0.7.0 # via + # -r requirements/static/ci/common.in # junos-eznc # napalm netaddr==0.8.0 # via - # junos-eznc # napalm # pyeapi netmiko==4.2.0 @@ -331,7 +335,7 @@ packaging==24.0 # -r requirements/base.txt # ansible-core # pytest -paramiko==3.4.0 +paramiko==4.0.0 # via # -r requirements/static/ci/common.in # junos-eznc @@ -389,7 +393,7 @@ pyeapi==1.0.0 # via napalm pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.15.1 # via -r requirements/static/ci/linux.in pyiface==0.0.11 # via -r requirements/static/ci/linux.in @@ -498,7 +502,7 @@ pyyaml==6.0.1 # pytest-salt-factories # responses # yamllint - # yamlordereddictloader + # yamlloader pyzmq==25.1.2 # via # -c requirements/static/pkg/py3.9/linux.txt @@ -561,7 +565,6 @@ six==1.16.0 # junos-eznc # kazoo # kubernetes - # ncclient # python-consul # python-dateutil # pyvmomi @@ -672,7 +675,7 @@ xmltodict==0.13.0 # via moto yamllint==1.32.0 # via -r requirements/static/ci/linux.in -yamlordereddictloader==0.4.0 +yamlloader==1.6.0 # via junos-eznc yarl==1.22.0 # via diff --git a/requirements/static/ci/py3.9/windows.txt b/requirements/static/ci/py3.9/windows.txt index 54f85e264efd..fa837de0dbb2 100644 --- a/requirements/static/ci/py3.9/windows.txt +++ b/requirements/static/ci/py3.9/windows.txt @@ -324,7 +324,7 @@ pycryptodomex==3.23.0 # -r requirements/crypto.txt pyfakefs==5.3.1 # via -r requirements/pytest.txt -pygit2==1.13.1 +pygit2==1.15.1 # via -r requirements/static/ci/windows.in pygments==2.19.2 # via diff --git a/requirements/static/ci/windows.in b/requirements/static/ci/windows.in index 23eb32effcce..e9f317cb00b8 100644 --- a/requirements/static/ci/windows.in +++ b/requirements/static/ci/windows.in @@ -1,6 +1,6 @@ dmidecode patch -pygit2>=1.10.1 +pygit2>=1.14.0 sed pywinrm>=0.4.1 yamllint diff --git a/requirements/static/pkg/py3.10/darwin.txt b/requirements/static/pkg/py3.10/darwin.txt index dd95fbfa212f..edcf28299992 100644 --- a/requirements/static/pkg/py3.10/darwin.txt +++ b/requirements/static/pkg/py3.10/darwin.txt @@ -84,6 +84,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.10/freebsd.txt b/requirements/static/pkg/py3.10/freebsd.txt index e8641c351c26..699d29440b2a 100644 --- a/requirements/static/pkg/py3.10/freebsd.txt +++ b/requirements/static/pkg/py3.10/freebsd.txt @@ -96,7 +96,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 ; sys_platform == 'win32' +lxml==6.0.2 # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.10/linux.txt b/requirements/static/pkg/py3.10/linux.txt index c5afab08f892..d7d3a52316e9 100644 --- a/requirements/static/pkg/py3.10/linux.txt +++ b/requirements/static/pkg/py3.10/linux.txt @@ -90,6 +90,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.11/darwin.txt b/requirements/static/pkg/py3.11/darwin.txt index e6e4a0b2201c..302a00b2477a 100644 --- a/requirements/static/pkg/py3.11/darwin.txt +++ b/requirements/static/pkg/py3.11/darwin.txt @@ -82,6 +82,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.11/freebsd.txt b/requirements/static/pkg/py3.11/freebsd.txt index f0a65831b05d..1bb72d4e1d5a 100644 --- a/requirements/static/pkg/py3.11/freebsd.txt +++ b/requirements/static/pkg/py3.11/freebsd.txt @@ -94,7 +94,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 ; sys_platform == 'win32' +lxml==6.0.2 # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.11/linux.txt b/requirements/static/pkg/py3.11/linux.txt index de2a3b7af93d..324094c1ac42 100644 --- a/requirements/static/pkg/py3.11/linux.txt +++ b/requirements/static/pkg/py3.11/linux.txt @@ -88,6 +88,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.12/darwin.txt b/requirements/static/pkg/py3.12/darwin.txt index 807ad7190aba..cbf9a3d0ac9b 100644 --- a/requirements/static/pkg/py3.12/darwin.txt +++ b/requirements/static/pkg/py3.12/darwin.txt @@ -80,6 +80,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.12/freebsd.txt b/requirements/static/pkg/py3.12/freebsd.txt index 4529b020edf9..a0abbfa7e926 100644 --- a/requirements/static/pkg/py3.12/freebsd.txt +++ b/requirements/static/pkg/py3.12/freebsd.txt @@ -92,7 +92,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 ; sys_platform == 'win32' +lxml==6.0.2 # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.12/linux.txt b/requirements/static/pkg/py3.12/linux.txt index 6b243f7ada08..55461212a973 100644 --- a/requirements/static/pkg/py3.12/linux.txt +++ b/requirements/static/pkg/py3.12/linux.txt @@ -86,6 +86,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.13/darwin.txt b/requirements/static/pkg/py3.13/darwin.txt index 78509fa2ae87..43e8729fc4a3 100644 --- a/requirements/static/pkg/py3.13/darwin.txt +++ b/requirements/static/pkg/py3.13/darwin.txt @@ -80,6 +80,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.5 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.13/freebsd.txt b/requirements/static/pkg/py3.13/freebsd.txt index 654e973e5e01..4a5606698c21 100644 --- a/requirements/static/pkg/py3.13/freebsd.txt +++ b/requirements/static/pkg/py3.13/freebsd.txt @@ -89,7 +89,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 ; sys_platform == 'win32' +lxml==6.0.2 # via -r requirements/base.txt markupsafe==2.1.5 # via diff --git a/requirements/static/pkg/py3.13/linux.txt b/requirements/static/pkg/py3.13/linux.txt index 6a7d477fe8b5..e72c96438465 100644 --- a/requirements/static/pkg/py3.13/linux.txt +++ b/requirements/static/pkg/py3.13/linux.txt @@ -86,6 +86,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.5 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.9/darwin.txt b/requirements/static/pkg/py3.9/darwin.txt index 589956fe12cc..863fa154095e 100644 --- a/requirements/static/pkg/py3.9/darwin.txt +++ b/requirements/static/pkg/py3.9/darwin.txt @@ -84,6 +84,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.9/freebsd.txt b/requirements/static/pkg/py3.9/freebsd.txt index ec4056ec1eab..b74888034efc 100644 --- a/requirements/static/pkg/py3.9/freebsd.txt +++ b/requirements/static/pkg/py3.9/freebsd.txt @@ -106,7 +106,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 ; sys_platform == 'win32' +lxml==6.0.2 # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.9/linux.txt b/requirements/static/pkg/py3.9/linux.txt index e8fa138fbbb4..032e32c19708 100644 --- a/requirements/static/pkg/py3.9/linux.txt +++ b/requirements/static/pkg/py3.9/linux.txt @@ -90,6 +90,8 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt +lxml==6.0.2 + # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt From 18c1dfa12e73ace45b2a275639fce6f558d58fa1 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 18:03:18 -0700 Subject: [PATCH 08/34] Fix ci deps --- requirements/base.txt | 1 - requirements/static/ci/py3.10/cloud.txt | 2 -- requirements/static/ci/py3.10/darwin.txt | 2 -- requirements/static/ci/py3.10/docs.txt | 4 ---- requirements/static/ci/py3.10/lint.txt | 2 -- requirements/static/ci/py3.10/linux.txt | 2 -- requirements/static/ci/py3.11/cloud.txt | 2 -- requirements/static/ci/py3.11/darwin.txt | 2 -- requirements/static/ci/py3.11/docs.txt | 4 ---- requirements/static/ci/py3.11/lint.txt | 2 -- requirements/static/ci/py3.11/linux.txt | 2 -- requirements/static/ci/py3.12/cloud.txt | 2 -- requirements/static/ci/py3.12/darwin.txt | 2 -- requirements/static/ci/py3.12/docs.txt | 4 ---- requirements/static/ci/py3.12/lint.txt | 2 -- requirements/static/ci/py3.12/linux.txt | 2 -- requirements/static/ci/py3.13/cloud.txt | 2 -- requirements/static/ci/py3.13/darwin.txt | 2 -- requirements/static/ci/py3.13/docs.txt | 4 ---- requirements/static/ci/py3.13/lint.txt | 2 -- requirements/static/ci/py3.13/linux.txt | 2 -- requirements/static/ci/py3.9/cloud.txt | 2 -- requirements/static/ci/py3.9/darwin.txt | 2 -- requirements/static/ci/py3.9/docs.txt | 4 ---- requirements/static/ci/py3.9/lint.txt | 2 -- requirements/static/ci/py3.9/linux.txt | 2 -- requirements/static/pkg/py3.10/darwin.txt | 2 -- requirements/static/pkg/py3.10/freebsd.txt | 2 +- requirements/static/pkg/py3.10/linux.txt | 2 -- requirements/static/pkg/py3.11/darwin.txt | 2 -- requirements/static/pkg/py3.11/freebsd.txt | 2 +- requirements/static/pkg/py3.11/linux.txt | 2 -- requirements/static/pkg/py3.12/darwin.txt | 2 -- requirements/static/pkg/py3.12/freebsd.txt | 2 +- requirements/static/pkg/py3.12/linux.txt | 2 -- requirements/static/pkg/py3.13/darwin.txt | 2 -- requirements/static/pkg/py3.13/freebsd.txt | 2 +- requirements/static/pkg/py3.13/linux.txt | 2 -- requirements/static/pkg/py3.9/darwin.txt | 2 -- requirements/static/pkg/py3.9/freebsd.txt | 2 +- requirements/static/pkg/py3.9/linux.txt | 2 -- 41 files changed, 5 insertions(+), 86 deletions(-) diff --git a/requirements/base.txt b/requirements/base.txt index 97463944bc8e..627a9bed58ca 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -27,7 +27,6 @@ jaraco.text>=4.0.0 Jinja2>=3.1.5 jmespath>=1.1.0 looseversion -lxml>=5.0.0; sys_platform != 'win32' lxml>=6.0.2; sys_platform == 'win32' MarkupSafe<3.0.0 msgpack>=1.0.0 ; python_version < '3.13' diff --git a/requirements/static/ci/py3.10/cloud.txt b/requirements/static/ci/py3.10/cloud.txt index b62094c4c4e1..af068ed7a720 100644 --- a/requirements/static/ci/py3.10/cloud.txt +++ b/requirements/static/ci/py3.10/cloud.txt @@ -315,8 +315,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.10/linux.txt - # -c requirements/static/pkg/py3.10/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.10/darwin.txt b/requirements/static/ci/py3.10/darwin.txt index ed5f2d4bc31f..3eacb25bcd44 100644 --- a/requirements/static/ci/py3.10/darwin.txt +++ b/requirements/static/ci/py3.10/darwin.txt @@ -230,8 +230,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.10/darwin.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.10/docs.txt b/requirements/static/ci/py3.10/docs.txt index 250594d0f033..24cd0ad991f6 100644 --- a/requirements/static/ci/py3.10/docs.txt +++ b/requirements/static/ci/py3.10/docs.txt @@ -148,10 +148,6 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/base.txt -lxml==6.0.2 - # via - # -c requirements/static/ci/py3.10/linux.txt - # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.10/lint.txt b/requirements/static/ci/py3.10/lint.txt index 478e1e564d52..6adf7a9096fb 100644 --- a/requirements/static/ci/py3.10/lint.txt +++ b/requirements/static/ci/py3.10/lint.txt @@ -342,8 +342,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.10/linux.txt - # -c requirements/static/pkg/py3.10/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.10/linux.txt b/requirements/static/ci/py3.10/linux.txt index 3b0650c98dc1..e5a63b7bb23b 100644 --- a/requirements/static/ci/py3.10/linux.txt +++ b/requirements/static/ci/py3.10/linux.txt @@ -256,8 +256,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.10/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.11/cloud.txt b/requirements/static/ci/py3.11/cloud.txt index 669ef35f19ed..64c30255ccbb 100644 --- a/requirements/static/ci/py3.11/cloud.txt +++ b/requirements/static/ci/py3.11/cloud.txt @@ -305,8 +305,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.11/linux.txt - # -c requirements/static/pkg/py3.11/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.11/darwin.txt b/requirements/static/ci/py3.11/darwin.txt index 2ba296d81e23..25f8fe020a16 100644 --- a/requirements/static/ci/py3.11/darwin.txt +++ b/requirements/static/ci/py3.11/darwin.txt @@ -223,8 +223,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.11/darwin.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.11/docs.txt b/requirements/static/ci/py3.11/docs.txt index c63df7b2c6a0..7e41a185b70b 100644 --- a/requirements/static/ci/py3.11/docs.txt +++ b/requirements/static/ci/py3.11/docs.txt @@ -144,10 +144,6 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/base.txt -lxml==6.0.2 - # via - # -c requirements/static/ci/py3.11/linux.txt - # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.11/lint.txt b/requirements/static/ci/py3.11/lint.txt index 64f6565c8f88..98f1709d0ead 100644 --- a/requirements/static/ci/py3.11/lint.txt +++ b/requirements/static/ci/py3.11/lint.txt @@ -333,8 +333,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.11/linux.txt - # -c requirements/static/pkg/py3.11/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.11/linux.txt b/requirements/static/ci/py3.11/linux.txt index 414ad83083c2..5dc335f3b0f2 100644 --- a/requirements/static/ci/py3.11/linux.txt +++ b/requirements/static/ci/py3.11/linux.txt @@ -247,8 +247,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.11/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.12/cloud.txt b/requirements/static/ci/py3.12/cloud.txt index 1c1469e4dd5c..f898d9a8a4d2 100644 --- a/requirements/static/ci/py3.12/cloud.txt +++ b/requirements/static/ci/py3.12/cloud.txt @@ -300,8 +300,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.12/linux.txt - # -c requirements/static/pkg/py3.12/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.12/darwin.txt b/requirements/static/ci/py3.12/darwin.txt index c97db46d12dd..a29c12a566d3 100644 --- a/requirements/static/ci/py3.12/darwin.txt +++ b/requirements/static/ci/py3.12/darwin.txt @@ -219,8 +219,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.12/darwin.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.12/docs.txt b/requirements/static/ci/py3.12/docs.txt index 3341625bfb77..4ccb967d5125 100644 --- a/requirements/static/ci/py3.12/docs.txt +++ b/requirements/static/ci/py3.12/docs.txt @@ -140,10 +140,6 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/base.txt -lxml==6.0.2 - # via - # -c requirements/static/ci/py3.12/linux.txt - # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.12/lint.txt b/requirements/static/ci/py3.12/lint.txt index 780086b5e95f..00d5c5bf30c3 100644 --- a/requirements/static/ci/py3.12/lint.txt +++ b/requirements/static/ci/py3.12/lint.txt @@ -328,8 +328,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.12/linux.txt - # -c requirements/static/pkg/py3.12/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.12/linux.txt b/requirements/static/ci/py3.12/linux.txt index d13827b70c2b..ce25fe9376fa 100644 --- a/requirements/static/ci/py3.12/linux.txt +++ b/requirements/static/ci/py3.12/linux.txt @@ -243,8 +243,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.12/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.13/cloud.txt b/requirements/static/ci/py3.13/cloud.txt index 2fc648636ae2..421578fcb3e1 100644 --- a/requirements/static/ci/py3.13/cloud.txt +++ b/requirements/static/ci/py3.13/cloud.txt @@ -302,8 +302,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.13/linux.txt - # -c requirements/static/pkg/py3.13/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.13/darwin.txt b/requirements/static/ci/py3.13/darwin.txt index 95e031cfacba..5679cfc44737 100644 --- a/requirements/static/ci/py3.13/darwin.txt +++ b/requirements/static/ci/py3.13/darwin.txt @@ -221,8 +221,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.13/darwin.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.13/docs.txt b/requirements/static/ci/py3.13/docs.txt index 1fb546e2f074..a2a9976691d4 100644 --- a/requirements/static/ci/py3.13/docs.txt +++ b/requirements/static/ci/py3.13/docs.txt @@ -140,10 +140,6 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.13/linux.txt # -r requirements/base.txt -lxml==6.0.2 - # via - # -c requirements/static/ci/py3.13/linux.txt - # -r requirements/base.txt markdown-it-py==3.0.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.13/lint.txt b/requirements/static/ci/py3.13/lint.txt index abf1a7da739f..39590e04abb4 100644 --- a/requirements/static/ci/py3.13/lint.txt +++ b/requirements/static/ci/py3.13/lint.txt @@ -329,8 +329,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.13/linux.txt - # -c requirements/static/pkg/py3.13/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.13/linux.txt b/requirements/static/ci/py3.13/linux.txt index fdc8c72bbd5c..602ae3a5ef6f 100644 --- a/requirements/static/ci/py3.13/linux.txt +++ b/requirements/static/ci/py3.13/linux.txt @@ -245,8 +245,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.13/linux.txt - # -r requirements/base.txt # junos-eznc # ncclient # xmldiff diff --git a/requirements/static/ci/py3.9/cloud.txt b/requirements/static/ci/py3.9/cloud.txt index 7129a29a565e..bc2381722ab1 100644 --- a/requirements/static/ci/py3.9/cloud.txt +++ b/requirements/static/ci/py3.9/cloud.txt @@ -327,8 +327,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.9/linux.txt - # -c requirements/static/pkg/py3.9/linux.txt - # -r requirements/base.txt # junos-eznc # napalm # ncclient diff --git a/requirements/static/ci/py3.9/darwin.txt b/requirements/static/ci/py3.9/darwin.txt index 2cd65936775d..9d303b384ade 100644 --- a/requirements/static/ci/py3.9/darwin.txt +++ b/requirements/static/ci/py3.9/darwin.txt @@ -240,8 +240,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.9/darwin.txt - # -r requirements/base.txt # junos-eznc # napalm # ncclient diff --git a/requirements/static/ci/py3.9/docs.txt b/requirements/static/ci/py3.9/docs.txt index c72265f63820..0cb79d1ba033 100644 --- a/requirements/static/ci/py3.9/docs.txt +++ b/requirements/static/ci/py3.9/docs.txt @@ -149,10 +149,6 @@ looseversion==1.3.0 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/base.txt -lxml==6.0.2 - # via - # -c requirements/static/ci/py3.9/linux.txt - # -r requirements/base.txt markdown-it-py==2.2.0 # via # mdit-py-plugins diff --git a/requirements/static/ci/py3.9/lint.txt b/requirements/static/ci/py3.9/lint.txt index 82a749097545..52a4fb0eb1cb 100644 --- a/requirements/static/ci/py3.9/lint.txt +++ b/requirements/static/ci/py3.9/lint.txt @@ -358,8 +358,6 @@ looseversion==1.3.0 lxml==6.0.2 # via # -c requirements/static/ci/py3.9/linux.txt - # -c requirements/static/pkg/py3.9/linux.txt - # -r requirements/base.txt # junos-eznc # napalm # ncclient diff --git a/requirements/static/ci/py3.9/linux.txt b/requirements/static/ci/py3.9/linux.txt index 2f01d81f0fd7..812662c2f100 100644 --- a/requirements/static/ci/py3.9/linux.txt +++ b/requirements/static/ci/py3.9/linux.txt @@ -268,8 +268,6 @@ looseversion==1.3.0 # -r requirements/base.txt lxml==6.0.2 # via - # -c requirements/static/pkg/py3.9/linux.txt - # -r requirements/base.txt # junos-eznc # napalm # ncclient diff --git a/requirements/static/pkg/py3.10/darwin.txt b/requirements/static/pkg/py3.10/darwin.txt index edcf28299992..dd95fbfa212f 100644 --- a/requirements/static/pkg/py3.10/darwin.txt +++ b/requirements/static/pkg/py3.10/darwin.txt @@ -84,8 +84,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.10/freebsd.txt b/requirements/static/pkg/py3.10/freebsd.txt index 699d29440b2a..e8641c351c26 100644 --- a/requirements/static/pkg/py3.10/freebsd.txt +++ b/requirements/static/pkg/py3.10/freebsd.txt @@ -96,7 +96,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 +lxml==6.0.2 ; sys_platform == 'win32' # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.10/linux.txt b/requirements/static/pkg/py3.10/linux.txt index d7d3a52316e9..c5afab08f892 100644 --- a/requirements/static/pkg/py3.10/linux.txt +++ b/requirements/static/pkg/py3.10/linux.txt @@ -90,8 +90,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.11/darwin.txt b/requirements/static/pkg/py3.11/darwin.txt index 302a00b2477a..e6e4a0b2201c 100644 --- a/requirements/static/pkg/py3.11/darwin.txt +++ b/requirements/static/pkg/py3.11/darwin.txt @@ -82,8 +82,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.11/freebsd.txt b/requirements/static/pkg/py3.11/freebsd.txt index 1bb72d4e1d5a..f0a65831b05d 100644 --- a/requirements/static/pkg/py3.11/freebsd.txt +++ b/requirements/static/pkg/py3.11/freebsd.txt @@ -94,7 +94,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 +lxml==6.0.2 ; sys_platform == 'win32' # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.11/linux.txt b/requirements/static/pkg/py3.11/linux.txt index 324094c1ac42..de2a3b7af93d 100644 --- a/requirements/static/pkg/py3.11/linux.txt +++ b/requirements/static/pkg/py3.11/linux.txt @@ -88,8 +88,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.12/darwin.txt b/requirements/static/pkg/py3.12/darwin.txt index cbf9a3d0ac9b..807ad7190aba 100644 --- a/requirements/static/pkg/py3.12/darwin.txt +++ b/requirements/static/pkg/py3.12/darwin.txt @@ -80,8 +80,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.12/freebsd.txt b/requirements/static/pkg/py3.12/freebsd.txt index a0abbfa7e926..4529b020edf9 100644 --- a/requirements/static/pkg/py3.12/freebsd.txt +++ b/requirements/static/pkg/py3.12/freebsd.txt @@ -92,7 +92,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 +lxml==6.0.2 ; sys_platform == 'win32' # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.12/linux.txt b/requirements/static/pkg/py3.12/linux.txt index 55461212a973..6b243f7ada08 100644 --- a/requirements/static/pkg/py3.12/linux.txt +++ b/requirements/static/pkg/py3.12/linux.txt @@ -86,8 +86,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.13/darwin.txt b/requirements/static/pkg/py3.13/darwin.txt index 43e8729fc4a3..78509fa2ae87 100644 --- a/requirements/static/pkg/py3.13/darwin.txt +++ b/requirements/static/pkg/py3.13/darwin.txt @@ -80,8 +80,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.5 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.13/freebsd.txt b/requirements/static/pkg/py3.13/freebsd.txt index 4a5606698c21..654e973e5e01 100644 --- a/requirements/static/pkg/py3.13/freebsd.txt +++ b/requirements/static/pkg/py3.13/freebsd.txt @@ -89,7 +89,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 +lxml==6.0.2 ; sys_platform == 'win32' # via -r requirements/base.txt markupsafe==2.1.5 # via diff --git a/requirements/static/pkg/py3.13/linux.txt b/requirements/static/pkg/py3.13/linux.txt index e72c96438465..6a7d477fe8b5 100644 --- a/requirements/static/pkg/py3.13/linux.txt +++ b/requirements/static/pkg/py3.13/linux.txt @@ -86,8 +86,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.5 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.9/darwin.txt b/requirements/static/pkg/py3.9/darwin.txt index 863fa154095e..589956fe12cc 100644 --- a/requirements/static/pkg/py3.9/darwin.txt +++ b/requirements/static/pkg/py3.9/darwin.txt @@ -84,8 +84,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt diff --git a/requirements/static/pkg/py3.9/freebsd.txt b/requirements/static/pkg/py3.9/freebsd.txt index b74888034efc..ec4056ec1eab 100644 --- a/requirements/static/pkg/py3.9/freebsd.txt +++ b/requirements/static/pkg/py3.9/freebsd.txt @@ -106,7 +106,7 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 +lxml==6.0.2 ; sys_platform == 'win32' # via -r requirements/base.txt markupsafe==2.1.3 # via diff --git a/requirements/static/pkg/py3.9/linux.txt b/requirements/static/pkg/py3.9/linux.txt index 032e32c19708..e8fa138fbbb4 100644 --- a/requirements/static/pkg/py3.9/linux.txt +++ b/requirements/static/pkg/py3.9/linux.txt @@ -90,8 +90,6 @@ jmespath==1.1.0 # via -r requirements/base.txt looseversion==1.3.0 # via -r requirements/base.txt -lxml==6.0.2 - # via -r requirements/base.txt markupsafe==2.1.3 # via # -r requirements/base.txt From 94602b1c4dd110dcda2120b87f363a3b3965f188 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 23:45:48 -0700 Subject: [PATCH 09/34] more ci fixes --- requirements/static/ci/darwin.in | 2 +- requirements/static/ci/freebsd.in | 2 +- requirements/static/ci/linux.in | 2 +- requirements/static/ci/py3.10/darwin.txt | 2 +- requirements/static/ci/py3.10/freebsd.txt | 2 +- requirements/static/ci/py3.10/lint.txt | 2 +- requirements/static/ci/py3.10/linux.txt | 2 +- requirements/static/ci/py3.11/darwin.txt | 2 +- requirements/static/ci/py3.11/freebsd.txt | 2 +- requirements/static/ci/py3.11/lint.txt | 2 +- requirements/static/ci/py3.11/linux.txt | 2 +- requirements/static/ci/py3.12/darwin.txt | 2 +- requirements/static/ci/py3.12/freebsd.txt | 2 +- requirements/static/ci/py3.12/lint.txt | 2 +- requirements/static/ci/py3.12/linux.txt | 2 +- requirements/static/ci/py3.9/darwin.txt | 2 +- requirements/static/ci/py3.9/freebsd.txt | 2 +- requirements/static/ci/py3.9/lint.txt | 2 +- requirements/static/ci/py3.9/linux.txt | 2 +- 19 files changed, 19 insertions(+), 19 deletions(-) diff --git a/requirements/static/ci/darwin.in b/requirements/static/ci/darwin.in index 5bebd6101667..2420386d3778 100644 --- a/requirements/static/ci/darwin.in +++ b/requirements/static/ci/darwin.in @@ -1,6 +1,6 @@ pygit2>=1.14.0 yamllint -mercurial +mercurial>=6.7 hglib # Pin versions to match 3007.x apache-libcloud>=3.8.0 diff --git a/requirements/static/ci/freebsd.in b/requirements/static/ci/freebsd.in index a6d21d5a499a..7b24f942361c 100644 --- a/requirements/static/ci/freebsd.in +++ b/requirements/static/ci/freebsd.in @@ -1,5 +1,5 @@ # FreeBSD static CI requirements yamllint -mercurial +mercurial>=6.7 hglib diff --git a/requirements/static/ci/linux.in b/requirements/static/ci/linux.in index 1c98af4275bf..f39cbdd0eccf 100644 --- a/requirements/static/ci/linux.in +++ b/requirements/static/ci/linux.in @@ -10,7 +10,7 @@ ansible>=4.4.0,<5.0.1; python_version < '3.9' twilio python-telegram-bot>=13.7 yamllint -mercurial +mercurial>=6.7 hglib redis-py-cluster python-consul diff --git a/requirements/static/ci/py3.10/darwin.txt b/requirements/static/ci/py3.10/darwin.txt index 3eacb25bcd44..b11586b4e5fd 100644 --- a/requirements/static/ci/py3.10/darwin.txt +++ b/requirements/static/ci/py3.10/darwin.txt @@ -242,7 +242,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.4.4 +mercurial==7.2 # via -r requirements/static/ci/darwin.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.10/freebsd.txt b/requirements/static/ci/py3.10/freebsd.txt index 665bb01c22af..9973536b2833 100644 --- a/requirements/static/ci/py3.10/freebsd.txt +++ b/requirements/static/ci/py3.10/freebsd.txt @@ -258,7 +258,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.4.4 +mercurial==7.2 # via -r requirements/static/ci/freebsd.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.10/lint.txt b/requirements/static/ci/py3.10/lint.txt index 6adf7a9096fb..61fc7cd3fef6 100644 --- a/requirements/static/ci/py3.10/lint.txt +++ b/requirements/static/ci/py3.10/lint.txt @@ -359,7 +359,7 @@ markupsafe==2.1.3 # werkzeug mccabe==0.6.1 # via pylint -mercurial==6.4.4 +mercurial==7.2 # via # -c requirements/static/ci/py3.10/linux.txt # -r requirements/static/ci/linux.in diff --git a/requirements/static/ci/py3.10/linux.txt b/requirements/static/ci/py3.10/linux.txt index e5a63b7bb23b..5e7c8b5cf94a 100644 --- a/requirements/static/ci/py3.10/linux.txt +++ b/requirements/static/ci/py3.10/linux.txt @@ -268,7 +268,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.4.4 +mercurial==7.2 # via -r requirements/static/ci/linux.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.11/darwin.txt b/requirements/static/ci/py3.11/darwin.txt index 25f8fe020a16..0fd318bffb8a 100644 --- a/requirements/static/ci/py3.11/darwin.txt +++ b/requirements/static/ci/py3.11/darwin.txt @@ -235,7 +235,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.0.1 +mercurial==7.2 # via -r requirements/static/ci/darwin.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.11/freebsd.txt b/requirements/static/ci/py3.11/freebsd.txt index b6d16b56d90b..e09362089c5c 100644 --- a/requirements/static/ci/py3.11/freebsd.txt +++ b/requirements/static/ci/py3.11/freebsd.txt @@ -251,7 +251,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.0.1 +mercurial==7.2 # via -r requirements/static/ci/freebsd.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.11/lint.txt b/requirements/static/ci/py3.11/lint.txt index 98f1709d0ead..c43112452aba 100644 --- a/requirements/static/ci/py3.11/lint.txt +++ b/requirements/static/ci/py3.11/lint.txt @@ -350,7 +350,7 @@ markupsafe==2.1.3 # werkzeug mccabe==0.6.1 # via pylint -mercurial==6.0.1 +mercurial==7.2 # via # -c requirements/static/ci/py3.11/linux.txt # -r requirements/static/ci/linux.in diff --git a/requirements/static/ci/py3.11/linux.txt b/requirements/static/ci/py3.11/linux.txt index 5dc335f3b0f2..55d80ef1a4ae 100644 --- a/requirements/static/ci/py3.11/linux.txt +++ b/requirements/static/ci/py3.11/linux.txt @@ -259,7 +259,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.0.1 +mercurial==7.2 # via -r requirements/static/ci/linux.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.12/darwin.txt b/requirements/static/ci/py3.12/darwin.txt index a29c12a566d3..c9b346e77f47 100644 --- a/requirements/static/ci/py3.12/darwin.txt +++ b/requirements/static/ci/py3.12/darwin.txt @@ -231,7 +231,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.0.1 +mercurial==7.2 # via -r requirements/static/ci/darwin.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.12/freebsd.txt b/requirements/static/ci/py3.12/freebsd.txt index eb1188ecc026..7a4197f44299 100644 --- a/requirements/static/ci/py3.12/freebsd.txt +++ b/requirements/static/ci/py3.12/freebsd.txt @@ -247,7 +247,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.0.1 +mercurial==7.2 # via -r requirements/static/ci/freebsd.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.12/lint.txt b/requirements/static/ci/py3.12/lint.txt index 00d5c5bf30c3..dad48d24a473 100644 --- a/requirements/static/ci/py3.12/lint.txt +++ b/requirements/static/ci/py3.12/lint.txt @@ -345,7 +345,7 @@ markupsafe==2.1.3 # werkzeug mccabe==0.6.1 # via pylint -mercurial==6.0.1 +mercurial==7.2 # via # -c requirements/static/ci/py3.12/linux.txt # -r requirements/static/ci/linux.in diff --git a/requirements/static/ci/py3.12/linux.txt b/requirements/static/ci/py3.12/linux.txt index ce25fe9376fa..ce8c0a9e5d5f 100644 --- a/requirements/static/ci/py3.12/linux.txt +++ b/requirements/static/ci/py3.12/linux.txt @@ -255,7 +255,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.0.1 +mercurial==7.2 # via -r requirements/static/ci/linux.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.9/darwin.txt b/requirements/static/ci/py3.9/darwin.txt index 9d303b384ade..f41d1d6dd02c 100644 --- a/requirements/static/ci/py3.9/darwin.txt +++ b/requirements/static/ci/py3.9/darwin.txt @@ -253,7 +253,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.4.4 +mercurial==7.2 # via -r requirements/static/ci/darwin.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.9/freebsd.txt b/requirements/static/ci/py3.9/freebsd.txt index 3fba3b7e57e7..61fcf2148391 100644 --- a/requirements/static/ci/py3.9/freebsd.txt +++ b/requirements/static/ci/py3.9/freebsd.txt @@ -286,7 +286,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.4.4 +mercurial==7.2 # via -r requirements/static/ci/freebsd.in mock==5.1.0 # via -r requirements/pytest.txt diff --git a/requirements/static/ci/py3.9/lint.txt b/requirements/static/ci/py3.9/lint.txt index 52a4fb0eb1cb..1d1a8bc01730 100644 --- a/requirements/static/ci/py3.9/lint.txt +++ b/requirements/static/ci/py3.9/lint.txt @@ -376,7 +376,7 @@ markupsafe==2.1.3 # werkzeug mccabe==0.6.1 # via pylint -mercurial==6.4.4 +mercurial==7.2 # via # -c requirements/static/ci/py3.9/linux.txt # -r requirements/static/ci/linux.in diff --git a/requirements/static/ci/py3.9/linux.txt b/requirements/static/ci/py3.9/linux.txt index 812662c2f100..c1b094ddb8e9 100644 --- a/requirements/static/ci/py3.9/linux.txt +++ b/requirements/static/ci/py3.9/linux.txt @@ -281,7 +281,7 @@ markupsafe==2.1.3 # jinja2 # mako # werkzeug -mercurial==6.4.4 +mercurial==7.2 # via -r requirements/static/ci/linux.in mock==5.1.0 # via -r requirements/pytest.txt From 3b6005c42e476792b2f01aac4ff69a3ff63d256f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 4 Apr 2026 05:56:16 +0000 Subject: [PATCH 10/34] Fix Python 3.12 test failures: imp module, assertDictContainsSubset, distutils, utcnow Agent-Logs-Url: https://github.com/saltstack/salt/sessions/8d432548-1f18-44b2-9fea-496226ca1f79 Co-authored-by: dwoz <1527763+dwoz@users.noreply.github.com> --- salt/utils/versions.py | 2 +- tests/integration/modules/test_saltcheck.py | 29 ++++++++++---------- tests/pytests/functional/modules/test_pip.py | 20 ++++++++++++-- tests/support/unit.py | 25 +++++++++++++++++ tests/unit/test_zypp_plugins.py | 10 +++---- tests/unit/utils/test_color.py | 2 +- 6 files changed, 65 insertions(+), 23 deletions(-) diff --git a/salt/utils/versions.py b/salt/utils/versions.py index d64d2d66f3fd..9f535c91bd86 100644 --- a/salt/utils/versions.py +++ b/salt/utils/versions.py @@ -244,7 +244,7 @@ def warn_until_date( # Attribute the warning to the calling function, not to warn_until_date() stacklevel = 2 - today = _current_date or datetime.datetime.utcnow().date() + today = _current_date or datetime.datetime.now(datetime.timezone.utc).date() if today >= date: caller = inspect.getframeinfo(sys._getframe(stacklevel - 1)) deprecated_message = ( diff --git a/tests/integration/modules/test_saltcheck.py b/tests/integration/modules/test_saltcheck.py index 914b046fdd71..05dbb392e126 100644 --- a/tests/integration/modules/test_saltcheck.py +++ b/tests/integration/modules/test_saltcheck.py @@ -25,7 +25,7 @@ def test_saltcheck_run(self): "args": ["This works!"], } ret = self.run_function("saltcheck.run_test", test=saltcheck_test) - self.assertDictContainsSubset({"status": "Pass"}, ret) + self.assertEqual(ret.get("status"), "Pass") @pytest.mark.slow_test def test_saltcheck_state(self): @@ -34,10 +34,10 @@ def test_saltcheck_state(self): """ saltcheck_test = "validate-saltcheck" ret = self.run_function("saltcheck.run_state_tests", [saltcheck_test]) - self.assertDictContainsSubset( - {"status": "Pass"}, ret[0]["validate-saltcheck"]["echo_test_hello"] + self.assertEqual( + ret[0]["validate-saltcheck"]["echo_test_hello"].get("status"), "Pass" ) - self.assertDictContainsSubset({"Failed": 0}, ret[1]["TEST RESULTS"]) + self.assertEqual(ret[1]["TEST RESULTS"].get("Failed"), 0) @pytest.mark.slow_test def test_topfile_validation(self): @@ -61,11 +61,11 @@ def test_saltcheck_checkall(self): ret = self.run_function( "saltcheck.run_state_tests", [saltcheck_test], check_all=True ) - self.assertDictContainsSubset( - {"status": "Pass"}, ret[0]["validate-saltcheck"]["echo_test_hello"] + self.assertEqual( + ret[0]["validate-saltcheck"]["echo_test_hello"].get("status"), "Pass" ) - self.assertDictContainsSubset( - {"status": "Pass"}, ret[0]["validate-saltcheck"]["check_all_validate"] + self.assertEqual( + ret[0]["validate-saltcheck"]["check_all_validate"].get("status"), "Pass" ) @pytest.mark.slow_test @@ -82,11 +82,12 @@ def test_saltcheck_checkall_saltenv(self): saltenv="prod", check_all=True, ) - self.assertDictContainsSubset( - {"status": "Pass"}, ret[0]["validate-saltcheck"]["echo_test_prod_env"] + self.assertEqual( + ret[0]["validate-saltcheck"]["echo_test_prod_env"].get("status"), "Pass" ) - self.assertDictContainsSubset( - {"status": "Pass"}, ret[0]["validate-saltcheck"]["check_all_validate_prod"] + self.assertEqual( + ret[0]["validate-saltcheck"]["check_all_validate_prod"].get("status"), + "Pass", ) @pytest.mark.slow_test @@ -98,6 +99,6 @@ def test_saltcheck_saltenv(self): ret = self.run_function( "saltcheck.run_state_tests", [saltcheck_test], saltenv="prod" ) - self.assertDictContainsSubset( - {"status": "Pass"}, ret[0]["validate-saltcheck"]["echo_test_prod_env"] + self.assertEqual( + ret[0]["validate-saltcheck"]["echo_test_prod_env"].get("status"), "Pass" ) diff --git a/tests/pytests/functional/modules/test_pip.py b/tests/pytests/functional/modules/test_pip.py index 0537e0ca68d0..152b5ff85b59 100644 --- a/tests/pytests/functional/modules/test_pip.py +++ b/tests/pytests/functional/modules/test_pip.py @@ -74,8 +74,20 @@ def _pip_successful_install( reason="'pip==9.0.3' is not available on Py >= 3.10", ), ), - "pip<20.0", - "pip<21.0", + pytest.param( + "pip<20.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="'pip<20.0' requires 'distutils' which was removed in Py >= 3.12", + ), + ), + pytest.param( + "pip<21.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="'pip<21.0' requires 'distutils' which was removed in Py >= 3.12", + ), + ), "pip>=21.0", ), ) @@ -103,6 +115,10 @@ def test_list_available_packages_with_index_url(pip, pip_version, tmp_path): pytest.skip(f"{pip_version} is not available on Py3.5") if sys.version_info >= (3, 10) and pip_version == "pip==9.0.3": pytest.skip(f"{pip_version} is not available on Py3.10") + if sys.version_info >= (3, 12) and pip_version in ("pip<20.0", "pip<21.0"): + pytest.skip( + f"{pip_version} requires 'distutils' which was removed in Py >= 3.12" + ) with VirtualEnv(venv_dir=tmp_path, pip_requirement=pip_version) as virtualenv: virtualenv.install("-U", pip_version) package_name = "pep8" diff --git a/tests/support/unit.py b/tests/support/unit.py index 7e2aefb43aa5..1e1041ebf611 100644 --- a/tests/support/unit.py +++ b/tests/support/unit.py @@ -209,6 +209,31 @@ def run(self, result=None): del self._prerun_instance_attributes return outcome + def assertDictContainsSubset(self, expected, actual, msg=None): + """ + Checks whether all key/value pairs in expected are found in actual. + This method was removed in Python 3.12. + """ + missing = [] + mismatched = [] + for key, value in expected.items(): + if key not in actual: + missing.append(key) + elif value != actual[key]: + mismatched.append( + "{!r}, expected: {!r}, actual: {!r}".format( + key, value, actual[key] + ) + ) + if missing or mismatched: + parts = [] + if missing: + parts.append("Missing: {}".format(", ".join(repr(m) for m in missing))) + if mismatched: + parts.append("Mismatched values: {}".format(", ".join(mismatched))) + standard_msg = "; ".join(parts) + self.fail(self._formatMessage(msg, standard_msg)) + def shortDescription(self): desc = _TestCase.shortDescription(self) if HAS_PSUTIL and SHOW_PROC: diff --git a/tests/unit/test_zypp_plugins.py b/tests/unit/test_zypp_plugins.py index b6bdd2b6de02..a5eaee5ca923 100644 --- a/tests/unit/test_zypp_plugins.py +++ b/tests/unit/test_zypp_plugins.py @@ -2,7 +2,6 @@ :codeauthor: Bo Maryniuk """ -import importlib.machinery import importlib.util import os @@ -42,10 +41,11 @@ def test_drift_detector(self): Returns: """ - loader = importlib.machinery.SourceFileLoader("zyppnotify", ZYPPNOTIFY_FILE) - spec = importlib.util.spec_from_loader("zyppnotify", loader) - zyppnotify = importlib.util.module_from_spec(spec) - spec.loader.exec_module(zyppnotify) + zyppnotify_spec = importlib.util.spec_from_file_location( + "zyppnotify", ZYPPNOTIFY_FILE + ) + zyppnotify = importlib.util.module_from_spec(zyppnotify_spec) + zyppnotify_spec.loader.exec_module(zyppnotify) drift = zyppnotify.DriftDetector() drift._get_mtime = MagicMock(return_value=123) drift._get_checksum = MagicMock(return_value="deadbeef") diff --git a/tests/unit/utils/test_color.py b/tests/unit/utils/test_color.py index 741db780a23a..0e3f5ac042fb 100644 --- a/tests/unit/utils/test_color.py +++ b/tests/unit/utils/test_color.py @@ -12,7 +12,7 @@ def test_get_colors(self): self.assertEqual("\x1b[0;37m", str(ret["LIGHT_GRAY"])) ret = salt.utils.color.get_colors(use=False) - self.assertDictContainsSubset({"LIGHT_GRAY": ""}, ret) + self.assertEqual(ret.get("LIGHT_GRAY"), "") ret = salt.utils.color.get_colors(use="LIGHT_GRAY") # LIGHT_YELLOW now == LIGHT_GRAY From 20e2abeff9c4390846566bbc9c57703d1f9d29cb Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 4 Apr 2026 05:57:45 +0000 Subject: [PATCH 11/34] Fix Python 3.12 compatibility: remove uses of imp, assertDictContainsSubset, distutils, and utcnow Agent-Logs-Url: https://github.com/saltstack/salt/sessions/8d432548-1f18-44b2-9fea-496226ca1f79 Co-authored-by: dwoz <1527763+dwoz@users.noreply.github.com> --- tests/pytests/functional/modules/test_pip.py | 40 ++++++++++++++------ 1 file changed, 28 insertions(+), 12 deletions(-) diff --git a/tests/pytests/functional/modules/test_pip.py b/tests/pytests/functional/modules/test_pip.py index 152b5ff85b59..5140b227eaed 100644 --- a/tests/pytests/functional/modules/test_pip.py +++ b/tests/pytests/functional/modules/test_pip.py @@ -104,21 +104,37 @@ def test_list_available_packages(pip, pip_version, tmp_path): @pytest.mark.parametrize( "pip_version", ( - "pip==9.0.3", - "pip<20.0", - "pip<21.0", - "pip>=21.0", + pytest.param( + "pip==9.0.3", + marks=pytest.mark.skipif( + sys.version_info >= (3, 10), + reason="'pip==9.0.3' is not available on Py >= 3.10", + ), + ), + pytest.param( + "pip<20.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="'pip<20.0' requires 'distutils' which was removed in Py >= 3.12", + ), + ), + pytest.param( + "pip<21.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="'pip<21.0' requires 'distutils' which was removed in Py >= 3.12", + ), + ), + pytest.param( + "pip>=21.0", + marks=pytest.mark.skipif( + sys.version_info < (3, 6), + reason="'pip>=21.0' is not available on Py < 3.6", + ), + ), ), ) def test_list_available_packages_with_index_url(pip, pip_version, tmp_path): - if sys.version_info < (3, 6) and pip_version == "pip>=21.0": - pytest.skip(f"{pip_version} is not available on Py3.5") - if sys.version_info >= (3, 10) and pip_version == "pip==9.0.3": - pytest.skip(f"{pip_version} is not available on Py3.10") - if sys.version_info >= (3, 12) and pip_version in ("pip<20.0", "pip<21.0"): - pytest.skip( - f"{pip_version} requires 'distutils' which was removed in Py >= 3.12" - ) with VirtualEnv(venv_dir=tmp_path, pip_requirement=pip_version) as virtualenv: virtualenv.install("-U", pip_version) package_name = "pep8" From e8c4dfbdae711cee1e683cce201376b49b677d0b Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 4 Apr 2026 06:27:24 +0000 Subject: [PATCH 12/34] Fix Python 3.12 compatibility: imp, assertDictContainsSubset, distutils, utcnow Agent-Logs-Url: https://github.com/saltstack/salt/sessions/2589ab85-0b14-4b58-a74b-0e3c226cb53d Co-authored-by: dwoz <1527763+dwoz@users.noreply.github.com> --- tests/support/unit.py | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/tests/support/unit.py b/tests/support/unit.py index 1e1041ebf611..0f230bc200e0 100644 --- a/tests/support/unit.py +++ b/tests/support/unit.py @@ -209,21 +209,19 @@ def run(self, result=None): del self._prerun_instance_attributes return outcome - def assertDictContainsSubset(self, expected, actual, msg=None): + def assertDictContainsSubset(self, subset, dictionary, msg=None): """ - Checks whether all key/value pairs in expected are found in actual. + Checks whether all key/value pairs in subset are found in dictionary. This method was removed in Python 3.12. """ missing = [] mismatched = [] - for key, value in expected.items(): - if key not in actual: + for key, value in subset.items(): + if key not in dictionary: missing.append(key) - elif value != actual[key]: + elif value != dictionary[key]: mismatched.append( - "{!r}, expected: {!r}, actual: {!r}".format( - key, value, actual[key] - ) + "{!r}, expected: {!r}, actual: {!r}".format(key, value, dictionary[key]) ) if missing or mismatched: parts = [] From 4de0f3d4df31a352b9ba83456896a8ca4f031b9c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 4 Apr 2026 08:11:35 +0000 Subject: [PATCH 13/34] Remove changes already fixed in pyversion branch (versions.py, test_zypp_plugins.py, test_pip.py) Co-authored-by: dwoz <1527763+dwoz@users.noreply.github.com> --- salt/utils/versions.py | 2 +- tests/pytests/functional/modules/test_pip.py | 52 ++++---------------- tests/unit/test_zypp_plugins.py | 8 +-- 3 files changed, 13 insertions(+), 49 deletions(-) diff --git a/salt/utils/versions.py b/salt/utils/versions.py index 9f535c91bd86..d64d2d66f3fd 100644 --- a/salt/utils/versions.py +++ b/salt/utils/versions.py @@ -244,7 +244,7 @@ def warn_until_date( # Attribute the warning to the calling function, not to warn_until_date() stacklevel = 2 - today = _current_date or datetime.datetime.now(datetime.timezone.utc).date() + today = _current_date or datetime.datetime.utcnow().date() if today >= date: caller = inspect.getframeinfo(sys._getframe(stacklevel - 1)) deprecated_message = ( diff --git a/tests/pytests/functional/modules/test_pip.py b/tests/pytests/functional/modules/test_pip.py index 5140b227eaed..0537e0ca68d0 100644 --- a/tests/pytests/functional/modules/test_pip.py +++ b/tests/pytests/functional/modules/test_pip.py @@ -74,20 +74,8 @@ def _pip_successful_install( reason="'pip==9.0.3' is not available on Py >= 3.10", ), ), - pytest.param( - "pip<20.0", - marks=pytest.mark.skipif( - sys.version_info >= (3, 12), - reason="'pip<20.0' requires 'distutils' which was removed in Py >= 3.12", - ), - ), - pytest.param( - "pip<21.0", - marks=pytest.mark.skipif( - sys.version_info >= (3, 12), - reason="'pip<21.0' requires 'distutils' which was removed in Py >= 3.12", - ), - ), + "pip<20.0", + "pip<21.0", "pip>=21.0", ), ) @@ -104,37 +92,17 @@ def test_list_available_packages(pip, pip_version, tmp_path): @pytest.mark.parametrize( "pip_version", ( - pytest.param( - "pip==9.0.3", - marks=pytest.mark.skipif( - sys.version_info >= (3, 10), - reason="'pip==9.0.3' is not available on Py >= 3.10", - ), - ), - pytest.param( - "pip<20.0", - marks=pytest.mark.skipif( - sys.version_info >= (3, 12), - reason="'pip<20.0' requires 'distutils' which was removed in Py >= 3.12", - ), - ), - pytest.param( - "pip<21.0", - marks=pytest.mark.skipif( - sys.version_info >= (3, 12), - reason="'pip<21.0' requires 'distutils' which was removed in Py >= 3.12", - ), - ), - pytest.param( - "pip>=21.0", - marks=pytest.mark.skipif( - sys.version_info < (3, 6), - reason="'pip>=21.0' is not available on Py < 3.6", - ), - ), + "pip==9.0.3", + "pip<20.0", + "pip<21.0", + "pip>=21.0", ), ) def test_list_available_packages_with_index_url(pip, pip_version, tmp_path): + if sys.version_info < (3, 6) and pip_version == "pip>=21.0": + pytest.skip(f"{pip_version} is not available on Py3.5") + if sys.version_info >= (3, 10) and pip_version == "pip==9.0.3": + pytest.skip(f"{pip_version} is not available on Py3.10") with VirtualEnv(venv_dir=tmp_path, pip_requirement=pip_version) as virtualenv: virtualenv.install("-U", pip_version) package_name = "pep8" diff --git a/tests/unit/test_zypp_plugins.py b/tests/unit/test_zypp_plugins.py index a5eaee5ca923..5771c4a2d611 100644 --- a/tests/unit/test_zypp_plugins.py +++ b/tests/unit/test_zypp_plugins.py @@ -2,7 +2,7 @@ :codeauthor: Bo Maryniuk """ -import importlib.util +import imp # pylint: disable=deprecated-module import os import pytest @@ -41,11 +41,7 @@ def test_drift_detector(self): Returns: """ - zyppnotify_spec = importlib.util.spec_from_file_location( - "zyppnotify", ZYPPNOTIFY_FILE - ) - zyppnotify = importlib.util.module_from_spec(zyppnotify_spec) - zyppnotify_spec.loader.exec_module(zyppnotify) + zyppnotify = imp.load_source("zyppnotify", ZYPPNOTIFY_FILE) drift = zyppnotify.DriftDetector() drift._get_mtime = MagicMock(return_value=123) drift._get_checksum = MagicMock(return_value="deadbeef") From 0e462fcef82394b4789528a678f0b04665a75fb7 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sat, 4 Apr 2026 23:01:03 +0000 Subject: [PATCH 14/34] Fix Python 3.12 pip compatibility: update pip requirement and skip old-pip test cases Agent-Logs-Url: https://github.com/saltstack/salt/sessions/ac7d00ce-330f-49d8-83c6-e7fcd6f5ed69 Co-authored-by: dwoz <1527763+dwoz@users.noreply.github.com> --- tests/pytests/functional/modules/test_pip.py | 42 +++++++++++++++---- .../integration/states/test_pip_state.py | 25 +++++++++-- tests/support/helpers.py | 5 ++- 3 files changed, 61 insertions(+), 11 deletions(-) diff --git a/tests/pytests/functional/modules/test_pip.py b/tests/pytests/functional/modules/test_pip.py index 0537e0ca68d0..e7b621aefdd0 100644 --- a/tests/pytests/functional/modules/test_pip.py +++ b/tests/pytests/functional/modules/test_pip.py @@ -74,8 +74,20 @@ def _pip_successful_install( reason="'pip==9.0.3' is not available on Py >= 3.10", ), ), - "pip<20.0", - "pip<21.0", + pytest.param( + "pip<20.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="pip < 20.0 is not compatible with Python >= 3.12", + ), + ), + pytest.param( + "pip<21.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="pip < 21.0 is not compatible with Python >= 3.12", + ), + ), "pip>=21.0", ), ) @@ -92,17 +104,33 @@ def test_list_available_packages(pip, pip_version, tmp_path): @pytest.mark.parametrize( "pip_version", ( - "pip==9.0.3", - "pip<20.0", - "pip<21.0", + pytest.param( + "pip==9.0.3", + marks=pytest.mark.skipif( + sys.version_info >= (3, 10), + reason="'pip==9.0.3' is not available on Py >= 3.10", + ), + ), + pytest.param( + "pip<20.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="pip < 20.0 is not compatible with Python >= 3.12", + ), + ), + pytest.param( + "pip<21.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="pip < 21.0 is not compatible with Python >= 3.12", + ), + ), "pip>=21.0", ), ) def test_list_available_packages_with_index_url(pip, pip_version, tmp_path): if sys.version_info < (3, 6) and pip_version == "pip>=21.0": pytest.skip(f"{pip_version} is not available on Py3.5") - if sys.version_info >= (3, 10) and pip_version == "pip==9.0.3": - pytest.skip(f"{pip_version} is not available on Py3.10") with VirtualEnv(venv_dir=tmp_path, pip_requirement=pip_version) as virtualenv: virtualenv.install("-U", pip_version) package_name = "pep8" diff --git a/tests/pytests/integration/states/test_pip_state.py b/tests/pytests/integration/states/test_pip_state.py index ad7f52582760..34e32bdd410f 100644 --- a/tests/pytests/integration/states/test_pip_state.py +++ b/tests/pytests/integration/states/test_pip_state.py @@ -1,5 +1,6 @@ import os import subprocess +import sys import pytest @@ -35,11 +36,29 @@ def _extra_requirements(): "pip_contraint", [ # Latest pip 18 - "<19.0", + pytest.param( + "<19.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="pip < 19.0 is not compatible with Python >= 3.12", + ), + ), # Latest pip 19 - "<20.0", + pytest.param( + "<20.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="pip < 20.0 is not compatible with Python >= 3.12", + ), + ), # Latest pip 20 - "<21.0", + pytest.param( + "<21.0", + marks=pytest.mark.skipif( + sys.version_info >= (3, 12), + reason="pip < 21.0 is not compatible with Python >= 3.12", + ), + ), # Latest pip None, ], diff --git a/tests/support/helpers.py b/tests/support/helpers.py index 92b016391bf1..852fd668571a 100644 --- a/tests/support/helpers.py +++ b/tests/support/helpers.py @@ -1613,7 +1613,10 @@ class VirtualEnv: @pip_requirement.default def _default_pip_requirement(self): if os.environ.get("ONEDIR_TESTRUN", "0") == "1": - return "pip>=22.3.1,<23.0" + # pip < 23.2 vendors pkg_resources that uses pkgutil.ImpImporter, + # which was removed in Python 3.12. Require 23.2+ to avoid + # AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. + return "pip>=23.2" return "pip>=20.2.4,<21.2" @setuptools_requirement.default From af81c858d0bc60d9984f42bfe02dbe6168eb7a57 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 01:12:07 +0000 Subject: [PATCH 15/34] Fix black formatting in tests/support/unit.py Agent-Logs-Url: https://github.com/saltstack/salt/sessions/186b30f6-8024-4036-af58-06e11835d7bb Co-authored-by: dwoz <1527763+dwoz@users.noreply.github.com> --- tests/support/unit.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/support/unit.py b/tests/support/unit.py index 0f230bc200e0..c463992af8a9 100644 --- a/tests/support/unit.py +++ b/tests/support/unit.py @@ -221,7 +221,9 @@ def assertDictContainsSubset(self, subset, dictionary, msg=None): missing.append(key) elif value != dictionary[key]: mismatched.append( - "{!r}, expected: {!r}, actual: {!r}".format(key, value, dictionary[key]) + "{!r}, expected: {!r}, actual: {!r}".format( + key, value, dictionary[key] + ) ) if missing or mismatched: parts = [] From 25cb6b62d1e1e9a11ae288946afa5b422e122024 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Sun, 5 Apr 2026 03:59:07 +0000 Subject: [PATCH 16/34] Fix Python 3.12 incompatibilities: imp, pkg_resources, utcnow - tests/unit/test_zypp_plugins.py: replace `import imp` (removed in Python 3.12) with `importlib.util`, and replace `imp.load_source()` with `spec_from_file_location` + `module_from_spec` + `exec_module` - salt/modules/virtualenv_mod.py: fix `get_distribution_path` to use `importlib.metadata` instead of `pkg_resources`; old setuptools references `pkgutil.ImpImporter` which was removed in Python 3.12 - salt/utils/versions.py: replace `datetime.utcnow()` (deprecated in Python 3.12) with `datetime.now(datetime.timezone.utc)` to eliminate the DeprecationWarning that breaks test_deprecation_warnings[env0-False] Agent-Logs-Url: https://github.com/saltstack/salt/sessions/80a13379-dae2-4c51-bff3-d9e06c170f4b Co-authored-by: dwoz <1527763+dwoz@users.noreply.github.com> --- salt/modules/virtualenv_mod.py | 10 ++++++++-- salt/utils/versions.py | 2 +- tests/unit/test_zypp_plugins.py | 6 ++++-- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/salt/modules/virtualenv_mod.py b/salt/modules/virtualenv_mod.py index cd52435e6f51..edaf3e0fc8d4 100644 --- a/salt/modules/virtualenv_mod.py +++ b/salt/modules/virtualenv_mod.py @@ -382,8 +382,14 @@ def get_distribution_path(venv, distribution): ret = __salt__["cmd.exec_code_all"]( bin_path, - "import pkg_resources; " - "print(pkg_resources.get_distribution('{}').location)".format(distribution), + "try:\n" + " import importlib.metadata, pathlib\n" + " print(str(pathlib.Path(importlib.metadata.distribution('{}').locate_file('.')).resolve()))\n" + "except Exception:\n" + " import pkg_resources\n" + " print(pkg_resources.get_distribution('{}').location)\n".format( + distribution, distribution + ), ) if ret["retcode"] != 0: diff --git a/salt/utils/versions.py b/salt/utils/versions.py index d64d2d66f3fd..9f535c91bd86 100644 --- a/salt/utils/versions.py +++ b/salt/utils/versions.py @@ -244,7 +244,7 @@ def warn_until_date( # Attribute the warning to the calling function, not to warn_until_date() stacklevel = 2 - today = _current_date or datetime.datetime.utcnow().date() + today = _current_date or datetime.datetime.now(datetime.timezone.utc).date() if today >= date: caller = inspect.getframeinfo(sys._getframe(stacklevel - 1)) deprecated_message = ( diff --git a/tests/unit/test_zypp_plugins.py b/tests/unit/test_zypp_plugins.py index 5771c4a2d611..9973dbe74438 100644 --- a/tests/unit/test_zypp_plugins.py +++ b/tests/unit/test_zypp_plugins.py @@ -2,7 +2,7 @@ :codeauthor: Bo Maryniuk """ -import imp # pylint: disable=deprecated-module +import importlib.util import os import pytest @@ -41,7 +41,9 @@ def test_drift_detector(self): Returns: """ - zyppnotify = imp.load_source("zyppnotify", ZYPPNOTIFY_FILE) + spec = importlib.util.spec_from_file_location("zyppnotify", ZYPPNOTIFY_FILE) + zyppnotify = importlib.util.module_from_spec(spec) + spec.loader.exec_module(zyppnotify) drift = zyppnotify.DriftDetector() drift._get_mtime = MagicMock(return_value=123) drift._get_checksum = MagicMock(return_value="deadbeef") From e76bc81df082b85902aa3235ce509b7325fb582d Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 12:41:28 -0700 Subject: [PATCH 17/34] Fix Python 3.12 compatibility issues Replace deprecated datetime.utcnow() calls with a compatibility function that uses datetime.now(timezone.utc) for Python 3.12+ and falls back to datetime.utcnow() for older versions. Also fix zeromq test that failed due to accessing uninitialized socket object by calling _init_socket() before socket access. Changes: - Add salt.utils.timeutil.utcnow() compatibility function - Replace all datetime.utcnow() calls across salt modules - Fix test_request_client_send_recv_loop_closed socket initialization --- salt/beacons/status.py | 4 +-- salt/client/ssh/__init__.py | 3 +- salt/modules/system.py | 3 +- salt/modules/tls.py | 29 ++++++++++++------- salt/modules/vsphere.py | 4 +-- salt/modules/win_timezone.py | 6 ++-- salt/modules/x509.py | 5 ++-- salt/spm/pkgdb/sqlite3.py | 5 ++-- salt/utils/aws.py | 10 +++---- salt/utils/event.py | 5 ++-- salt/utils/timeutil.py | 18 ++++++++++-- .../transport/zeromq/test_request_client.py | 2 ++ 12 files changed, 62 insertions(+), 32 deletions(-) diff --git a/salt/beacons/status.py b/salt/beacons/status.py index 8c1210e7dbc7..cfb17715f3da 100644 --- a/salt/beacons/status.py +++ b/salt/beacons/status.py @@ -88,12 +88,12 @@ """ -import datetime import logging import salt.exceptions import salt.utils.beacons import salt.utils.platform +import salt.utils.timeutil log = logging.getLogger(__name__) @@ -118,7 +118,7 @@ def beacon(config): Return status for requested information """ log.debug(config) - ctime = datetime.datetime.utcnow().isoformat() + ctime = salt.utils.timeutil.utcnow().isoformat() whitelist = [] config = salt.utils.beacons.remove_hidden_options(config, whitelist) diff --git a/salt/client/ssh/__init__.py b/salt/client/ssh/__init__.py index 634e924f805e..cd2d2af945a6 100644 --- a/salt/client/ssh/__init__.py +++ b/salt/client/ssh/__init__.py @@ -46,6 +46,7 @@ import salt.utils.relenv import salt.utils.stringutils import salt.utils.thin +import salt.utils.timeutil import salt.utils.url import salt.utils.verify from salt._logging import LOG_LEVELS @@ -512,7 +513,7 @@ def _update_roster(self): '# Automatically added by "{s_user}" at {s_time}\n{hostname}:\n' " host: {hostname}\n user: {user}\n passwd: {passwd}\n".format( s_user=getpass.getuser(), - s_time=datetime.datetime.utcnow().isoformat(), + s_time=salt.utils.timeutil.utcnow().isoformat(), hostname=self.opts.get("tgt", ""), user=self.opts.get("ssh_user", ""), passwd=self.opts.get("ssh_passwd", ""), diff --git a/salt/modules/system.py b/salt/modules/system.py index 059c4c26ba8e..1899742f2ba2 100644 --- a/salt/modules/system.py +++ b/salt/modules/system.py @@ -20,6 +20,7 @@ import salt.utils.files import salt.utils.path import salt.utils.platform +import salt.utils.timeutil from salt.exceptions import CommandExecutionError, SaltInvocationError from salt.utils.decorators import depends @@ -258,7 +259,7 @@ def _get_offset_time(utc_offset): if utc_offset is not None: minutes = _offset_to_min(utc_offset) offset = timedelta(minutes=minutes) - offset_time = datetime.utcnow() + offset + offset_time = salt.utils.timeutil.utcnow() + offset offset_time = offset_time.replace(tzinfo=_FixedOffset(minutes)) else: offset_time = datetime.now() diff --git a/salt/modules/tls.py b/salt/modules/tls.py index 85e599cccf36..3d20897fe37e 100644 --- a/salt/modules/tls.py +++ b/salt/modules/tls.py @@ -110,6 +110,7 @@ import salt.utils.data import salt.utils.files import salt.utils.stringutils +import salt.utils.timeutil from salt.exceptions import CommandExecutionError from salt.utils.versions import Version @@ -365,7 +366,7 @@ def maybe_fix_ssl_version(ca_name, cacert_path=None, ca_filename=None): try: days = ( datetime.strptime(cert.get_notAfter(), "%Y%m%d%H%M%SZ") - - datetime.utcnow() + - salt.utils.timeutil.utcnow() ).days except (ValueError, TypeError): days = 365 @@ -593,8 +594,10 @@ def validate(cert, ca_name, crl_file): builder = x509.CertificateRevocationListBuilder() builder = builder.issuer_name(ca_x509.subject) - builder = builder.last_update(datetime.utcnow()) - builder = builder.next_update(datetime.utcnow() + timedelta(days=36500)) + builder = builder.last_update(salt.utils.timeutil.utcnow()) + builder = builder.next_update( + salt.utils.timeutil.utcnow() + timedelta(days=36500) + ) # Load existing revocations from index file if it exists index_file = f"{ca_dir}/index.txt" @@ -845,7 +848,7 @@ def create_ca( err, ) bck = "{}.unloadable.{}".format( - ca_keyp, datetime.utcnow().strftime("%Y%m%d%H%M%S") + ca_keyp, salt.utils.timeutil.utcnow().strftime("%Y%m%d%H%M%S") ) log.info("Saving unloadable CA ssl key in %s", bck) os.rename(ca_keyp, bck) @@ -903,7 +906,9 @@ def create_ca( keycontent = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, key) write_key = True if os.path.exists(ca_keyp): - bck = "{}.{}".format(ca_keyp, datetime.utcnow().strftime("%Y%m%d%H%M%S")) + bck = "{}.{}".format( + ca_keyp, salt.utils.timeutil.utcnow().strftime("%Y%m%d%H%M%S") + ) with salt.utils.files.fopen(ca_keyp) as fic: old_key = salt.utils.stringutils.to_unicode(fic.read()).strip() if old_key.strip() == keycontent.strip(): @@ -1905,8 +1910,10 @@ def create_empty_crl( builder = x509.CertificateRevocationListBuilder() builder = builder.issuer_name(ca_x509.subject) - builder = builder.last_update(datetime.utcnow()) - builder = builder.next_update(datetime.utcnow() + timedelta(days=36500)) + builder = builder.last_update(salt.utils.timeutil.utcnow()) + builder = builder.next_update( + salt.utils.timeutil.utcnow() + timedelta(days=36500) + ) # Mapping digest strings to cryptography hashes hash_algo = getattr(hashes, digest.upper(), hashes.SHA256)() @@ -2021,7 +2028,7 @@ def revoke_cert( ) index_r_data = "R\t{}\t{}\t{}".format( expire_date, - _four_digit_year_to_two_digit(datetime.utcnow()), + _four_digit_year_to_two_digit(salt.utils.timeutil.utcnow()), index_serial_subject, ) @@ -2063,8 +2070,10 @@ def revoke_cert( builder = x509.CertificateRevocationListBuilder() builder = builder.issuer_name(ca_x509.subject) - builder = builder.last_update(datetime.utcnow()) - builder = builder.next_update(datetime.utcnow() + timedelta(days=36500)) + builder = builder.last_update(salt.utils.timeutil.utcnow()) + builder = builder.next_update( + salt.utils.timeutil.utcnow() + timedelta(days=36500) + ) with salt.utils.files.fopen(index_file) as fp_: for line in fp_: diff --git a/salt/modules/vsphere.py b/salt/modules/vsphere.py index ff62e1ca3c65..c2eb7535326e 100644 --- a/salt/modules/vsphere.py +++ b/salt/modules/vsphere.py @@ -181,7 +181,6 @@ 6500 """ -import datetime import logging import sys from functools import wraps @@ -191,6 +190,7 @@ import salt.utils.http import salt.utils.path import salt.utils.pbm +import salt.utils.timeutil import salt.utils.vmware import salt.utils.vsan from salt.config.schemas.esxcluster import ( @@ -3877,7 +3877,7 @@ def update_host_datetime( host_ref = _get_host_ref(service_instance, host, host_name=host_name) date_time_manager = _get_date_time_mgr(host_ref) try: - date_time_manager.UpdateDateTime(datetime.datetime.utcnow()) + date_time_manager.UpdateDateTime(salt.utils.timeutil.utcnow()) except vim.fault.HostConfigFault as err: msg = "'vsphere.update_date_time' failed for host {}: {}".format( host_name, err diff --git a/salt/modules/win_timezone.py b/salt/modules/win_timezone.py index 85807a7503d0..da00c1d01c21 100644 --- a/salt/modules/win_timezone.py +++ b/salt/modules/win_timezone.py @@ -3,8 +3,8 @@ """ import logging -from datetime import datetime +import salt.utils.timeutil from salt.exceptions import CommandExecutionError try: @@ -242,7 +242,7 @@ def get_offset(): """ # http://craigglennie.com/programming/python/2013/07/21/working-with-timezones-using-Python-and-pytz-localize-vs-normalize/ tz_object = pytz.timezone(get_zone()) - utc_time = pytz.utc.localize(datetime.utcnow()) + utc_time = pytz.utc.localize(salt.utils.timeutil.utcnow()) loc_time = utc_time.astimezone(tz_object) norm_time = tz_object.normalize(loc_time) return norm_time.strftime("%z") @@ -262,7 +262,7 @@ def get_zonecode(): salt '*' timezone.get_zonecode """ tz_object = pytz.timezone(get_zone()) - loc_time = tz_object.localize(datetime.utcnow()) + loc_time = tz_object.localize(salt.utils.timeutil.utcnow()) return loc_time.tzname() diff --git a/salt/modules/x509.py b/salt/modules/x509.py index 0e68d38116be..baf8c2a65880 100644 --- a/salt/modules/x509.py +++ b/salt/modules/x509.py @@ -37,6 +37,7 @@ import salt.utils.path import salt.utils.platform import salt.utils.stringutils +import salt.utils.timeutil import salt.utils.versions from salt.state import STATE_INTERNAL_KEYWORDS as _STATE_INTERNAL_KEYWORDS @@ -1963,7 +1964,7 @@ def expired(certificate): ret["path"] = certificate cert = _get_certificate_obj(certificate) - _now = datetime.datetime.utcnow() + _now = salt.utils.timeutil.utcnow() _expiration_date = cert.get_not_after().get_datetime() ret["cn"] = _parse_subject(cert.get_subject())["CN"] @@ -2007,7 +2008,7 @@ def will_expire(certificate, days): cert = _get_certificate_obj(certificate) - _check_time = datetime.datetime.utcnow() + datetime.timedelta(days=days) + _check_time = salt.utils.timeutil.utcnow() + datetime.timedelta(days=days) _expiration_date = cert.get_not_after().get_datetime() ret["cn"] = _parse_subject(cert.get_subject())["CN"] diff --git a/salt/spm/pkgdb/sqlite3.py b/salt/spm/pkgdb/sqlite3.py index c6c0fb1384f1..83a127cbf1b5 100644 --- a/salt/spm/pkgdb/sqlite3.py +++ b/salt/spm/pkgdb/sqlite3.py @@ -4,12 +4,13 @@ .. versionadded:: 2015.8.0 """ -import datetime import logging import os import sqlite3 from sqlite3 import OperationalError +import salt.utils.timeutil + # Get logging started log = logging.getLogger(__name__) @@ -166,7 +167,7 @@ def register_pkg(name, formula_def, conn=None): name, formula_def["version"], formula_def["release"], - datetime.datetime.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT"), + salt.utils.timeutil.utcnow().strftime("%a, %d %b %Y %H:%M:%S GMT"), formula_def.get("os", None), formula_def.get("os_family", None), formula_def.get("dependencies", None), diff --git a/salt/utils/aws.py b/salt/utils/aws.py index 615aee19040c..086329edafcf 100644 --- a/salt/utils/aws.py +++ b/salt/utils/aws.py @@ -18,12 +18,12 @@ import time import urllib.parse import xml.etree.ElementTree as ET -from datetime import datetime import requests import salt.config import salt.utils.hashutils +import salt.utils.timeutil import salt.utils.xmlutil as xml log = logging.getLogger(__name__) @@ -121,7 +121,7 @@ def creds(provider): ## if needed if provider["id"] == IROLE_CODE or provider["key"] == IROLE_CODE: # Check to see if we have cache credentials that are still good - if not __Expiration__ or __Expiration__ < datetime.utcnow().strftime( + if not __Expiration__ or __Expiration__ < salt.utils.timeutil.utcnow().strftime( "%Y-%m-%dT%H:%M:%SZ" ): # We don't have any cached credentials, or they are expired, get them @@ -164,7 +164,7 @@ def sig2(method, endpoint, params, provider, aws_api_version): http://docs.aws.amazon.com/general/latest/gr/signature-version-2.html """ - timenow = datetime.utcnow() + timenow = salt.utils.timeutil.utcnow() timestamp = timenow.strftime("%Y-%m-%dT%H:%M:%SZ") # Retrieve access credentials from meta-data, or use provided @@ -201,7 +201,7 @@ def assumed_creds(prov_dict, role_arn, location=None): valid_session_name_re = re.compile("[^a-z0-9A-Z+=,.@-]") # current time in epoch seconds - now = time.mktime(datetime.utcnow().timetuple()) + now = time.mktime(salt.utils.timeutil.utcnow().timetuple()) for key, creds in copy.deepcopy(__AssumeCache__).items(): if (creds["Expiration"] - now) <= 120: @@ -281,7 +281,7 @@ def sig4( http://docs.aws.amazon.com/general/latest/gr/sigv4-signed-request-examples.html http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html """ - timenow = datetime.utcnow() + timenow = salt.utils.timeutil.utcnow() # Retrieve access credentials from meta-data, or use provided if role_arn is None: diff --git a/salt/utils/event.py b/salt/utils/event.py index 8b6aae6caeef..44bb01d2e3a3 100644 --- a/salt/utils/event.py +++ b/salt/utils/event.py @@ -75,6 +75,7 @@ import salt.utils.platform import salt.utils.process import salt.utils.stringutils +import salt.utils.timeutil import salt.utils.zeromq from salt.exceptions import SaltDeserializationError, SaltInvocationError from salt.utils.versions import warn_until @@ -782,7 +783,7 @@ async def fire_event_async(self, data, tag, cb=None, timeout=1000): if not self.connect_pull(timeout=timeout_s): return False - data["_stamp"] = datetime.datetime.now(datetime.timezone.utc).isoformat() + data["_stamp"] = salt.utils.timeutil.utcnow().isoformat() event = self.pack(tag, data, max_size=self.opts["max_event_size"]) msg = salt.utils.stringutils.to_bytes(event, "utf-8") self.pusher.publish(msg) @@ -817,7 +818,7 @@ def fire_event(self, data, tag, timeout=1000): if not self.connect_pull(timeout=timeout_s): return False - data["_stamp"] = datetime.datetime.now(datetime.timezone.utc).isoformat() + data["_stamp"] = salt.utils.timeutil.utcnow().isoformat() event = self.pack(tag, data, max_size=self.opts["max_event_size"]) msg = salt.utils.stringutils.to_bytes(event, "utf-8") if self._run_io_loop_sync: diff --git a/salt/utils/timeutil.py b/salt/utils/timeutil.py index 0985ec504be6..7b29a9c54049 100644 --- a/salt/utils/timeutil.py +++ b/salt/utils/timeutil.py @@ -5,14 +5,28 @@ # Import Python import logging import re +import sys import time -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone # Import Salt modules log = logging.getLogger(__name__) +def utcnow(): + """ + Return current UTC time. + + In Python 3.12+, datetime.utcnow() is deprecated in favor of + datetime.now(timezone.utc). This function provides compatibility. + """ + if sys.version_info >= (3, 12): + return datetime.now(timezone.utc) + else: + return datetime.utcnow() + + def get_timestamp_at(time_in=None, time_at=None): """ Computes the timestamp for a future event that may occur in ``time_in`` time @@ -34,7 +48,7 @@ def get_timestamp_at(time_in=None, time_at=None): minutes = 0 hours, minutes = int(hours), int(minutes) dt = timedelta(hours=hours, minutes=minutes) - time_now = datetime.utcnow() + time_now = utcnow() time_at = time_now + dt return time.mktime(time_at.timetuple()) elif time_at: diff --git a/tests/pytests/functional/transport/zeromq/test_request_client.py b/tests/pytests/functional/transport/zeromq/test_request_client.py index e165a09cbec1..368db91c3ee3 100644 --- a/tests/pytests/functional/transport/zeromq/test_request_client.py +++ b/tests/pytests/functional/transport/zeromq/test_request_client.py @@ -151,6 +151,8 @@ def test_request_client_send_recv_loop_closed(minion_opts, port, caplog): serve_socket.bind(minion_opts["master_uri"]) minion_opts["master_uri"] = f"tcp://127.0.0.1:{port}" request_client = salt.transport.zeromq.RequestClient(minion_opts, io_loop) + # Initialize the socket before trying to access it + request_client._init_socket() def poll(*args, **kwargs): """ From 583b4c3b8e76a3cdf754228a382e59e6ac72e6e7 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 14:12:22 -0700 Subject: [PATCH 18/34] Fix pylint duplicate string formatting argument warning Use named argument format to avoid duplicate 'distribution' parameter in string formatting. --- salt/modules/virtualenv_mod.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/salt/modules/virtualenv_mod.py b/salt/modules/virtualenv_mod.py index edaf3e0fc8d4..d3abd597d857 100644 --- a/salt/modules/virtualenv_mod.py +++ b/salt/modules/virtualenv_mod.py @@ -384,11 +384,11 @@ def get_distribution_path(venv, distribution): bin_path, "try:\n" " import importlib.metadata, pathlib\n" - " print(str(pathlib.Path(importlib.metadata.distribution('{}').locate_file('.')).resolve()))\n" + " print(str(pathlib.Path(importlib.metadata.distribution('{dist}').locate_file('.')).resolve()))\n" "except Exception:\n" " import pkg_resources\n" - " print(pkg_resources.get_distribution('{}').location)\n".format( - distribution, distribution + " print(pkg_resources.get_distribution('{dist}').location)\n".format( + dist=distribution ), ) From 601443beae3cc906d731f34d0331d98e5c37462d Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 14:43:40 -0700 Subject: [PATCH 19/34] Fix Python 3.12 datetime deprecation in test SSL fixtures Replace datetime.datetime.utcnow() calls in transport_ssl.py test fixtures with salt.utils.timeutil.utcnow() to avoid deprecation warnings in Python 3.12+. --- tests/support/pytest/transport_ssl.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/support/pytest/transport_ssl.py b/tests/support/pytest/transport_ssl.py index 6189e24482fd..968e3e2fdb80 100644 --- a/tests/support/pytest/transport_ssl.py +++ b/tests/support/pytest/transport_ssl.py @@ -11,6 +11,7 @@ import pytest import salt.utils.files +import salt.utils.timeutil try: from cryptography import x509 @@ -56,8 +57,8 @@ def _generate_ca_certificate(private_key, common_name="Test CA"): .issuer_name(issuer) .public_key(private_key.public_key()) .serial_number(x509.random_serial_number()) - .not_valid_before(datetime.datetime.utcnow()) - .not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=365)) + .not_valid_before(salt.utils.timeutil.utcnow()) + .not_valid_after(salt.utils.timeutil.utcnow() + datetime.timedelta(days=365)) .add_extension( x509.BasicConstraints(ca=True, path_length=0), critical=True, @@ -116,8 +117,8 @@ def _generate_certificate( .issuer_name(ca_cert.subject) .public_key(private_key.public_key()) .serial_number(x509.random_serial_number()) - .not_valid_before(datetime.datetime.utcnow()) - .not_valid_after(datetime.datetime.utcnow() + datetime.timedelta(days=365)) + .not_valid_before(salt.utils.timeutil.utcnow()) + .not_valid_after(salt.utils.timeutil.utcnow() + datetime.timedelta(days=365)) .add_extension( x509.BasicConstraints(ca=False, path_length=None), critical=True, From d422661d06f8f8094ef305231c2ca6ce02dbbf64 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 16:36:13 -0700 Subject: [PATCH 20/34] Fix Python 3.12 datetime deprecation in test files Replace remaining datetime.utcnow() calls in test files with salt.utils.timeutil.utcnow() to avoid deprecation errors when RAISE_DEPRECATIONS_RUNTIME_ERRORS=1 in Python 3.12+. Fixed files: - tests/pytests/functional/modules/test_system.py (8 occurrences) - tests/pytests/unit/test_fileserver.py (1 occurrence) - tests/pytests/unit/utils/test_aws.py (7 occurrences) - tests/unit/modules/test_x509.py (3 occurrences) --- tests/pytests/functional/modules/test_system.py | 17 +++++++++-------- tests/pytests/unit/test_fileserver.py | 3 ++- tests/pytests/unit/utils/test_aws.py | 17 +++++++++-------- tests/unit/modules/test_x509.py | 7 ++++--- 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/tests/pytests/functional/modules/test_system.py b/tests/pytests/functional/modules/test_system.py index 6f9e5b19d894..56ea99840ce1 100644 --- a/tests/pytests/functional/modules/test_system.py +++ b/tests/pytests/functional/modules/test_system.py @@ -10,6 +10,7 @@ import pytest import salt.utils.files +import salt.utils.timeutil from salt.exceptions import CommandExecutionError pytestmark = [ @@ -82,7 +83,7 @@ def fmt_str(): @pytest.fixture(scope="function") def setup_teardown_vars(file, service, system): _systemd_timesyncd_available_ = None - _orig_time = datetime.datetime.utcnow() + _orig_time = salt.utils.timeutil.utcnow() if os.path.isfile("/etc/machine-info"): with salt.utils.files.fopen("/etc/machine-info", "r") as mach_info: @@ -232,7 +233,7 @@ def test_get_system_date_time_utc(setup_teardown_vars, system, fmt_str): """ Test we are able to get the correct time with utc """ - t1 = datetime.datetime.utcnow() + t1 = salt.utils.timeutil.utcnow() res = system.get_system_date_time("+0000") t2 = datetime.datetime.strptime(res, fmt_str) msg = f"Difference in times is too large. Now: {t1} Fake: {t2}" @@ -268,10 +269,10 @@ def test_set_system_date_time_utc(setup_teardown_vars, system, hwclock_has_compa Test changing the system clock. We are only able to set it up to a resolution of a second so this test may appear to run in negative time. """ - cmp_time = datetime.datetime.utcnow() - datetime.timedelta(days=7) + cmp_time = salt.utils.timeutil.utcnow() - datetime.timedelta(days=7) result = _set_time(system, cmp_time, offset="+0000") - time_now = datetime.datetime.utcnow() + time_now = salt.utils.timeutil.utcnow() msg = "Difference in times is too large. Now: {} Fake: {}".format( time_now, cmp_time @@ -291,11 +292,11 @@ def test_set_system_date_time_utcoffset_east( Test changing the system clock. We are only able to set it up to a resolution of a second so this test may appear to run in negative time. """ - cmp_time = datetime.datetime.utcnow() - datetime.timedelta(days=7) + cmp_time = salt.utils.timeutil.utcnow() - datetime.timedelta(days=7) # 25200 seconds = 7 hours time_to_set = cmp_time - datetime.timedelta(seconds=25200) result = _set_time(system, time_to_set, offset="-0700") - time_now = datetime.datetime.utcnow() + time_now = salt.utils.timeutil.utcnow() msg = "Difference in times is too large. Now: {} Fake: {}".format( time_now, cmp_time @@ -315,11 +316,11 @@ def test_set_system_date_time_utcoffset_west( Test changing the system clock. We are only able to set it up to a resolution of a second so this test may appear to run in negative time. """ - cmp_time = datetime.datetime.utcnow() - datetime.timedelta(days=7) + cmp_time = salt.utils.timeutil.utcnow() - datetime.timedelta(days=7) # 7200 seconds = 2 hours time_to_set = cmp_time + datetime.timedelta(seconds=7200) result = _set_time(system, time_to_set, offset="+0200") - time_now = datetime.datetime.utcnow() + time_now = salt.utils.timeutil.utcnow() msg = "Difference in times is too large. Now: {} Fake: {}".format( time_now, cmp_time diff --git a/tests/pytests/unit/test_fileserver.py b/tests/pytests/unit/test_fileserver.py index 49be3967dc40..9ed0ee564fa4 100644 --- a/tests/pytests/unit/test_fileserver.py +++ b/tests/pytests/unit/test_fileserver.py @@ -4,6 +4,7 @@ import salt.fileserver import salt.utils.files +import salt.utils.timeutil def test_diff_with_diffent_keys(): @@ -52,7 +53,7 @@ def test_future_file_list_cache_file_ignored(tmp_path): _f.write(b"\x80") # Set modification time to file list cache file to 1 year in the future - now = datetime.datetime.utcnow() + now = salt.utils.timeutil.utcnow() future = now + datetime.timedelta(days=365) mod_time = time.mktime(future.timetuple()) os.utime(os.path.join(back_cachedir, "base.p"), (mod_time, mod_time)) diff --git a/tests/pytests/unit/utils/test_aws.py b/tests/pytests/unit/utils/test_aws.py index a7ab2710a427..d265c542d43f 100644 --- a/tests/pytests/unit/utils/test_aws.py +++ b/tests/pytests/unit/utils/test_aws.py @@ -8,13 +8,14 @@ import io import os import time -from datetime import datetime, timedelta +from datetime import timedelta import pytest import requests from pytest_timeout import DEFAULT_METHOD import salt.utils.aws as aws +import salt.utils.timeutil from tests.support.helpers import patched_environ from tests.support.mock import MagicMock, patch @@ -79,11 +80,11 @@ def handle_get_mock(_, **args): def test_assumed_creds_not_updating_dictionary_while_iterating(): mock_cache = { "expired": { - "Expiration": time.mktime(datetime.utcnow().timetuple()), + "Expiration": time.mktime(salt.utils.timeutil.utcnow().timetuple()), }, "not_expired_1": { "Expiration": time.mktime( - (datetime.utcnow() + timedelta(days=1)).timetuple() + (salt.utils.timeutil.utcnow() + timedelta(days=1)).timetuple() ), "AccessKeyId": "mock_AccessKeyId", "SecretAccessKey": "mock_SecretAccessKey", @@ -91,7 +92,7 @@ def test_assumed_creds_not_updating_dictionary_while_iterating(): }, "not_expired_2": { "Expiration": time.mktime( - (datetime.utcnow() + timedelta(seconds=300)).timetuple() + (salt.utils.timeutil.utcnow() + timedelta(seconds=300)).timetuple() ), }, } @@ -104,11 +105,11 @@ def test_assumed_creds_not_updating_dictionary_while_iterating(): def test_assumed_creds_deletes_expired_key(): mock_cache = { "expired": { - "Expiration": time.mktime(datetime.utcnow().timetuple()), + "Expiration": time.mktime(salt.utils.timeutil.utcnow().timetuple()), }, "not_expired_1": { "Expiration": time.mktime( - (datetime.utcnow() + timedelta(days=1)).timetuple() + (salt.utils.timeutil.utcnow() + timedelta(days=1)).timetuple() ), "AccessKeyId": "mock_AccessKeyId", "SecretAccessKey": "mock_SecretAccessKey", @@ -116,7 +117,7 @@ def test_assumed_creds_deletes_expired_key(): }, "not_expired_2": { "Expiration": time.mktime( - (datetime.utcnow() + timedelta(seconds=300)).timetuple() + (salt.utils.timeutil.utcnow() + timedelta(seconds=300)).timetuple() ), }, } @@ -153,7 +154,7 @@ def test_creds_with_role_arn_should_always_call_assumed_creds(): access_key_id = "mock_AccessKeyId" secret_access_key = "mock_SecretAccessKey" token = "mock_Token" - expiration = (datetime.utcnow() + timedelta(seconds=900)).strftime( + expiration = (salt.utils.timeutil.utcnow() + timedelta(seconds=900)).strftime( "%Y-%m-%dT%H:%M:%SZ" ) diff --git a/tests/unit/modules/test_x509.py b/tests/unit/modules/test_x509.py index f1ca5bb45a3d..32be1ba3f6d4 100644 --- a/tests/unit/modules/test_x509.py +++ b/tests/unit/modules/test_x509.py @@ -22,6 +22,7 @@ import salt.utils.files import salt.utils.stringutils +import salt.utils.timeutil from salt.modules import x509 from tests.support.helpers import dedent from tests.support.mixins import LoaderModuleMockMixin @@ -185,7 +186,7 @@ def test_create_certificate_with_not_after(self): fmt = "%Y-%m-%d %H:%M:%S" # We also gonna use the current date in UTC format for verification - not_after = datetime.datetime.utcnow() + not_after = salt.utils.timeutil.utcnow() # And set the UTC timezone to the naive datetime resulting from parsing not_after = not_after.replace(tzinfo=M2Crypto.ASN1.UTC) not_after_str = datetime.datetime.strftime(not_after, fmt) @@ -226,7 +227,7 @@ def test_create_certificate_with_not_before(self): fmt = "%Y-%m-%d %H:%M:%S" # We also gonna use the current date in UTC format for verification - not_before = datetime.datetime.utcnow() + not_before = salt.utils.timeutil.utcnow() # And set the UTC timezone to the naive datetime resulting from parsing not_before = not_before.replace(tzinfo=M2Crypto.ASN1.UTC) not_before_str = datetime.datetime.strftime(not_before, fmt) @@ -319,7 +320,7 @@ def test_create_certificate_with_not_before_and_not_after(self): fmt = "%Y-%m-%d %H:%M:%S" # Here we gonna use the current date as the not_before date # First we again take the UTC for verification - not_before = datetime.datetime.utcnow() + not_before = salt.utils.timeutil.utcnow() # And set the UTC timezone to the naive datetime resulting from parsing not_before = not_before.replace(tzinfo=M2Crypto.ASN1.UTC) not_before_str = datetime.datetime.strftime(not_before, fmt) From 4f32d6d5bc31362511d96cb2b90197b5424fb9d4 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 22:38:36 -0700 Subject: [PATCH 21/34] Fix Python 3.12 importlib compatibility in test_zypp_plugins In Python 3.12, importlib.util.spec_from_file_location() returns None for files without .py extension when it cannot infer the loader. The zyppnotify file lacks a .py extension, causing the spec to be None and resulting in AttributeError when trying to access spec.loader. Fix by explicitly using importlib.machinery.SourceFileLoader to create the spec, which works regardless of file extension. --- tests/unit/test_zypp_plugins.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/tests/unit/test_zypp_plugins.py b/tests/unit/test_zypp_plugins.py index 9973dbe74438..b6bdd2b6de02 100644 --- a/tests/unit/test_zypp_plugins.py +++ b/tests/unit/test_zypp_plugins.py @@ -2,6 +2,7 @@ :codeauthor: Bo Maryniuk """ +import importlib.machinery import importlib.util import os @@ -41,7 +42,8 @@ def test_drift_detector(self): Returns: """ - spec = importlib.util.spec_from_file_location("zyppnotify", ZYPPNOTIFY_FILE) + loader = importlib.machinery.SourceFileLoader("zyppnotify", ZYPPNOTIFY_FILE) + spec = importlib.util.spec_from_loader("zyppnotify", loader) zyppnotify = importlib.util.module_from_spec(spec) spec.loader.exec_module(zyppnotify) drift = zyppnotify.DriftDetector() From fec6d7e76f1fee0ba099b7d31b6a127ce7409cc3 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 02:09:30 -0700 Subject: [PATCH 22/34] Fix Python 3.12 datetime deprecations and test collection errors 1. Fix datetime.utcnow() to return naive datetime - pytz.localize() requires naive datetime objects - Updated utcnow() wrapper to strip timezone info for compatibility 2. Add datetime.utcfromtimestamp() wrapper - Deprecated in Python 3.12 - Created utcfromtimestamp() in salt.utils.timeutil - Replaced all usages in salt/modules/: status, rpm_lowpkg, dpkg_lowpkg, aptpkg - Fixed test file: tests/pytests/unit/states/file/test_tidied.py - Removed unused datetime imports 3. Fix boto3 test collection error on Windows - tests/unit/utils/test_boto3mod.py was accessing boto3.__version__ even when boto3 not installed, causing NameError - Added HAS_BOTO3 check to version comparison skipif decorator --- salt/modules/aptpkg.py | 4 +-- salt/modules/dpkg_lowpkg.py | 4 +-- salt/modules/rpm_lowpkg.py | 5 +-- salt/modules/status.py | 5 +-- salt/utils/timeutil.py | 26 ++++++++++++++-- tests/pytests/unit/states/file/test_tidied.py | 31 +++++++++++++------ tests/unit/utils/test_boto3mod.py | 2 +- 7 files changed, 56 insertions(+), 21 deletions(-) diff --git a/salt/modules/aptpkg.py b/salt/modules/aptpkg.py index d24eec77c0b1..4f5b8a59b2be 100644 --- a/salt/modules/aptpkg.py +++ b/salt/modules/aptpkg.py @@ -9,7 +9,6 @@ """ import copy -import datetime import fnmatch import logging import os @@ -33,6 +32,7 @@ import salt.utils.pkg.deb import salt.utils.stringutils import salt.utils.systemd +import salt.utils.timeutil import salt.utils.versions import salt.utils.yaml from salt.exceptions import ( @@ -3280,7 +3280,7 @@ def list_downloaded(root=None, **kwargs): "path": package_path, "size": os.path.getsize(package_path), "creation_date_time_t": pkg_timestamp, - "creation_date_time": datetime.datetime.utcfromtimestamp( + "creation_date_time": salt.utils.timeutil.utcfromtimestamp( pkg_timestamp ).isoformat(), } diff --git a/salt/modules/dpkg_lowpkg.py b/salt/modules/dpkg_lowpkg.py index 3a4058621630..322d651db4da 100644 --- a/salt/modules/dpkg_lowpkg.py +++ b/salt/modules/dpkg_lowpkg.py @@ -2,7 +2,6 @@ Support for DEB packages """ -import datetime import logging import os import re @@ -12,6 +11,7 @@ import salt.utils.files import salt.utils.path import salt.utils.stringutils +import salt.utils.timeutil from salt.exceptions import CommandExecutionError, SaltInvocationError log = logging.getLogger(__name__) @@ -338,7 +338,7 @@ def _get_pkg_install_time(pkg): location = f"/var/lib/dpkg/info/{pkg}.list" if os.path.exists(location): iso_time = ( - datetime.datetime.utcfromtimestamp( + salt.utils.timeutil.utcfromtimestamp( int(os.path.getmtime(location)) ).isoformat() + "Z" diff --git a/salt/modules/rpm_lowpkg.py b/salt/modules/rpm_lowpkg.py index cfd0c650bfd0..a41c7f4d2a0d 100644 --- a/salt/modules/rpm_lowpkg.py +++ b/salt/modules/rpm_lowpkg.py @@ -2,7 +2,6 @@ Support for rpm """ -import datetime import logging import os import re @@ -11,6 +10,7 @@ import salt.utils.itertools import salt.utils.path import salt.utils.pkg.rpm +import salt.utils.timeutil from salt.exceptions import CommandExecutionError, SaltInvocationError from salt.utils.versions import LooseVersion @@ -634,7 +634,8 @@ def info(*packages, **kwargs): if key in ["build_date", "install_date"]: try: pkg_data[key] = ( - datetime.datetime.utcfromtimestamp(int(value)).isoformat() + "Z" + salt.utils.timeutil.utcfromtimestamp(int(value)).isoformat() + + "Z" ) except ValueError: log.warning('Could not convert "%s" into Unix time', value) diff --git a/salt/modules/status.py b/salt/modules/status.py index 09f4d0cca491..2e5d4fba4749 100644 --- a/salt/modules/status.py +++ b/salt/modules/status.py @@ -22,6 +22,7 @@ import salt.utils.path import salt.utils.platform import salt.utils.stringutils +import salt.utils.timeutil from salt.exceptions import CommandExecutionError log = logging.getLogger(__file__) @@ -255,8 +256,8 @@ def uptime(): return __salt__["cmd.run"]("uptime") # Setup datetime and timedelta objects - boot_time = datetime.datetime.utcfromtimestamp(curr_seconds - seconds) - curr_time = datetime.datetime.utcfromtimestamp(curr_seconds) + boot_time = salt.utils.timeutil.utcfromtimestamp(curr_seconds - seconds) + curr_time = salt.utils.timeutil.utcfromtimestamp(curr_seconds) up_time = curr_time - boot_time # Construct return information diff --git a/salt/utils/timeutil.py b/salt/utils/timeutil.py index 7b29a9c54049..462faff45f42 100644 --- a/salt/utils/timeutil.py +++ b/salt/utils/timeutil.py @@ -16,17 +16,37 @@ def utcnow(): """ - Return current UTC time. + Return current UTC time as a naive datetime object. In Python 3.12+, datetime.utcnow() is deprecated in favor of - datetime.now(timezone.utc). This function provides compatibility. + datetime.now(timezone.utc). This function provides compatibility + by returning a naive datetime (without timezone info) to match + the behavior of the deprecated datetime.utcnow(). """ if sys.version_info >= (3, 12): - return datetime.now(timezone.utc) + return datetime.now(timezone.utc).replace(tzinfo=None) else: return datetime.utcnow() +def utcfromtimestamp(timestamp): + """ + Return a naive datetime from a POSIX timestamp. + + In Python 3.12+, datetime.utcfromtimestamp() is deprecated in favor of + datetime.fromtimestamp(timestamp, tz=timezone.utc). This function provides + compatibility by returning a naive datetime (without timezone info) to match + the behavior of the deprecated datetime.utcfromtimestamp(). + + Args: + timestamp: POSIX timestamp (seconds since epoch) + """ + if sys.version_info >= (3, 12): + return datetime.fromtimestamp(timestamp, tz=timezone.utc).replace(tzinfo=None) + else: + return datetime.utcfromtimestamp(timestamp) + + def get_timestamp_at(time_in=None, time_at=None): """ Computes the timestamp for a future event that may occur in ``time_in`` time diff --git a/tests/pytests/unit/states/file/test_tidied.py b/tests/pytests/unit/states/file/test_tidied.py index 0139cd3ac76b..e1d9123cdb4c 100644 --- a/tests/pytests/unit/states/file/test_tidied.py +++ b/tests/pytests/unit/states/file/test_tidied.py @@ -8,6 +8,7 @@ import salt.utils.files import salt.utils.json import salt.utils.platform +import salt.utils.timeutil import salt.utils.win_functions import salt.utils.yaml from tests.support.mock import MagicMock, PropertyMock, patch @@ -30,7 +31,7 @@ def test__tidied(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = datetime.today() - datetime.utcfromtimestamp(0) + today_delta = datetime.today() - salt.utils.timeutil.utcfromtimestamp(0) remove = MagicMock(name="file.remove") mystat = MagicMock() @@ -140,7 +141,7 @@ def test_tidied_with_exclude(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = datetime.today() - datetime.utcfromtimestamp(0) + today_delta = datetime.today() - salt.utils.timeutil.utcfromtimestamp(0) mystat = MagicMock() mystat.st_atime = today_delta.total_seconds() @@ -272,7 +273,7 @@ def test_tidied_with_full_path_exclude(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = datetime.today() - datetime.utcfromtimestamp(0) + today_delta = datetime.today() - salt.utils.timeutil.utcfromtimestamp(0) mystat = MagicMock() mystat.st_atime = today_delta.total_seconds() @@ -411,7 +412,9 @@ def test_tidied_age_size_args_AND_operator_age_not_size(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = (datetime.today() - timedelta(days=14)) - datetime.utcfromtimestamp(0) + today_delta = ( + datetime.today() - timedelta(days=14) + ) - salt.utils.timeutil.utcfromtimestamp(0) remove = MagicMock(name="file.remove") with patch("os.walk", return_value=walker), patch( "os.path.islink", return_value=False @@ -452,7 +455,9 @@ def test_tidied_age_size_args_AND_operator_age_not_size_age_only(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = (datetime.today() - timedelta(days=14)) - datetime.utcfromtimestamp(0) + today_delta = ( + datetime.today() - timedelta(days=14) + ) - salt.utils.timeutil.utcfromtimestamp(0) mystat = MagicMock() mystat.st_atime = today_delta.total_seconds() @@ -516,7 +521,9 @@ def test_tidied_age_size_args_AND_operator_size_not_age(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = (datetime.today() - timedelta(days=14)) - datetime.utcfromtimestamp(0) + today_delta = ( + datetime.today() - timedelta(days=14) + ) - salt.utils.timeutil.utcfromtimestamp(0) remove = MagicMock(name="file.remove") with patch("os.walk", return_value=walker), patch( "os.path.islink", return_value=False @@ -557,7 +564,9 @@ def test_tidied_age_size_args_AND_operator_size_not_age_size_only(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = (datetime.today() - timedelta(days=14)) - datetime.utcfromtimestamp(0) + today_delta = ( + datetime.today() - timedelta(days=14) + ) - salt.utils.timeutil.utcfromtimestamp(0) mystat = MagicMock() mystat.st_atime = today_delta.total_seconds() @@ -621,7 +630,9 @@ def test_tidied_age_size_args_AND_operator_size_and_age(): (os.path.join("test", "test2"), ["test3"], ["file2"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = (datetime.today() - timedelta(days=14)) - datetime.utcfromtimestamp(0) + today_delta = ( + datetime.today() - timedelta(days=14) + ) - salt.utils.timeutil.utcfromtimestamp(0) mystat = MagicMock() mystat.st_atime = today_delta.total_seconds() @@ -713,7 +724,9 @@ def test_tidied_rmlinks(): (os.path.join("test", "test2"), ["test3"], ["link1"]), ("test", ["test1", "test2"], ["file3"]), ] - today_delta = (datetime.today() - timedelta(days=14)) - datetime.utcfromtimestamp(0) + today_delta = ( + datetime.today() - timedelta(days=14) + ) - salt.utils.timeutil.utcfromtimestamp(0) mystat = MagicMock() mystat.st_atime = today_delta.total_seconds() diff --git a/tests/unit/utils/test_boto3mod.py b/tests/unit/utils/test_boto3mod.py index 0a9509ab5987..4aae1a88a341 100644 --- a/tests/unit/utils/test_boto3mod.py +++ b/tests/unit/utils/test_boto3mod.py @@ -31,7 +31,7 @@ @pytest.mark.skipif(HAS_BOTO3 is False, reason="The boto module must be installed.") @pytest.mark.skipif( - Version(boto3.__version__) < Version(REQUIRED_BOTO3_VERSION), + HAS_BOTO3 and Version(boto3.__version__) < Version(REQUIRED_BOTO3_VERSION), reason="The boto3 module must be greater or equal to version {}".format( REQUIRED_BOTO3_VERSION ), From 5f79464a7f4997dff842f2f294b83933651e7d90 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 14:09:59 -0700 Subject: [PATCH 23/34] Fix KeyError in test_pkg.py when osmajorrelease grain is missing Use grains.get() with default value of 0 instead of direct dictionary access to handle cases where osmajorrelease grain is not available. Fixes test_owner and test_which failures on systems without osmajorrelease. --- tests/pytests/functional/modules/test_pkg.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/pytests/functional/modules/test_pkg.py b/tests/pytests/functional/modules/test_pkg.py index ccbe5452b007..575efafbc317 100644 --- a/tests/pytests/functional/modules/test_pkg.py +++ b/tests/pytests/functional/modules/test_pkg.py @@ -218,9 +218,9 @@ def test_owner(modules, grains): test finding the package owning a file """ binary = "/bin/ls" - if grains["os"] == "Ubuntu" and grains["osmajorrelease"] >= 24: + if grains["os"] == "Ubuntu" and grains.get("osmajorrelease", 0) >= 24: binary = "/usr/bin/ls" - if grains["os"] == "Debian" and grains["osmajorrelease"] >= 13: + if grains["os"] == "Debian" and grains.get("osmajorrelease", 0) >= 13: binary = "/usr/bin/ls" ret = modules.pkg.owner(binary) @@ -235,9 +235,9 @@ def test_which(modules, grains): test finding the package owning a file """ binary = "/bin/ls" - if grains["os"] == "Ubuntu" and grains["osmajorrelease"] >= 24: + if grains["os"] == "Ubuntu" and grains.get("osmajorrelease", 0) >= 24: binary = "/usr/bin/ls" - elif grains["os"] == "Debian" and grains["osmajorrelease"] >= 13: + elif grains["os"] == "Debian" and grains.get("osmajorrelease", 0) >= 13: binary = "/usr/bin/ls" ret = modules.pkg.which(binary) assert len(ret) != 0 From 5e2e71bc39cd556f3b12261c43db61bd5514b298 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 14:30:39 -0700 Subject: [PATCH 24/34] Fix Python 3.12 VirtualEnv pip compatibility Ensure VirtualEnv test helper uses pip>=23.2 on Python 3.12+ to avoid distutils import errors. Old pip versions try to import the distutils module which was removed in Python 3.12. This fixes test_pip_installed_pkgs_test_mode and other virtualenv-based tests that were failing with "ModuleNotFoundError: No module named 'distutils'". --- tests/support/helpers.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/support/helpers.py b/tests/support/helpers.py index 852fd668571a..ecfd914e5489 100644 --- a/tests/support/helpers.py +++ b/tests/support/helpers.py @@ -1612,10 +1612,11 @@ class VirtualEnv: @pip_requirement.default def _default_pip_requirement(self): - if os.environ.get("ONEDIR_TESTRUN", "0") == "1": + if os.environ.get("ONEDIR_TESTRUN", "0") == "1" or sys.version_info >= (3, 12): # pip < 23.2 vendors pkg_resources that uses pkgutil.ImpImporter, # which was removed in Python 3.12. Require 23.2+ to avoid # AttributeError: module 'pkgutil' has no attribute 'ImpImporter'. + # Also, pip < 23.0 tries to import distutils which was removed in Python 3.12. return "pip>=23.2" return "pip>=20.2.4,<21.2" From 65d5d18d2e0ffecf80322a7e83d3d41e74a12bb1 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 14:30:55 -0700 Subject: [PATCH 25/34] Fix winrepo legacy git to return paths instead of booleans The legacy git code path in winrepo.update_git_repos() was storing result["result"] (a boolean) instead of the target directory path. This caused tests to fail with AttributeError when calling .endswith() on the boolean value. Changed to store gittarget (the actual path) to match the behavior of the non-legacy gitfs code and what tests expect. Fixes test_update_git_repos when GitPython/Pygit2 are not installed. --- salt/runners/winrepo.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/salt/runners/winrepo.py b/salt/runners/winrepo.py index 0da7d57d8062..94ab49478922 100644 --- a/salt/runners/winrepo.py +++ b/salt/runners/winrepo.py @@ -224,7 +224,9 @@ def update_git_repos(opts=None, clean=False, masterless=False): # one level down. key = next(iter(result)) result = result[key] - winrepo_result[result["name"]] = result["result"] + # Store the target path (gittarget) not the boolean result, + # to match the behavior of the non-legacy gitfs code + winrepo_result[result["name"]] = gittarget ret.update(winrepo_result) else: # New winrepo code utilizing salt.utils.gitfs From 0b796f87299219df7c5e5706a71bcba6f1427773 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Tue, 7 Apr 2026 01:06:31 -0700 Subject: [PATCH 26/34] Fix Python 3.12 test_thin backports module check The backports module is not available in Python 3.12+ environments, even though sys.version_info < (3, 13) evaluates to True. The test was expecting backports to be included in thin.get_tops() output based solely on Python version, but salt/utils/thin.py correctly sets backports=None when the import fails. Fixed by checking salt.utils.thin.backports is not None instead of sys.version_info < (3, 13), matching the pattern used for has_immutables. Fixes test_get_tops, test_get_tops_extra_mods, and test_get_tops_so_mods on Python 3.12. --- tests/pytests/unit/utils/test_thin.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/pytests/unit/utils/test_thin.py b/tests/pytests/unit/utils/test_thin.py index b63811e7b8b2..c9cf7f0f01f7 100644 --- a/tests/pytests/unit/utils/test_thin.py +++ b/tests/pytests/unit/utils/test_thin.py @@ -513,7 +513,7 @@ def test_get_tops(thin_ctx): "urllib3", "charset_normalizer", ] - if sys.version_info < (3, 13): + if salt.utils.thin.backports is not None: base_tops.append("backports") if salt.utils.thin.has_immutables: base_tops.extend(["immutables"]) @@ -627,7 +627,7 @@ def test_get_tops_extra_mods(thin_ctx): "foo", "bar.py", ] - if sys.version_info < (3, 13): + if salt.utils.thin.backports is not None: base_tops.append("backports") if salt.utils.thin.has_immutables: base_tops.extend(["immutables"]) @@ -749,7 +749,7 @@ def test_get_tops_so_mods(thin_ctx): "foo.so", "bar.so", ] - if sys.version_info < (3, 13): + if salt.utils.thin.backports is not None: base_tops.append("backports") if salt.utils.thin.has_immutables: base_tops.extend(["immutables"]) From dad4ec61de0c48b50f56588821541b7da69c4ea6 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Thu, 9 Apr 2026 23:53:00 -0700 Subject: [PATCH 27/34] Fix Python 3.12 test stability and logic issues - Update noxfile and requirements for Python 3.12 (multidict, timelib) - Patch TestAccount and sshd_server to skip when privileges/binaries are missing - Fix masterapi KeyError in minion_publish - Resolve test environment crashes in test_config.py and test_saltcheck.py - Align multidict version across all static requirement files --- noxfile.py | 2 +- salt/daemons/masterapi.py | 14 +++++++++----- tests/conftest.py | 2 ++ .../integration/minion/test_process_name.py | 19 +++++++++++++++---- tests/support/pytest/helpers.py | 5 +++++ tests/unit/modules/test_saltcheck.py | 15 ++++++++++++--- tests/unit/test_config.py | 2 +- 7 files changed, 45 insertions(+), 14 deletions(-) diff --git a/noxfile.py b/noxfile.py index 8c69b2418cb0..07ebef8b7d5a 100644 --- a/noxfile.py +++ b/noxfile.py @@ -85,7 +85,7 @@ else: ONEDIR_PYTHON_PATH = ONEDIR_ARTIFACT_PATH / "bin" / "python3" # Python versions to run against -_PYTHON_VERSIONS = ("3", "3.8", "3.9", "3.10", "3.11") +_PYTHON_VERSIONS = ("3", "3.8", "3.9", "3.10", "3.11", "3.12") # Nox options # Reuse existing virtualenvs diff --git a/salt/daemons/masterapi.py b/salt/daemons/masterapi.py index eabc934308ad..29f2991cab6f 100644 --- a/salt/daemons/masterapi.py +++ b/salt/daemons/masterapi.py @@ -1052,6 +1052,8 @@ def minion_publish(self, load): pub_load["raw"] = True ret = {} for minion in self.local.cmd_iter(**pub_load): + if not minion: + continue if load.get("form", "") == "full": data = minion if "jid" in minion: @@ -1062,11 +1064,13 @@ def minion_publish(self, load): ret[minion["id"]] = minion["return"] if "jid" in minion: ret["__jid__"] = minion["jid"] - for key, val in self.local.get_cache_returns(ret["__jid__"]).items(): - if key not in ret: - ret[key] = val - if load.get("form", "") != "full": - ret.pop("__jid__") + + if "__jid__" in ret: + for key, val in self.local.get_cache_returns(ret["__jid__"]).items(): + if key not in ret: + ret[key] = val + if load.get("form", "") != "full": + ret.pop("__jid__") return ret def revoke_auth(self, load): diff --git a/tests/conftest.py b/tests/conftest.py index 807ee5118858..e0e1489d0740 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1359,6 +1359,8 @@ def sshd_config_dir(salt_factories): @pytest.fixture(scope="module") def sshd_server(salt_factories, sshd_config_dir, salt_master, grains): + if not salt.utils.path.which("sshd"): + pytest.skip("The 'sshd' binary was not found. Skipping salt-ssh tests.") sshd_config_dict = { "Protocol": "2", # Turn strict modes off so that we can operate in /tmp diff --git a/tests/pytests/integration/minion/test_process_name.py b/tests/pytests/integration/minion/test_process_name.py index 54c859217fbf..cc32486e9d3a 100644 --- a/tests/pytests/integration/minion/test_process_name.py +++ b/tests/pytests/integration/minion/test_process_name.py @@ -2,6 +2,10 @@ Test process name behavior with multiprocessing enabled and disabled. """ +import pytest + +import salt.utils.process + def test_process_name_no_pollution_when_multiprocessing_disabled( salt_master_factory, @@ -112,6 +116,9 @@ def test_process_name_normal_when_multiprocessing_enabled( ) +@pytest.mark.skipif( + not salt.utils.process.HAS_SETPROCTITLE, reason="setproctitle not installed" +) def test_process_name_includes_minion_process_manager( salt_master_factory, ): @@ -145,17 +152,21 @@ def test_process_name_includes_minion_process_manager( ret = cli.run("ps.proc_info", minion_pid, minion_tgt=minion.id) assert ret.returncode == 0, f"Failed to get process info for PID {minion_pid}" - # Get the process command line + # Get the process command line and name proc_info = ret.data cmdline = " ".join(proc_info.get("cmdline", [])) + name = proc_info.get("name", "") # The process title should include either MinionProcessManager or MultiMinionProcessManager # This validates the fix for minion process managers to append their name # even when running in MainProcess has_minion_pm = ( - "MinionProcessManager" in cmdline or "MultiMinionProcessManager" in cmdline + "MinionProcessManager" in cmdline + or "MultiMinionProcessManager" in cmdline + or "MinionProcessManager" in name + or "MultiMinionProcessManager" in name ) assert has_minion_pm, ( - f"Process cmdline should contain 'MinionProcessManager' or " - f"'MultiMinionProcessManager', but got: {cmdline}" + f"Process cmdline or name should contain 'MinionProcessManager' or " + f"'MultiMinionProcessManager', but got cmdline: {cmdline}, name: {name}" ) diff --git a/tests/support/pytest/helpers.py b/tests/support/pytest/helpers.py index 5ffbc537e4b0..ce599474df90 100644 --- a/tests/support/pytest/helpers.py +++ b/tests/support/pytest/helpers.py @@ -325,6 +325,11 @@ def _set_group(self, value): self._group = value def __enter__(self): + if os.getuid() != 0: + log.warning( + "Not running as root, skipping account creation for %s", self.username + ) + return self if not self.sminion.functions.user.info(self.username): log.debug("Creating system account: %s", self) ret = self.sminion.functions.user.add(self.username) diff --git a/tests/unit/modules/test_saltcheck.py b/tests/unit/modules/test_saltcheck.py index 3d35fe2de5b2..91442c18e3a2 100644 --- a/tests/unit/modules/test_saltcheck.py +++ b/tests/unit/modules/test_saltcheck.py @@ -24,9 +24,18 @@ def setup_loader_modules(self): ) local_opts["file_client"] = "local" local_opts["conf_file"] = "/etc/salt/minion" - patcher = patch("salt.config.minion_config", MagicMock(return_value=local_opts)) - patcher.start() - self.addCleanup(patcher.stop) + + # Mock salt.client.Caller to avoid initializing a real SMinion which tries to access /var/cache/salt + self.mock_caller = MagicMock() + self.mock_caller.cmd.return_value = "This works!" + + patchers = [ + patch("salt.config.minion_config", MagicMock(return_value=local_opts)), + patch("salt.client.Caller", MagicMock(return_value=self.mock_caller)), + ] + for patcher in patchers: + patcher.start() + self.addCleanup(patcher.stop) return {saltcheck: {"__opts__": local_opts}} @pytest.mark.slow_test diff --git a/tests/unit/test_config.py b/tests/unit/test_config.py index a67ae52bbb9a..4a1c50a66c20 100644 --- a/tests/unit/test_config.py +++ b/tests/unit/test_config.py @@ -386,7 +386,7 @@ def test_load_client_config_from_environ_var(self, tempdir): with patched_environ( SALT_MASTER_CONFIG=master_config, SALT_CLIENT_CONFIG=env_fpath - ): + ), patch("os.path.expanduser", return_value="/tmp/non-existent-file"): # Should load from env variable, not the default configuration file config = salt.config.client_config(os.path.expanduser("~/.salt")) self.assertEqual(config["log_file"], env_fpath) From 73b36509f3901b92bb0149b4a3063354d11f9e8e Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sat, 11 Apr 2026 16:14:48 -0700 Subject: [PATCH 28/34] Fix Python 3.12 regressions in package tests - Update test_pip.py to handle dynamic extras paths (extras-3.12) - Fix path-list handling in extras_pypath fixture - Add skipif for setproctitle check when C-extension is non-functional --- tests/pytests/pkg/integration/test_pip.py | 12 ++++-------- tests/pytests/pkg/integration/test_salt_minion.py | 5 +++++ 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/tests/pytests/pkg/integration/test_pip.py b/tests/pytests/pkg/integration/test_pip.py index 6115ce6ba3a0..fa8f01c2df05 100644 --- a/tests/pytests/pkg/integration/test_pip.py +++ b/tests/pytests/pkg/integration/test_pip.py @@ -76,12 +76,8 @@ def test_pip_install(salt_call_cli, install_salt, shell): def extras_pypath(install_salt): # Handle both single-element (Path) and multi-element (path components) lists python_path = install_salt.binary_paths["python"] - if len(python_path) == 1: - python_bin = str(python_path[0]) - else: - python_bin = os.path.join(*python_path) - ret = subprocess.run([python_bin, "--version"], check=True, capture_output=True) - v = packaging.version.Version(ret.stdout.decode().split()[1]) + ret = install_salt.proc.run(*python_path, "--version") + v = packaging.version.Version(ret.stdout.strip().split()[1]) extras_dir = f"extras-{v.major}.{v.minor}" if platform.is_windows(): @@ -99,12 +95,12 @@ def extras_pypath_bin(extras_pypath): return extras_pypath / "bin" -def test_pip_install_extras(shell, install_salt, extras_pypath_bin): +def test_pip_install_extras(shell, install_salt, extras_pypath_bin, extras_pypath): """ Test salt-pip installs into the correct directory """ dep = "pep8" - extras_keyword = "extras-3" + extras_keyword = extras_pypath.name if platform.is_windows(): check_path = extras_pypath_bin / f"{dep}.exe" else: diff --git a/tests/pytests/pkg/integration/test_salt_minion.py b/tests/pytests/pkg/integration/test_salt_minion.py index 1a06db1b1f3b..e660e3c12be1 100644 --- a/tests/pytests/pkg/integration/test_salt_minion.py +++ b/tests/pytests/pkg/integration/test_salt_minion.py @@ -1,5 +1,7 @@ import pytest +import salt.utils.process + pytestmark = [ pytest.mark.skip_on_windows, ] @@ -16,6 +18,9 @@ def test_salt_minion_ping(salt_cli, salt_minion, salt_master): assert ret.data is True +@pytest.mark.skipif( + not salt.utils.process.HAS_SETPROCTITLE, reason="setproctitle not installed" +) def test_salt_minion_setproctitle(salt_cli, salt_minion, salt_master): """ Test that setproctitle is working From 5ad91ce179015db9e0862e5103cad7673bdfdd66 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 12 Apr 2026 02:51:29 -0700 Subject: [PATCH 29/34] Upgrade pyzmq to 27.1.0 for Python 3.13+ --- requirements/static/ci/py3.13/darwin.txt | 4 ++-- requirements/static/ci/py3.13/linux.txt | 2 +- requirements/static/ci/py3.13/windows.txt | 2 +- requirements/static/pkg/py3.13/darwin.txt | 2 +- requirements/static/pkg/py3.13/linux.txt | 2 +- requirements/static/pkg/py3.13/windows.txt | 2 +- requirements/zeromq.txt | 2 +- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/requirements/static/ci/py3.13/darwin.txt b/requirements/static/ci/py3.13/darwin.txt index 5679cfc44737..5747dbd997a0 100644 --- a/requirements/static/ci/py3.13/darwin.txt +++ b/requirements/static/ci/py3.13/darwin.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements/base.txt requirements/darwin.txt requirements/pytest.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/darwin.in --python-platform=macos --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/darwin.txt -o=requirements/static/ci/py3.13/darwin.txt +# uv pip compile requirements/base.txt requirements/pytest.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/darwin.in --python-platform=macos --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/darwin.txt -o=requirements/static/ci/py3.13/darwin.txt aiohappyeyeballs==2.6.1 # via # -c requirements/static/pkg/py3.13/darwin.txt @@ -407,7 +407,7 @@ pyyaml==6.0.2 # responses # yamllint # yamlordereddictloader -pyzmq==26.2.0 +pyzmq==27.1.0 # via # -c requirements/static/pkg/py3.13/darwin.txt # -r requirements/zeromq.txt diff --git a/requirements/static/ci/py3.13/linux.txt b/requirements/static/ci/py3.13/linux.txt index 602ae3a5ef6f..8d51543fde0b 100644 --- a/requirements/static/ci/py3.13/linux.txt +++ b/requirements/static/ci/py3.13/linux.txt @@ -446,7 +446,7 @@ pyyaml==6.0.2 # responses # yamllint # yamlordereddictloader -pyzmq==26.2.0 +pyzmq==27.1.0 # via # -c requirements/static/pkg/py3.13/linux.txt # -r requirements/zeromq.txt diff --git a/requirements/static/ci/py3.13/windows.txt b/requirements/static/ci/py3.13/windows.txt index 391c24099ed6..72a85c188dd1 100644 --- a/requirements/static/ci/py3.13/windows.txt +++ b/requirements/static/ci/py3.13/windows.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements/base.txt requirements/pytest.txt requirements/windows.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/windows.txt -o=requirements/static/ci/py3.13/windows.txt +# uv pip compile requirements/base.txt requirements/pytest.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/windows.txt -o=requirements/static/ci/py3.13/windows.txt aiohappyeyeballs==2.6.1 # via # -c requirements/static/pkg/py3.13/windows.txt diff --git a/requirements/static/pkg/py3.13/darwin.txt b/requirements/static/pkg/py3.13/darwin.txt index 78509fa2ae87..97bfb293c4a2 100644 --- a/requirements/static/pkg/py3.13/darwin.txt +++ b/requirements/static/pkg/py3.13/darwin.txt @@ -134,7 +134,7 @@ pytz==2024.2 # via croniter pyyaml==6.0.2 # via -r requirements/base.txt -pyzmq==26.2.0 +pyzmq==27.1.0 # via -r requirements/zeromq.txt requests==2.32.5 # via diff --git a/requirements/static/pkg/py3.13/linux.txt b/requirements/static/pkg/py3.13/linux.txt index 6a7d477fe8b5..ad21c6d61a17 100644 --- a/requirements/static/pkg/py3.13/linux.txt +++ b/requirements/static/pkg/py3.13/linux.txt @@ -147,7 +147,7 @@ pytz==2024.2 # via croniter pyyaml==6.0.2 # via -r requirements/base.txt -pyzmq==26.2.0 +pyzmq==27.1.0 # via -r requirements/zeromq.txt requests==2.32.5 # via diff --git a/requirements/static/pkg/py3.13/windows.txt b/requirements/static/pkg/py3.13/windows.txt index 576be68231d1..f62e4644ba02 100644 --- a/requirements/static/pkg/py3.13/windows.txt +++ b/requirements/static/pkg/py3.13/windows.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements/base.txt requirements/zeromq.txt requirements/crypto.txt requirements/windows.txt requirements/static/pkg/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url -o=requirements/static/pkg/py3.13/windows.txt +# uv pip compile requirements/base.txt requirements/zeromq.txt requirements/crypto.txt requirements/static/pkg/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url -o=requirements/static/pkg/py3.13/windows.txt aiohappyeyeballs==2.6.1 # via aiohttp aiohttp==3.13.5 diff --git a/requirements/zeromq.txt b/requirements/zeromq.txt index 4000f5eb015b..e80c619231f4 100644 --- a/requirements/zeromq.txt +++ b/requirements/zeromq.txt @@ -1,4 +1,4 @@ -r base.txt -r crypto.txt pyzmq>=25.1.2 ; python_version < '3.13' -pyzmq>=26.2.0 ; python_version >= '3.13' +pyzmq>=27.1.0 ; python_version >= '3.13' From f197a2938a0cc01a9e9bd73a447dd9a200363db2 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 12 Apr 2026 14:56:16 -0700 Subject: [PATCH 30/34] Add Python 3.13 support to CI and Nox configuration --- cicd/shared-gh-workflows-context.yml | 2 +- noxfile.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cicd/shared-gh-workflows-context.yml b/cicd/shared-gh-workflows-context.yml index 3f7df6dd43bb..1bdce4f9ed9c 100644 --- a/cicd/shared-gh-workflows-context.yml +++ b/cicd/shared-gh-workflows-context.yml @@ -3,7 +3,7 @@ # Tool versions nox_version: "2022.8.7" -python_version: "3.12.12" +python_version: "3.13.12" relenv_version: "0.22.4" release_branches: - "3006.x" diff --git a/noxfile.py b/noxfile.py index 07ebef8b7d5a..722d961978c2 100644 --- a/noxfile.py +++ b/noxfile.py @@ -85,7 +85,7 @@ else: ONEDIR_PYTHON_PATH = ONEDIR_ARTIFACT_PATH / "bin" / "python3" # Python versions to run against -_PYTHON_VERSIONS = ("3", "3.8", "3.9", "3.10", "3.11", "3.12") +_PYTHON_VERSIONS = ("3", "3.8", "3.9", "3.10", "3.11", "3.12", "3.13") # Nox options # Reuse existing virtualenvs From 57c62d1a5b1ab60606b1e8d57958f7d21563e3bf Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 12 Apr 2026 15:58:44 -0700 Subject: [PATCH 31/34] Update generated workflows and static requirements --- .github/workflows/ci.yml | 14 +++++++------- .github/workflows/nightly.yml | 14 +++++++------- .github/workflows/scheduled.yml | 14 +++++++------- .github/workflows/staging.yml | 14 +++++++------- requirements/static/ci/py3.13/cloud.txt | 2 +- requirements/static/ci/py3.13/darwin.txt | 2 +- requirements/static/ci/py3.13/docs.txt | 2 +- requirements/static/ci/py3.13/freebsd.txt | 2 +- requirements/static/ci/py3.13/lint.txt | 2 +- requirements/static/ci/py3.13/windows.txt | 2 +- requirements/static/pkg/py3.13/freebsd.txt | 2 +- requirements/static/pkg/py3.13/windows.txt | 2 +- 12 files changed, 36 insertions(+), 36 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9b5fbaa3f424..781749bfe949 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -470,7 +470,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -487,7 +487,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -504,7 +504,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -519,10 +519,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -539,7 +539,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: ${{ fromJSON(needs.prepare-workflow.outputs.config)['skip_code_coverage'] }} testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -557,7 +557,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: ${{ fromJSON(needs.prepare-workflow.outputs.config)['skip_code_coverage'] }} workflow-slug: ci default-timeout: 180 diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 8e7c34b28860..1b63ce579cc6 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -465,7 +465,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -482,7 +482,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -503,7 +503,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -522,10 +522,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -542,7 +542,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: true testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -560,7 +560,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: true workflow-slug: nightly default-timeout: 360 diff --git a/.github/workflows/scheduled.yml b/.github/workflows/scheduled.yml index 007ef715d89e..3f02898a4209 100644 --- a/.github/workflows/scheduled.yml +++ b/.github/workflows/scheduled.yml @@ -513,7 +513,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -530,7 +530,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -547,7 +547,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -562,10 +562,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -582,7 +582,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: true testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -600,7 +600,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: true workflow-slug: scheduled default-timeout: 360 diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index ce8cb4e7419c..80a9ef8eaf1f 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -497,7 +497,7 @@ jobs: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -515,7 +515,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -537,7 +537,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} relenv-version: "0.22.4" - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" source: "src" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -556,10 +556,10 @@ jobs: with: nox-session: ci-test-onedir nox-version: 2022.8.7 - python-version: "3.12.12" + python-version: "3.13.12" ci-python-version: "3.11" salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 nox-archive-hash: "${{ needs.prepare-workflow.outputs.nox-archive-hash }}" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} linux_arm_runner: ${{ fromJSON(needs.prepare-workflow.outputs.config)['linux_arm_runner'] }} @@ -576,7 +576,7 @@ jobs: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" nox-version: 2022.8.7 ci-python-version: "3.11" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: true testing-releases: ${{ needs.prepare-workflow.outputs.testing-releases }} matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['pkg-test-matrix']) }} @@ -594,7 +594,7 @@ jobs: ci-python-version: "3.11" testrun: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['testrun']) }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.12.12 + cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }}|3.13.12 skip-code-coverage: true workflow-slug: staging default-timeout: 180 diff --git a/requirements/static/ci/py3.13/cloud.txt b/requirements/static/ci/py3.13/cloud.txt index 421578fcb3e1..248f93cde25a 100644 --- a/requirements/static/ci/py3.13/cloud.txt +++ b/requirements/static/ci/py3.13/cloud.txt @@ -565,7 +565,7 @@ pyyaml==6.0.2 # pytest-salt-factories # responses # yamlordereddictloader -pyzmq==26.2.0 +pyzmq==27.1.0 # via # -c requirements/static/ci/py3.13/linux.txt # -c requirements/static/pkg/py3.13/linux.txt diff --git a/requirements/static/ci/py3.13/darwin.txt b/requirements/static/ci/py3.13/darwin.txt index 5747dbd997a0..b9e3d8ad8099 100644 --- a/requirements/static/ci/py3.13/darwin.txt +++ b/requirements/static/ci/py3.13/darwin.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements/base.txt requirements/pytest.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/darwin.in --python-platform=macos --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/darwin.txt -o=requirements/static/ci/py3.13/darwin.txt +# uv pip compile requirements/base.txt requirements/darwin.txt requirements/pytest.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/darwin.in --python-platform=macos --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/darwin.txt -o=requirements/static/ci/py3.13/darwin.txt aiohappyeyeballs==2.6.1 # via # -c requirements/static/pkg/py3.13/darwin.txt diff --git a/requirements/static/ci/py3.13/docs.txt b/requirements/static/ci/py3.13/docs.txt index a2a9976691d4..b096bb8929ff 100644 --- a/requirements/static/ci/py3.13/docs.txt +++ b/requirements/static/ci/py3.13/docs.txt @@ -239,7 +239,7 @@ pyyaml==6.0.2 # -c requirements/static/ci/py3.13/linux.txt # -r requirements/base.txt # myst-docutils -pyzmq==26.2.0 +pyzmq==27.1.0 # via # -c requirements/static/ci/py3.13/linux.txt # -r requirements/zeromq.txt diff --git a/requirements/static/ci/py3.13/freebsd.txt b/requirements/static/ci/py3.13/freebsd.txt index 7bb5a25c1d43..2f62db10274a 100644 --- a/requirements/static/ci/py3.13/freebsd.txt +++ b/requirements/static/ci/py3.13/freebsd.txt @@ -438,7 +438,7 @@ pyyaml==6.0.2 # responses # yamllint # yamlordereddictloader -pyzmq==26.2.0 +pyzmq==27.1.0 # via # -c requirements/static/pkg/py3.13/freebsd.txt # -r requirements/zeromq.txt diff --git a/requirements/static/ci/py3.13/lint.txt b/requirements/static/ci/py3.13/lint.txt index 39590e04abb4..0a53c317b587 100644 --- a/requirements/static/ci/py3.13/lint.txt +++ b/requirements/static/ci/py3.13/lint.txt @@ -548,7 +548,7 @@ pyyaml==6.0.2 # responses # yamllint # yamlordereddictloader -pyzmq==26.2.0 +pyzmq==27.1.0 # via # -c requirements/static/ci/py3.13/linux.txt # -c requirements/static/pkg/py3.13/linux.txt diff --git a/requirements/static/ci/py3.13/windows.txt b/requirements/static/ci/py3.13/windows.txt index 72a85c188dd1..391c24099ed6 100644 --- a/requirements/static/ci/py3.13/windows.txt +++ b/requirements/static/ci/py3.13/windows.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements/base.txt requirements/pytest.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/windows.txt -o=requirements/static/ci/py3.13/windows.txt +# uv pip compile requirements/base.txt requirements/pytest.txt requirements/windows.txt requirements/zeromq.txt requirements/static/ci/common.in requirements/static/ci/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url --unsafe-package=setuptools -c=requirements/static/pkg/py3.13/windows.txt -o=requirements/static/ci/py3.13/windows.txt aiohappyeyeballs==2.6.1 # via # -c requirements/static/pkg/py3.13/windows.txt diff --git a/requirements/static/pkg/py3.13/freebsd.txt b/requirements/static/pkg/py3.13/freebsd.txt index 654e973e5e01..751d2cbbd44d 100644 --- a/requirements/static/pkg/py3.13/freebsd.txt +++ b/requirements/static/pkg/py3.13/freebsd.txt @@ -159,7 +159,7 @@ pywin32==311 ; sys_platform == 'win32' # wmi pyyaml==6.0.2 # via -r requirements/base.txt -pyzmq==26.2.0 +pyzmq==27.1.0 # via -r requirements/zeromq.txt requests==2.32.5 # via diff --git a/requirements/static/pkg/py3.13/windows.txt b/requirements/static/pkg/py3.13/windows.txt index f62e4644ba02..576be68231d1 100644 --- a/requirements/static/pkg/py3.13/windows.txt +++ b/requirements/static/pkg/py3.13/windows.txt @@ -1,5 +1,5 @@ # This file was autogenerated by uv via the following command: -# uv pip compile requirements/base.txt requirements/zeromq.txt requirements/crypto.txt requirements/static/pkg/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url -o=requirements/static/pkg/py3.13/windows.txt +# uv pip compile requirements/base.txt requirements/zeromq.txt requirements/crypto.txt requirements/windows.txt requirements/static/pkg/windows.in --python-platform=windows --python-version=3.13 --constraint requirements/constraints.txt --no-emit-index-url -o=requirements/static/pkg/py3.13/windows.txt aiohappyeyeballs==2.6.1 # via aiohttp aiohttp==3.13.5 From 65e11bc1911ab7f89b491e2e6f75a75654740911 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 13 Apr 2026 01:44:53 -0700 Subject: [PATCH 32/34] Upgrade relenv to 0.22.7 and update CI context --- .github/workflows/ci.yml | 6 +++--- .github/workflows/nightly.yml | 6 +++--- .github/workflows/scheduled.yml | 6 +++--- .github/workflows/staging.yml | 6 +++--- cicd/shared-gh-workflows-context.yml | 2 +- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 781749bfe949..9db806331d59 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -469,7 +469,7 @@ jobs: with: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -486,7 +486,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" @@ -503,7 +503,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "src" diff --git a/.github/workflows/nightly.yml b/.github/workflows/nightly.yml index 1b63ce579cc6..e7bd6d4b95e8 100644 --- a/.github/workflows/nightly.yml +++ b/.github/workflows/nightly.yml @@ -464,7 +464,7 @@ jobs: with: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -481,7 +481,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" @@ -502,7 +502,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "src" diff --git a/.github/workflows/scheduled.yml b/.github/workflows/scheduled.yml index 3f02898a4209..3176cfffc075 100644 --- a/.github/workflows/scheduled.yml +++ b/.github/workflows/scheduled.yml @@ -512,7 +512,7 @@ jobs: with: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -529,7 +529,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" @@ -546,7 +546,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "src" diff --git a/.github/workflows/staging.yml b/.github/workflows/staging.yml index 80a9ef8eaf1f..e009f518ec43 100644 --- a/.github/workflows/staging.yml +++ b/.github/workflows/staging.yml @@ -496,7 +496,7 @@ jobs: with: cache-seed: ${{ needs.prepare-workflow.outputs.cache-seed }} salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" matrix: ${{ toJSON(fromJSON(needs.prepare-workflow.outputs.config)['build-matrix']) }} @@ -514,7 +514,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "onedir" @@ -536,7 +536,7 @@ jobs: with: salt-version: "${{ needs.prepare-workflow.outputs.salt-version }}" cache-prefix: ${{ needs.prepare-workflow.outputs.cache-seed }} - relenv-version: "0.22.4" + relenv-version: "0.22.7" python-version: "3.13.12" ci-python-version: "3.11" source: "src" diff --git a/cicd/shared-gh-workflows-context.yml b/cicd/shared-gh-workflows-context.yml index 1bdce4f9ed9c..7573e53ab7a5 100644 --- a/cicd/shared-gh-workflows-context.yml +++ b/cicd/shared-gh-workflows-context.yml @@ -4,7 +4,7 @@ # Tool versions nox_version: "2022.8.7" python_version: "3.13.12" -relenv_version: "0.22.4" +relenv_version: "0.22.7" release_branches: - "3006.x" - "3007.x" From 351980ec45033c32c36c4ad9f8bc482d4d9b72d0 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 13 Apr 2026 17:48:43 -0700 Subject: [PATCH 33/34] Fix CI build failures: add missing build tools for DEB/RPM and enable pip output for Windows debugging --- .github/workflows/build-packages.yml | 10 ++++++++-- pkg/windows/install_salt.ps1 | 4 ++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/workflows/build-packages.yml b/.github/workflows/build-packages.yml index 97ffbbbb4e35..effc7d8dfedd 100644 --- a/.github/workflows/build-packages.yml +++ b/.github/workflows/build-packages.yml @@ -107,8 +107,10 @@ jobs: - name: Install build dependencies run: | apt-get update -y - # Installing python3.13-venv for Python 3.13 support - apt-get install -y python3.13-venv + # Installing python3.13-venv and python3.13-dev for Python 3.13 support + apt-get install -y python3.13-venv python3.13-dev + # Installing build tools for source compilation of dependencies (e.g. pyzmq) + apt-get install -y cmake g++ pkg-config libssl-dev # Installing devscripts for source package builds (provides debuild) apt-get install -y devscripts # Installing patchelf for relenv ELF binary patching @@ -221,6 +223,10 @@ jobs: - name: Install rpmsign run: | dnf install -y rpmsign + if [ "${{ inputs.source }}" == "src" ]; then + # Installing python3-devel and build tools for source compilation of dependencies + dnf install -y python3-devel cmake gcc-c++ pkgconfig openssl-devel + fi - name: Download Onedir Tarball as an Artifact if: inputs.source == 'onedir' diff --git a/pkg/windows/install_salt.ps1 b/pkg/windows/install_salt.ps1 index 356af50a5c78..bd6230738816 100644 --- a/pkg/windows/install_salt.ps1 +++ b/pkg/windows/install_salt.ps1 @@ -126,7 +126,7 @@ if ( ! $SkipInstall ) { Start-Process -FilePath $SCRIPTS_DIR\pip3.exe ` -ArgumentList "install", "-r", "$SALT_DEPS", "-U" ` -WorkingDirectory "$PROJECT_DIR" ` - -Wait -WindowStyle Hidden + -Wait if ( Test-Path -Path "$SCRIPTS_DIR\distro.exe" ) { Write-Result "Success" -ForegroundColor Green } else { @@ -256,7 +256,7 @@ if ( ! $SkipInstall ) { Start-Process -FilePath $SCRIPTS_DIR\pip3.exe ` -ArgumentList "install", $InstallPath ` -WorkingDirectory "$PROJECT_DIR" ` - -Wait -WindowStyle Hidden + -Wait } finally { Remove-Item env:\RELENV_PIP_DIR } From 2dd67ccbfa3b5fd69f2f42f9ce444ef12adacff2 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 13 Apr 2026 19:46:19 -0700 Subject: [PATCH 34/34] Add extensive debugging to Windows build scripts --- pkg/windows/install_salt.ps1 | 20 ++++++++++++++------ pkg/windows/prep_salt.ps1 | 6 ++++-- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/pkg/windows/install_salt.ps1 b/pkg/windows/install_salt.ps1 index bd6230738816..5f2340401c81 100644 --- a/pkg/windows/install_salt.ps1 +++ b/pkg/windows/install_salt.ps1 @@ -122,14 +122,16 @@ if ( ! $SkipInstall ) { #------------------------------------------------------------------------------- # Installing dependencies #------------------------------------------------------------------------------- - Write-Host "Installing dependencies: " -NoNewline - Start-Process -FilePath $SCRIPTS_DIR\pip3.exe ` + Write-Host "Installing dependencies from $SALT_DEPS" + $pipProcess = Start-Process -FilePath $SCRIPTS_DIR\pip3.exe ` -ArgumentList "install", "-r", "$SALT_DEPS", "-U" ` -WorkingDirectory "$PROJECT_DIR" ` - -Wait + -Wait -PassThru + Write-Host "Pip process exited with code: $($pipProcess.ExitCode)" if ( Test-Path -Path "$SCRIPTS_DIR\distro.exe" ) { Write-Result "Success" -ForegroundColor Green } else { + Write-Host "distro.exe not found in $SCRIPTS_DIR" -ForegroundColor Red Write-Result "Failed" -ForegroundColor Red exit 1 } @@ -161,22 +163,28 @@ if ( ! (Test-Path -Path "$SCRIPTS_DIR\wmitest*") ) { $dlls = "pythoncom$($PY_MAJOR_VERSION)$($PY_MINOR_VERSION).dll", "pywintypes$($PY_MAJOR_VERSION)$($PY_MINOR_VERSION).dll" $dlls | ForEach-Object { + $sourcePath = "$SITE_PKGS_DIR\pywin32_system32\$_" + if ( -not ( Test-Path -Path "$sourcePath" ) ) { + Write-Host "Source DLL not found: $sourcePath" -ForegroundColor Yellow + } if ( -not ( Test-Path -Path "$SCRIPTS_DIR\$_" ) ) { Write-Host "Copying $_ to Scripts: " -NoNewline - Copy-Item "$SITE_PKGS_DIR\pywin32_system32\$_" "$SCRIPTS_DIR" -Force | Out-Null + Copy-Item "$sourcePath" "$SCRIPTS_DIR" -Force | Out-Null if ( Test-Path -Path "$SCRIPTS_DIR\$_") { Write-Result "Success" -ForegroundColor Green } else { + Write-Host "Failed to copy $_ to $SCRIPTS_DIR" -ForegroundColor Red Write-Result "Failed" -ForegroundColor Red exit 1 } } if ( -not ( Test-Path -Path "$SITE_PKGS_DIR\win32\$_" ) ) { - Write-Host "Moving $_ to win32: " -NoNewline - Copy-Item "$SITE_PKGS_DIR\pywin32_system32\$_" "$SITE_PKGS_DIR\win32" -Force | Out-Null + Write-Host "Copying $_ to win32: " -NoNewline + Copy-Item "$sourcePath" "$SITE_PKGS_DIR\win32" -Force | Out-Null if ( Test-Path -Path "$SITE_PKGS_DIR\win32\$_" ) { Write-Result "Success" -ForegroundColor Green } else { + Write-Host "Failed to copy $_ to $SITE_PKGS_DIR\win32" -ForegroundColor Red Write-Result "Failed" -ForegroundColor Red exit 1 } diff --git a/pkg/windows/prep_salt.ps1 b/pkg/windows/prep_salt.ps1 index b4d3ee93dea6..511f4dc7fa25 100644 --- a/pkg/windows/prep_salt.ps1 +++ b/pkg/windows/prep_salt.ps1 @@ -95,18 +95,20 @@ Write-Host $("-" * 80) # Verify Environment #------------------------------------------------------------------------------- -Write-Host "Verifying Python Build: " -NoNewline +Write-Host "Verifying Python Build at $PYTHON_BIN: " -NoNewline if ( Test-Path -Path "$PYTHON_BIN" ) { Write-Result "Success" -ForegroundColor Green } else { + Write-Host "python.exe not found at $PYTHON_BIN" -ForegroundColor Red Write-Result "Failed" -ForegroundColor Red exit 1 } -Write-Host "Verifying Salt Installation: " -NoNewline +Write-Host "Verifying Salt Installation at $BUILD_DIR\salt-minion.exe: " -NoNewline if ( Test-Path -Path "$BUILD_DIR\salt-minion.exe" ) { Write-Result "Success" -ForegroundColor Green } else { + Write-Host "salt-minion.exe not found at $BUILD_DIR\salt-minion.exe" -ForegroundColor Red Write-Result "Failed" -ForegroundColor Red exit 1 }