From 324eb9ea831580497388b9b7f610f3b41800aba0 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 25 Mar 2026 14:05:58 -0700 Subject: [PATCH 01/26] 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 798f15d72422d9bd9bd13ec96ad9a5febcd3b90e Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 25 Mar 2026 20:36:26 -0700 Subject: [PATCH 02/26] 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 4ce4301de7b13835419d525a3c04c0fe701afae6 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Wed, 25 Mar 2026 23:10:10 -0700 Subject: [PATCH 03/26] 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 c1fc8174271dbab31bf8f5a22191e85491c8428c Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Thu, 26 Mar 2026 13:45:56 -0700 Subject: [PATCH 04/26] 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 14d963660a024481d8df6e8bc85f4590cd094735 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Thu, 26 Mar 2026 15:12:59 -0700 Subject: [PATCH 05/26] 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 88504c8c0b41ee3e7703b544bc8b2fdd7ab07c9c Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 14:12:03 -0700 Subject: [PATCH 06/26] 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 90f5d4de7f40352a1396bdb061cad797c38bda94 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 15:54:23 -0700 Subject: [PATCH 07/26] 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 6b87e8e50e81..61ada7734eb7 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 f63095453885..9389a740ee30 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 70606f6ac153..625de0028834 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 1327c666177a..c139a03b6995 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 f83bef8d3d90..a29e601437ed 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 0ccdfbdeadac..f2a7f95f30d0 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 a5dff327b583..3f8689ce0fa0 100644 --- a/requirements/static/ci/py3.10/windows.txt +++ b/requirements/static/ci/py3.10/windows.txt @@ -301,7 +301,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/windows.in pymssql==2.3.1 # via diff --git a/requirements/static/ci/py3.11/cloud.txt b/requirements/static/ci/py3.11/cloud.txt index 4d932e099d4f..dacf2e707ff9 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 eba17cafb994..f6c20775a29f 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 e549a0ef7064..98015ba2c2ae 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 df3ee8615662..67e66b44a87c 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 ae1853d1fb83..b19a8b26a79a 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 44a1715083db..6d21a1dab52d 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 f2758a58dfe7..bc598e7755bf 100644 --- a/requirements/static/ci/py3.11/windows.txt +++ b/requirements/static/ci/py3.11/windows.txt @@ -294,7 +294,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/windows.in pymssql==2.3.11 # via diff --git a/requirements/static/ci/py3.12/cloud.txt b/requirements/static/ci/py3.12/cloud.txt index be3a24e84056..be4b5c0dcbb9 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 3cee9aa09400..6b487fa4bfcf 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 5e32ada61608..536aeb4da66b 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 7027a6a620f8..85bf6bd1ec3f 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 5ba7e3748136..27c720db287f 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 959ff5b4cd2d..a52e6e66ac04 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 7f26bea8d655..4010bb0b7afc 100644 --- a/requirements/static/ci/py3.12/windows.txt +++ b/requirements/static/ci/py3.12/windows.txt @@ -288,7 +288,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/windows.in pymssql==2.3.11 # via diff --git a/requirements/static/ci/py3.13/cloud.txt b/requirements/static/ci/py3.13/cloud.txt index 82c91f3eded9..a1bacef988ff 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 0f3373c372f5..ca30bc232cef 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 cfe54de17b35..38822cbe4871 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 49768aee3036..c7603e3bf04a 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 ebef2a98f3ba..23bec2342c8a 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 0ddf095dbec0..61e4b547fd9e 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 95df1c126dcb..965432d48d35 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 d3d99fe91343..c034689b6a82 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 2f38d36a5a0d..013f48592afb 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 21fc718a61f1..54b33349d0d6 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 c334d6d0c5c5..6722f6dcb638 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 66150ac50104..c6b61f66ed79 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 682caf74a84b..f0da35ae46fc 100644 --- a/requirements/static/ci/py3.9/windows.txt +++ b/requirements/static/ci/py3.9/windows.txt @@ -309,7 +309,7 @@ pycryptodomex==3.19.1 # -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 pymssql==2.3.1 # 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 75085c1502c7..6191f95a6ed5 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 fa51337d60fa..57c11468bdb0 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 613a018d5c1f..6921ec45497c 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 bbbc04e33cac..abd18ef71a1f 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 c2b8e803c52c..8334309de688 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 866c53b8d44b..6d00a6b2c330 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 31ed00aab8e6..a7ef938c9c94 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 b0df05710308..faeafc857d9a 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 8c03253b8d7a..a590810f6ab1 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 ed5eb83f3f46..31ee98839ff0 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 9d7a228fdfdc..286c3166f5ab 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 290b7ca39466..8f3dbe255cba 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 15851914193a..e5f772ec873e 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 45a3d4cab5e2..c37fd2cddbf1 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 a0d26c3e2dd3..d7cfd410fa95 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 b12f2a080198f69490bdbc45b39a5fcf03f4b0f8 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 18:03:18 -0700 Subject: [PATCH 08/26] 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 61ada7734eb7..2d38440ac0d7 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 9389a740ee30..f56493a3f609 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 625de0028834..70606f6ac153 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 a29e601437ed..3d8ffbbf2f39 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 f2a7f95f30d0..6f7cff172291 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 dacf2e707ff9..4841c8dfdfc8 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 f6c20775a29f..a9f94dab5c07 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 98015ba2c2ae..e549a0ef7064 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 b19a8b26a79a..ce7e97597a23 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 6d21a1dab52d..339b9eee5041 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 be4b5c0dcbb9..92766f035e5c 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 6b487fa4bfcf..ed8bd26fae98 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 536aeb4da66b..5e32ada61608 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 27c720db287f..4b6d3dfe3923 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 a52e6e66ac04..897c2d4ba9ba 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 a1bacef988ff..1866af498808 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 ca30bc232cef..17d40fb7af4e 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 38822cbe4871..cfe54de17b35 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 23bec2342c8a..123006a764b5 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 61e4b547fd9e..e73715bced33 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 965432d48d35..34dc4ac61e9e 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 c034689b6a82..5b1eea193811 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 013f48592afb..2f38d36a5a0d 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 6722f6dcb638..f657a4229078 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 c6b61f66ed79..174182e3ecb5 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 6191f95a6ed5..75085c1502c7 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 57c11468bdb0..fa51337d60fa 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 6921ec45497c..613a018d5c1f 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 abd18ef71a1f..bbbc04e33cac 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 8334309de688..c2b8e803c52c 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 6d00a6b2c330..866c53b8d44b 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 a7ef938c9c94..31ed00aab8e6 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 faeafc857d9a..b0df05710308 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 a590810f6ab1..8c03253b8d7a 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 31ee98839ff0..ed5eb83f3f46 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 286c3166f5ab..9d7a228fdfdc 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 8f3dbe255cba..290b7ca39466 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 e5f772ec873e..15851914193a 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 c37fd2cddbf1..45a3d4cab5e2 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 d7cfd410fa95..a0d26c3e2dd3 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 6c9d813785b7e485eecf48efe7eec5362a3d4c41 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Fri, 27 Mar 2026 23:45:48 -0700 Subject: [PATCH 09/26] 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 f56493a3f609..e602844d0b46 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 c139a03b6995..65059180a699 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 3d8ffbbf2f39..63529b972d0e 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 6f7cff172291..02cd6dcaa476 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 a9f94dab5c07..0304196fa61f 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 67e66b44a87c..c55fc0aada74 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 ce7e97597a23..c75a90e6c595 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 339b9eee5041..da59910b6ea8 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 ed8bd26fae98..c670932aad72 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 85bf6bd1ec3f..4bb11e30b963 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 4b6d3dfe3923..adf5e4aceff4 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 897c2d4ba9ba..e1ae72cc9868 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 5b1eea193811..2c1416eb1752 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 54b33349d0d6..f3b18125409d 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 f657a4229078..fdede2f74014 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 174182e3ecb5..11efe67724b2 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 737043d3755bbeb9259bd17c0521d2ace3ce083c 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/26] 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 | 8 ++++-- tests/unit/utils/test_color.py | 2 +- 6 files changed, 66 insertions(+), 20 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 5771c4a2d611..a5eaee5ca923 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,11 @@ def test_drift_detector(self): Returns: """ - zyppnotify = imp.load_source("zyppnotify", ZYPPNOTIFY_FILE) + 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 195f9a0a3c6641fa24a8774454405d595142c69f 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/26] 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 73ae0b4c13779695e8799465022209927b83fcbc 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/26] 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 bb93c499fadde7b8243058130bbe3ee2c44d2a03 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/26] 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 3be4518352c140af1215224b28db4eb1153e2914 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/26] 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 88f94349d705699baed0516436d24adfaab3b41d 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/26] 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 1b6006e2d04068c3a293d8db760c7703ab20da98 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/26] 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 76b9e0fa60866b9cf9c2e1f0f972a95a3fef7071 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 12:41:28 -0700 Subject: [PATCH 17/26] 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 d666dd2cc1ab..3fc6fe1ba623 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 60257d56f850..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.utcnow().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.utcnow().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 e1a885602991b2b306af878e9e391036fdf3ed9a Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 14:12:22 -0700 Subject: [PATCH 18/26] 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 90454c52c92601eb3440bb0e6ed2c038e689190f Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 14:43:40 -0700 Subject: [PATCH 19/26] 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 fae062019adc836830e6cfc047e84f9ef0408c41 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 16:36:13 -0700 Subject: [PATCH 20/26] 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 a3d74462d78f..87facd825358 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 = [ @@ -68,7 +69,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: @@ -218,7 +219,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}" @@ -254,10 +255,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 @@ -277,11 +278,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 @@ -301,11 +302,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 83719404ccc5ac996a6a47a49f3afa241451dbc1 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Sun, 5 Apr 2026 22:38:36 -0700 Subject: [PATCH 21/26] 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 185f17f4cb39677a085904901c7df4a19c7e72c9 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 02:09:30 -0700 Subject: [PATCH 22/26] 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 8a5661b9a92b50c59725855c0876e1fbfa3dae91 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 14:09:59 -0700 Subject: [PATCH 23/26] 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 57643f6b81f27581250ac5fbce494cc7a3b92638 Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 14:30:39 -0700 Subject: [PATCH 24/26] 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 8307b7e10a0ab2f2db65146a774091aac816e6bf Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Mon, 6 Apr 2026 14:30:55 -0700 Subject: [PATCH 25/26] 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 29957dad425311a3d9bac872f65af1dfa3578dae Mon Sep 17 00:00:00 2001 From: "Daniel A. Wozniak" Date: Tue, 7 Apr 2026 01:06:31 -0700 Subject: [PATCH 26/26] 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"])