Merge 3006.x into 3007.x

This commit is contained in:
Pedro Algarvio 2024-01-25 09:47:57 +00:00
commit 5ea370c1fb
No known key found for this signature in database
GPG key ID: BB36BF6584A298FF
43 changed files with 446 additions and 267 deletions

View file

@ -129,22 +129,9 @@ jobs:
run: |
tools --timestamps vm decompress-dependencies ${{ matrix.distro-slug }}
- name: Show System Info & Test Plan
env:
SALT_RELEASE: "${{ inputs.salt-version }}"
SALT_REPO_ARCH: ${{ matrix.arch }}
SALT_REPO_TYPE: ${{ inputs.environment }}
SALT_REPO_USER: ${{ secrets.SALT_REPO_USER }}
SALT_REPO_PASS: ${{ secrets.SALT_REPO_PASS }}
SALT_REPO_DOMAIN_RELEASE: ${{ vars.SALT_REPO_DOMAIN_RELEASE || 'repo.saltproject.io' }}
SALT_REPO_DOMAIN_STAGING: ${{ vars.SALT_REPO_DOMAIN_STAGING || 'staging.repo.saltproject.io' }}
SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}"
LATEST_SALT_RELEASE: "${{ inputs.latest-release }}"
DOWNLOAD_TEST_PACKAGE_TYPE: ${{ matrix.pkg-type }}
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
-E SALT_RELEASE -E SALT_REPO_ARCH -E SALT_REPO_TYPE -E SALT_REPO_USER -E SALT_REPO_PASS \
-E SALT_REPO_DOMAIN_RELEASE -E SALT_REPO_DOMAIN_STAGING -E LATEST_SALT_RELEASE -E DOWNLOAD_TEST_PACKAGE_TYPE \
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ matrix.distro-slug }} -- download-pkgs
- name: Run Package Download Tests
@ -341,18 +328,10 @@ jobs:
run: |
nox --force-color -e decompress-dependencies -- macos ${{ matrix.arch }}
- name: Show System Info & Test Plan
- name: Show System Info
env:
SALT_RELEASE: "${{ inputs.salt-version }}"
SKIP_REQUIREMENTS_INSTALL: "1"
PRINT_TEST_SELECTION: "1"
PRINT_TEST_PLAN_ONLY: "1"
PRINT_SYSTEM_INFO: "1"
GITHUB_ACTIONS_PIPELINE: "1"
SKIP_INITIAL_GH_ACTIONS_FAILURES: "1"
SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}"
LATEST_SALT_RELEASE: "${{ inputs.latest-release }}"
DOWNLOAD_TEST_PACKAGE_TYPE: ${{ matrix.pkg-type }}
PRINT_SYSTEM_INFO_ONLY: "1"
run: |
sudo -E nox --force-color -e ${{ inputs.nox-session }}-pkgs -- download-pkgs
@ -556,22 +535,9 @@ jobs:
run: |
tools --timestamps vm decompress-dependencies ${{ matrix.distro-slug }}
- name: Show System Info & Test Plan
env:
SALT_RELEASE: "${{ inputs.salt-version }}"
SALT_REPO_ARCH: ${{ matrix.arch }}
LATEST_SALT_RELEASE: "${{ inputs.latest-release }}"
SALT_REPO_TYPE: ${{ inputs.environment }}
SALT_REPO_USER: ${{ secrets.SALT_REPO_USER }}
SALT_REPO_PASS: ${{ secrets.SALT_REPO_PASS }}
SALT_REPO_DOMAIN_RELEASE: ${{ vars.SALT_REPO_DOMAIN_RELEASE || 'repo.saltproject.io' }}
SALT_REPO_DOMAIN_STAGING: ${{ vars.SALT_REPO_DOMAIN_STAGING || 'staging.repo.saltproject.io' }}
SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}"
DOWNLOAD_TEST_PACKAGE_TYPE: ${{ matrix.pkg-type }}
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
-E SALT_RELEASE -E SALT_REPO_ARCH -E SALT_REPO_TYPE -E SALT_REPO_USER -E SALT_REPO_PASS \
-E SALT_REPO_DOMAIN_RELEASE -E SALT_REPO_DOMAIN_STAGING -E LATEST_SALT_RELEASE -E DOWNLOAD_TEST_PACKAGE_TYPE \
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ matrix.distro-slug }} -- download-pkgs
- name: Run Package Download Tests

View file

@ -191,9 +191,9 @@ jobs:
run: |
tools --timestamps vm decompress-dependencies ${{ inputs.distro-slug }}
- name: Show System Info & Test Plan
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }} ${{ inputs.distro-slug }} \
${{ matrix.tests-chunk }}

View file

@ -163,17 +163,12 @@ jobs:
with:
name: testrun-changed-files.txt
- name: Show System Info & Test Plan
- name: Show System Info
env:
SKIP_REQUIREMENTS_INSTALL: "1"
PRINT_TEST_SELECTION: "1"
PRINT_TEST_PLAN_ONLY: "1"
PRINT_SYSTEM_INFO: "1"
GITHUB_ACTIONS_PIPELINE: "1"
SKIP_INITIAL_GH_ACTIONS_FAILURES: "1"
SKIP_CODE_COVERAGE: "1"
PRINT_SYSTEM_INFO_ONLY: "1"
run: |
sudo -E nox --force-color -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }} -- -k "mac or darwin"
sudo -E nox --force-color -e ${{ inputs.nox-session }} -- ${{ matrix.tests-chunk }}
- name: Run Changed Tests
id: run-fast-changed-tests

View file

@ -191,9 +191,9 @@ jobs:
run: |
tools --timestamps vm decompress-dependencies ${{ inputs.distro-slug }}
- name: Show System Info & Test Plan
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }} ${{ inputs.distro-slug }} \
${{ matrix.tests-chunk }}

View file

@ -274,22 +274,9 @@ jobs:
run: |
tools --timestamps vm decompress-dependencies ${{ matrix.distro-slug }}
- name: Show System Info & Test Plan
env:
SALT_RELEASE: "${{ inputs.salt-version }}"
SALT_REPO_ARCH: ${{ matrix.arch }}
SALT_REPO_TYPE: ${{ inputs.environment }}
SALT_REPO_USER: ${{ secrets.SALT_REPO_USER }}
SALT_REPO_PASS: ${{ secrets.SALT_REPO_PASS }}
SALT_REPO_DOMAIN_RELEASE: ${{ vars.SALT_REPO_DOMAIN_RELEASE || 'repo.saltproject.io' }}
SALT_REPO_DOMAIN_STAGING: ${{ vars.SALT_REPO_DOMAIN_STAGING || 'staging.repo.saltproject.io' }}
SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}"
LATEST_SALT_RELEASE: "${{ inputs.latest-release }}"
DOWNLOAD_TEST_PACKAGE_TYPE: ${{ matrix.pkg-type }}
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
-E SALT_RELEASE -E SALT_REPO_ARCH -E SALT_REPO_TYPE -E SALT_REPO_USER -E SALT_REPO_PASS \
-E SALT_REPO_DOMAIN_RELEASE -E SALT_REPO_DOMAIN_STAGING -E LATEST_SALT_RELEASE -E DOWNLOAD_TEST_PACKAGE_TYPE \
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ matrix.distro-slug }} -- download-pkgs
- name: Run Package Download Tests
@ -493,18 +480,10 @@ jobs:
run: |
nox --force-color -e decompress-dependencies -- macos ${{ matrix.arch }}
- name: Show System Info & Test Plan
- name: Show System Info
env:
SALT_RELEASE: "${{ inputs.salt-version }}"
SKIP_REQUIREMENTS_INSTALL: "1"
PRINT_TEST_SELECTION: "1"
PRINT_TEST_PLAN_ONLY: "1"
PRINT_SYSTEM_INFO: "1"
GITHUB_ACTIONS_PIPELINE: "1"
SKIP_INITIAL_GH_ACTIONS_FAILURES: "1"
SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}"
LATEST_SALT_RELEASE: "${{ inputs.latest-release }}"
DOWNLOAD_TEST_PACKAGE_TYPE: ${{ matrix.pkg-type }}
PRINT_SYSTEM_INFO_ONLY: "1"
run: |
sudo -E nox --force-color -e ${{ inputs.nox-session }}-pkgs -- download-pkgs
@ -712,22 +691,9 @@ jobs:
run: |
tools --timestamps vm decompress-dependencies ${{ matrix.distro-slug }}
- name: Show System Info & Test Plan
env:
SALT_RELEASE: "${{ inputs.salt-version }}"
SALT_REPO_ARCH: ${{ matrix.arch }}
LATEST_SALT_RELEASE: "${{ inputs.latest-release }}"
SALT_REPO_TYPE: ${{ inputs.environment }}
SALT_REPO_USER: ${{ secrets.SALT_REPO_USER }}
SALT_REPO_PASS: ${{ secrets.SALT_REPO_PASS }}
SALT_REPO_DOMAIN_RELEASE: ${{ vars.SALT_REPO_DOMAIN_RELEASE || 'repo.saltproject.io' }}
SALT_REPO_DOMAIN_STAGING: ${{ vars.SALT_REPO_DOMAIN_STAGING || 'staging.repo.saltproject.io' }}
SKIP_CODE_COVERAGE: "${{ inputs.skip-code-coverage && '1' || '0' }}"
DOWNLOAD_TEST_PACKAGE_TYPE: ${{ matrix.pkg-type }}
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
-E SALT_RELEASE -E SALT_REPO_ARCH -E SALT_REPO_TYPE -E SALT_REPO_USER -E SALT_REPO_PASS \
-E SALT_REPO_DOMAIN_RELEASE -E SALT_REPO_DOMAIN_STAGING -E LATEST_SALT_RELEASE -E DOWNLOAD_TEST_PACKAGE_TYPE \
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ matrix.distro-slug }} -- download-pkgs
- name: Run Package Download Tests

View file

@ -190,11 +190,10 @@ jobs:
# This step can go away once we stop testing classic packages upgrade/downgrades to/from 3005.x
tools --timestamps vm ssh ${{ inputs.distro-slug }} -- "sudo python3 -m pip install -U 'importlib-metadata<=4.13.0' 'virtualenv<=20.21.1'"
- name: Show System Info & Test Plan
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ inputs.distro-slug }} -- ${{ matrix.tests-chunk }} \
${{ matrix.version && format('--prev-version {0}', matrix.version) || ''}}
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ inputs.distro-slug }} -- ${{ matrix.tests-chunk }}
- name: Run Package Tests
run: |

View file

@ -162,17 +162,12 @@ jobs:
run: |
nox --force-color -e decompress-dependencies -- macos ${{ inputs.arch }}
- name: Show System Info & Test Plan
- name: Show System Info
env:
SKIP_REQUIREMENTS_INSTALL: "1"
PRINT_TEST_SELECTION: "1"
PRINT_TEST_PLAN_ONLY: "1"
PRINT_SYSTEM_INFO: "1"
GITHUB_ACTIONS_PIPELINE: "1"
SKIP_INITIAL_GH_ACTIONS_FAILURES: "1"
PRINT_SYSTEM_INFO_ONLY: "1"
run: |
sudo -E nox --force-color -e ${{ inputs.nox-session }}-pkgs -- ${{ matrix.tests-chunk }} \
${{ matrix.version && format('--prev-version {0}', matrix.version) || ''}}
sudo -E nox --force-color -e ${{ inputs.nox-session }}-pkgs -- ${{ matrix.tests-chunk }}
- name: Run Package Tests
env:

View file

@ -190,11 +190,10 @@ jobs:
# This step can go away once we stop testing classic packages upgrade/downgrades to/from 3005.x
tools --timestamps vm ssh ${{ inputs.distro-slug }} -- "sudo python3 -m pip install -U 'importlib-metadata<=4.13.0' 'virtualenv<=20.21.1'"
- name: Show System Info & Test Plan
- name: Show System Info
run: |
tools --timestamps --timeout-secs=1800 vm testplan --skip-requirements-install \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ inputs.distro-slug }} -- ${{ matrix.tests-chunk }} \
${{ matrix.version && format('--prev-version {0}', matrix.version) || ''}}
tools --timestamps --timeout-secs=1800 vm test --skip-requirements-install --print-system-information-only \
--nox-session=${{ inputs.nox-session }}-pkgs ${{ inputs.distro-slug }} -- ${{ matrix.tests-chunk }}
- name: Run Package Tests
run: |

1
changelog/65018.fixed.md Normal file
View file

@ -0,0 +1 @@
Use `send_multipart` instead of `send` when sending multipart message.

View file

@ -62,6 +62,7 @@ if PRINT_SYSTEM_INFO is None:
PRINT_SYSTEM_INFO = CI_RUN
else:
PRINT_SYSTEM_INFO = PRINT_SYSTEM_INFO == "1"
PRINT_SYSTEM_INFO_ONLY = os.environ.get("PRINT_SYSTEM_INFO_ONLY", "0") == "1"
SKIP_REQUIREMENTS_INSTALL = os.environ.get("SKIP_REQUIREMENTS_INSTALL", "0") == "1"
EXTRA_REQUIREMENTS_INSTALL = os.environ.get("EXTRA_REQUIREMENTS_INSTALL")
COVERAGE_REQUIREMENT = os.environ.get("COVERAGE_REQUIREMENT")
@ -1022,6 +1023,11 @@ def _pytest(session, coverage, cmd_args, env=None, on_rerun=False):
args.append(f"--log-file={RUNTESTS_LOGFILE}")
args.extend(cmd_args)
if PRINT_SYSTEM_INFO_ONLY and "--sys-info-and-exit" not in args:
args.append("--sys-info-and-exit")
session.run("python", "-m", "pytest", *args, env=env)
return
if PRINT_SYSTEM_INFO and "--sysinfo" not in args:
args.append("--sysinfo")

View file

@ -36,3 +36,4 @@ pythonnet>=3.0.1; sys_platform == 'win32'
pymssql>=2.2.1; sys_platform == 'win32'
pymysql>=1.0.2; sys_platform == 'win32'
lxml>=4.6.3; sys_platform == 'win32'
xmltodict>=0.13.0; sys_platform == 'win32'

View file

@ -2,7 +2,7 @@ mock >= 3.0.0
# PyTest
docker
pytest >= 7.2.0
pytest-salt-factories >= 1.0.0rc28
pytest-salt-factories >= 1.0.0rc29
pytest-helpers-namespace >= 2019.1.8
pytest-subtests
pytest-timeout

View file

@ -145,7 +145,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/darwin.in
@ -314,7 +314,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -362,7 +362,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -466,7 +466,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -529,7 +528,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.10/darwin.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -144,7 +144,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/freebsd.in
@ -318,7 +318,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.5.0
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -366,7 +366,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -470,7 +470,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -534,7 +533,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.10/freebsd.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -160,7 +160,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
h11==0.14.0
# via httpcore
@ -344,7 +344,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.5.0
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -400,7 +400,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -522,7 +522,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -598,7 +597,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.10/linux.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -135,11 +135,11 @@ genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
gitdb==4.0.11
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
idna==3.4
# via
@ -271,7 +271,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -319,7 +319,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -428,7 +428,6 @@ six==1.15.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# kubernetes
@ -436,7 +435,7 @@ six==1.15.0
# pyvmomi
# pywinrm
# websocket-client
smmap==5.0.0
smmap==5.0.1
# via gitdb
sqlparse==0.4.4
# via -r requirements/static/ci/common.in
@ -473,7 +472,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.10/windows.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests
@ -500,8 +498,10 @@ wmi==1.5.1 ; sys_platform == "win32"
# -r requirements/base.txt
xmldiff==2.6.3
# via -r requirements/static/ci/common.in
xmltodict==0.13.0
xmltodict==0.13.0 ; sys_platform == "win32"
# via
# -c requirements/static/ci/../pkg/py3.10/windows.txt
# -r requirements/base.txt
# moto
# pywinrm
yamllint==1.32.0

View file

@ -143,7 +143,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/darwin.in
@ -310,9 +310,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -364,7 +364,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -468,7 +468,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -531,7 +530,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.11/darwin.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -142,7 +142,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/freebsd.in
@ -314,9 +314,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -368,7 +368,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -472,7 +472,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -537,7 +536,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.11/freebsd.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -156,7 +156,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
h11==0.14.0
# via httpcore
@ -338,9 +338,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -400,7 +400,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -522,7 +522,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -599,7 +598,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.11/linux.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -133,11 +133,11 @@ genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
gitdb==4.0.11
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
idna==3.4
# via
@ -267,9 +267,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -321,7 +321,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -430,7 +430,6 @@ six==1.15.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# kubernetes
@ -438,7 +437,7 @@ six==1.15.0
# pyvmomi
# pywinrm
# websocket-client
smmap==5.0.0
smmap==5.0.1
# via gitdb
sqlparse==0.4.4
# via -r requirements/static/ci/common.in
@ -475,7 +474,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests
@ -502,8 +500,10 @@ wmi==1.5.1 ; sys_platform == "win32"
# -r requirements/base.txt
xmldiff==2.6.3
# via -r requirements/static/ci/common.in
xmltodict==0.13.0
xmltodict==0.13.0 ; sys_platform == "win32"
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# -r requirements/base.txt
# moto
# pywinrm
yamllint==1.32.0

View file

@ -202,7 +202,7 @@ gitpython==3.1.41
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via
# -c requirements/static/ci/py3.12/linux.txt
# kubernetes
@ -436,11 +436,11 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via
# -c requirements/static/ci/py3.12/linux.txt
# google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# -c requirements/static/ci/py3.12/linux.txt
# pyasn1-modules
@ -522,7 +522,7 @@ pytest-httpserver==1.0.8
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/pytest.txt
@ -672,7 +672,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -766,7 +765,6 @@ urllib3==1.26.18
# -c requirements/static/ci/py3.12/linux.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -143,7 +143,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/darwin.in
@ -310,9 +310,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -364,7 +364,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -468,7 +468,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -531,7 +530,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.12/darwin.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -142,7 +142,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/freebsd.in
@ -314,9 +314,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -368,7 +368,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -472,7 +472,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -537,7 +536,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.12/freebsd.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -207,7 +207,7 @@ gitpython==3.1.41
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via
# -c requirements/static/ci/py3.12/linux.txt
# kubernetes
@ -454,11 +454,11 @@ psutil==5.9.6
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/base.txt
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via
# -c requirements/static/ci/py3.12/linux.txt
# google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# -c requirements/static/ci/py3.12/linux.txt
# pyasn1-modules
@ -667,7 +667,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -768,7 +767,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
# botocore
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -156,7 +156,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
h11==0.14.0
# via httpcore
@ -338,9 +338,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -400,7 +400,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -522,7 +522,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -599,7 +598,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -133,11 +133,11 @@ genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
gitdb==4.0.11
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
idna==3.4
# via
@ -267,9 +267,9 @@ psutil==5.9.6
# pytest-salt-factories
# pytest-shell-utilities
# pytest-system-statistics
pyasn1-modules==0.2.4
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -321,7 +321,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -430,7 +430,6 @@ six==1.15.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# kubernetes
@ -438,7 +437,7 @@ six==1.15.0
# pyvmomi
# pywinrm
# websocket-client
smmap==5.0.0
smmap==5.0.1
# via gitdb
sqlparse==0.4.4
# via -r requirements/static/ci/common.in
@ -475,7 +474,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.12/windows.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests
@ -502,8 +500,10 @@ wmi==1.5.1 ; sys_platform == "win32"
# -r requirements/base.txt
xmldiff==2.6.3
# via -r requirements/static/ci/common.in
xmltodict==0.13.0
xmltodict==0.13.0 ; sys_platform == "win32"
# via
# -c requirements/static/ci/../pkg/py3.12/windows.txt
# -r requirements/base.txt
# moto
# pywinrm
yamllint==1.32.0

View file

@ -144,7 +144,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/freebsd.in
@ -322,7 +322,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.5.0
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -370,7 +370,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -474,7 +474,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -538,7 +537,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.8/freebsd.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -155,7 +155,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
h11==0.14.0
# via httpcore
@ -341,7 +341,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.5.0
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -397,7 +397,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -516,7 +516,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -590,7 +589,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -135,11 +135,11 @@ genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
gitdb==4.0.11
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
idna==3.4
# via
@ -275,7 +275,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -323,7 +323,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -433,7 +433,6 @@ six==1.15.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# kubernetes
@ -441,7 +440,7 @@ six==1.15.0
# pyvmomi
# pywinrm
# websocket-client
smmap==5.0.0
smmap==5.0.1
# via gitdb
sqlparse==0.4.4
# via -r requirements/static/ci/common.in
@ -478,7 +477,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.8/windows.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests
@ -505,8 +503,10 @@ wmi==1.5.1 ; sys_platform == "win32"
# -r requirements/base.txt
xmldiff==2.6.3
# via -r requirements/static/ci/common.in
xmltodict==0.13.0
xmltodict==0.13.0 ; sys_platform == "win32"
# via
# -c requirements/static/ci/../pkg/py3.8/windows.txt
# -r requirements/base.txt
# moto
# pywinrm
yamllint==1.32.0

View file

@ -145,7 +145,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/darwin.in
@ -314,7 +314,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -362,7 +362,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -466,7 +466,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -529,7 +528,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.9/darwin.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -144,7 +144,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
hglib==2.6.2
# via -r requirements/static/ci/freebsd.in
@ -318,7 +318,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.5.0
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -366,7 +366,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -470,7 +470,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -534,7 +533,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.9/freebsd.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -155,7 +155,7 @@ gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
h11==0.14.0
# via httpcore
@ -337,7 +337,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.5.0
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -393,7 +393,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -512,7 +512,6 @@ six==1.16.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# junos-eznc
@ -586,7 +585,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests

View file

@ -135,11 +135,11 @@ genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
gitdb==4.0.11
# via gitpython
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
google-auth==2.27.0
# via kubernetes
idna==3.4
# via
@ -271,7 +271,7 @@ psutil==5.9.6
# pytest-system-statistics
pyasn1-modules==0.3.0
# via google-auth
pyasn1==0.4.8
pyasn1==0.5.1
# via
# pyasn1-modules
# rsa
@ -319,7 +319,7 @@ pytest-helpers-namespace==2021.12.29
# pytest-shell-utilities
pytest-httpserver==1.0.8
# via -r requirements/pytest.txt
pytest-salt-factories==1.0.0rc28
pytest-salt-factories==1.0.0rc29
# via -r requirements/pytest.txt
pytest-shell-utilities==1.8.0
# via pytest-salt-factories
@ -429,7 +429,6 @@ six==1.15.0
# etcd3-py
# genshi
# geomet
# google-auth
# jsonschema
# junit-xml
# kubernetes
@ -437,7 +436,7 @@ six==1.15.0
# pyvmomi
# pywinrm
# websocket-client
smmap==5.0.0
smmap==5.0.1
# via gitdb
sqlparse==0.4.4
# via -r requirements/static/ci/common.in
@ -474,7 +473,6 @@ urllib3==1.26.18
# -c requirements/static/ci/../pkg/py3.9/windows.txt
# botocore
# docker
# google-auth
# kubernetes
# python-etcd
# requests
@ -501,8 +499,10 @@ wmi==1.5.1 ; sys_platform == "win32"
# -r requirements/base.txt
xmldiff==2.6.3
# via -r requirements/static/ci/common.in
xmltodict==0.13.0
xmltodict==0.13.0 ; sys_platform == "win32"
# via
# -c requirements/static/ci/../pkg/py3.9/windows.txt
# -r requirements/base.txt
# moto
# pywinrm
yamllint==1.32.0

View file

@ -137,6 +137,8 @@ urllib3==1.26.18
# via requests
wmi==1.5.1 ; sys_platform == "win32"
# via -r requirements/base.txt
xmltodict==0.13.0 ; sys_platform == "win32"
# via -r requirements/base.txt
yarl==1.9.4
# via aiohttp
zc.lockfile==3.0.post1

View file

@ -142,6 +142,8 @@ urllib3==1.26.18
# via requests
wmi==1.5.1 ; sys_platform == "win32"
# via -r requirements/base.txt
xmltodict==0.13.0 ; sys_platform == "win32"
# via -r requirements/base.txt
yarl==1.9.4
# via aiohttp
zc.lockfile==3.0.post1

View file

@ -142,6 +142,8 @@ urllib3==1.26.18
# via requests
wmi==1.5.1 ; sys_platform == "win32"
# via -r requirements/base.txt
xmltodict==0.13.0 ; sys_platform == "win32"
# via -r requirements/base.txt
yarl==1.9.4
# via aiohttp
zc.lockfile==3.0.post1

View file

@ -140,6 +140,8 @@ urllib3==1.26.18
# via requests
wmi==1.5.1 ; sys_platform == "win32"
# via -r requirements/base.txt
xmltodict==0.13.0 ; sys_platform == "win32"
# via -r requirements/base.txt
yarl==1.9.4
# via aiohttp
zc.lockfile==3.0.post1

View file

@ -138,6 +138,8 @@ urllib3==1.26.18
# via requests
wmi==1.5.1 ; sys_platform == "win32"
# via -r requirements/base.txt
xmltodict==0.13.0 ; sys_platform == "win32"
# via -r requirements/base.txt
yarl==1.9.4
# via aiohttp
zc.lockfile==3.0.post1

View file

@ -968,21 +968,18 @@ class PublishServer(salt.transport.base.DaemonizedPublishServer):
htopic = salt.utils.stringutils.to_bytes(
hashlib.sha1(salt.utils.stringutils.to_bytes(topic)).hexdigest()
)
await self.dpub_sock.send(htopic, flags=zmq.SNDMORE)
await self.dpub_sock.send(payload)
yield self.dpub_sock.send_multipart([htopic, payload])
log.trace("Filtered data has been sent")
# Syndic broadcast
if self.opts.get("order_masters"):
log.trace("Sending filtered data to syndic")
await self.dpub_sock.send(b"syndic", flags=zmq.SNDMORE)
await self.dpub_sock.send(payload)
yield self.dpub_sock.send_multipart([b"syndic", payload])
log.trace("Filtered data has been sent to syndic")
# otherwise its a broadcast
else:
# TODO: constants file for "broadcast"
log.trace("Sending broadcasted data over publisher %s", self.pub_uri)
await self.dpub_sock.send(b"broadcast", flags=zmq.SNDMORE)
await self.dpub_sock.send(payload)
yield self.dpub_sock.send_multipart([b"broadcast", payload])
log.trace("Broadcasted data has been sent")
else:
log.trace("Sending ZMQ-unfiltered data over publisher %s", self.pub_uri)

View file

@ -1,11 +1,16 @@
import asyncio
import copy
import logging
import os
import random
import time
from contextlib import contextmanager
import pytest
from saltfactories.utils import random_string
import salt.transport.zeromq
import salt.utils.process
from tests.support.mock import MagicMock, patch
from tests.support.pytest.transport import PubServerChannelProcess
@ -21,9 +26,163 @@ pytestmark = [
]
class PubServerChannelSender:
def __init__(self, pub_server_channel, payload_list):
self.pub_server_channel = pub_server_channel
self.payload_list = payload_list
def run(self):
for payload in self.payload_list:
self.pub_server_channel.publish(payload)
time.sleep(2)
def generate_msg_list(msg_cnt, minions_list, broadcast):
msg_list = []
for i in range(msg_cnt):
for idx, minion_id in enumerate(minions_list):
if broadcast:
msg_list.append(
{"tgt_type": "grain", "tgt": "id:*", "jid": msg_cnt * idx + i}
)
else:
msg_list.append(
{"tgt_type": "list", "tgt": [minion_id], "jid": msg_cnt * idx + i}
)
return msg_list
@contextmanager
def channel_publisher_manager(msg_list, p_cnt, pub_server_channel):
process_list = []
msg_list = copy.deepcopy(msg_list)
random.shuffle(msg_list)
batch_size = len(msg_list) // p_cnt
list_batch = [
[x * batch_size, x * batch_size + batch_size] for x in range(0, p_cnt)
]
list_batch[-1][1] = list_batch[-1][1] + 1
try:
for i, j in list_batch:
c = PubServerChannelSender(pub_server_channel, msg_list[i:j])
p = salt.utils.process.Process(target=c.run)
process_list.append(p)
for p in process_list:
p.start()
yield
finally:
for p in process_list:
p.join()
@pytest.mark.skip_on_windows
@pytest.mark.slow_test
def test_zeromq_filtering(salt_master, salt_minion):
def test_zeromq_filtering_minion(salt_master, salt_minion):
opts = dict(
salt_master.config.copy(),
ipc_mode="ipc",
pub_hwm=0,
zmq_filtering=True,
acceptance_wait_time=5,
)
minion_opts = dict(
salt_minion.config.copy(),
zmq_filtering=True,
)
messages = 200
workers = 5
minions = 3
expect = set(range(messages))
target_minion_id = salt_minion.id
minions_list = [target_minion_id]
for _ in range(minions - 1):
minions_list.append(random_string("zeromq-minion-"))
msg_list = generate_msg_list(messages, minions_list, False)
with patch(
"salt.utils.minions.CkMinions.check_minions",
MagicMock(
return_value={
"minions": minions_list,
"missing": [],
"ssh_minions": False,
}
),
):
with PubServerChannelProcess(opts, minion_opts) as server_channel:
with channel_publisher_manager(
msg_list, workers, server_channel.pub_server_channel
):
cnt = 0
last_results_len = 0
while cnt < 20:
time.sleep(2)
results_len = len(server_channel.collector.results)
if last_results_len == results_len:
break
last_results_len = results_len
cnt += 1
results = set(server_channel.collector.results)
assert (
results == expect
), f"{len(results)}, != {len(expect)}, difference: {expect.difference(results)} {results}"
@pytest.mark.skip_on_windows
@pytest.mark.slow_test
def test_zeromq_filtering_syndic(salt_master, salt_minion):
opts = dict(
salt_master.config.copy(),
ipc_mode="ipc",
pub_hwm=0,
zmq_filtering=True,
acceptance_wait_time=5,
order_masters=True,
)
minion_opts = dict(
salt_minion.config.copy(),
zmq_filtering=True,
__role="syndic",
)
messages = 200
workers = 5
minions = 3
expect = set(range(messages * minions))
minions_list = []
for _ in range(minions):
minions_list.append(random_string("zeromq-minion-"))
msg_list = generate_msg_list(messages, minions_list, False)
with patch(
"salt.utils.minions.CkMinions.check_minions",
MagicMock(
return_value={
"minions": minions_list,
"missing": [],
"ssh_minions": False,
}
),
):
with PubServerChannelProcess(opts, minion_opts) as server_channel:
with channel_publisher_manager(
msg_list, workers, server_channel.pub_server_channel
):
cnt = 0
last_results_len = 0
while cnt < 20:
time.sleep(2)
results_len = len(server_channel.collector.results)
if last_results_len == results_len:
break
last_results_len = results_len
cnt += 1
results = set(server_channel.collector.results)
assert (
results == expect
), f"{len(results)}, != {len(expect)}, difference: {expect.difference(results)} {results}"
@pytest.mark.skip_on_windows
@pytest.mark.slow_test
def test_zeromq_filtering_broadcast(salt_master, salt_minion):
"""
Test sending messages to publisher using UDP with zeromq_filtering enabled
"""
@ -34,28 +193,46 @@ def test_zeromq_filtering(salt_master, salt_minion):
zmq_filtering=True,
acceptance_wait_time=5,
)
send_num = 1
expect = []
minion_opts = dict(
salt_minion.config.copy(),
zmq_filtering=True,
)
messages = 200
workers = 5
minions = 3
expect = set(range(messages * minions))
target_minion_id = salt_minion.id
minions_list = [target_minion_id]
for _ in range(minions - 1):
minions_list.append(random_string("zeromq-minion-"))
msg_list = generate_msg_list(messages, minions_list, True)
with patch(
"salt.utils.minions.CkMinions.check_minions",
MagicMock(
return_value={
"minions": [salt_minion.id],
"minions": minions_list,
"missing": [],
"ssh_minions": False,
}
),
):
with PubServerChannelProcess(
opts, salt_minion.config.copy(), zmq_filtering=True
) as server_channel:
expect.append(send_num)
load = {"tgt_type": "glob", "tgt": "*", "jid": send_num}
server_channel.publish(load)
results = server_channel.collector.results
assert len(results) == send_num, "{} != {}, difference: {}".format(
len(results), send_num, set(expect).difference(results)
)
with PubServerChannelProcess(opts, minion_opts) as server_channel:
with channel_publisher_manager(
msg_list, workers, server_channel.pub_server_channel
):
cnt = 0
last_results_len = 0
while cnt < 20:
time.sleep(2)
results_len = len(server_channel.collector.results)
if last_results_len == results_len:
break
last_results_len = results_len
cnt += 1
results = set(server_channel.collector.results)
assert (
results == expect
), f"{len(results)}, != {len(expect)}, difference: {expect.difference(results)} {results}"
async def test_pub_channel(master_opts, io_loop):

View file

@ -15,6 +15,7 @@ log = logging.getLogger(__name__)
CHECK_IMPORTS_SLS_CONTENTS = """
#!py
import importlib
import sys
def run():
config = {}
@ -81,7 +82,12 @@ def run():
]
}
for import_name in ["telnetlib"]:
# Import required for all OS'es
for import_name in [
"jinja2",
"telnetlib",
"yaml",
]:
try:
importlib.import_module(import_name)
config[import_name] = {
@ -101,6 +107,40 @@ def run():
}
]
}
# Windows specific requirements (I think, there may be some for other OSes in here)
if sys.platform == "win32":
for import_name in [
"cffi",
"clr_loader",
"lxml",
"pythonnet",
"pytz",
"pywintypes",
"timelib",
"win32",
"wmi",
"xmltodict",
]:
try:
importlib.import_module(import_name)
config[import_name] = {
'test.succeed_without_changes': [
{
"name": import_name,
'comment': "The '{}' import succeeded.".format(import_name)
}
]
}
except ModuleNotFoundError as err:
config[import_name] = {
'test.fail_without_changes': [
{
"name": import_name,
'comment': "The '{}' import failed. The error was: {}".format(import_name, err)
}
]
}
return config
"""

View file

@ -1,4 +1,5 @@
import ctypes
import hashlib
import logging
import multiprocessing
import queue
@ -13,8 +14,10 @@ import zmq
from pytestshellutils.utils.processes import terminate_process
import salt.channel.server
import salt.crypt
import salt.exceptions
import salt.master
import salt.payload
import salt.utils.msgpack
import salt.utils.process
import salt.utils.stringutils
@ -37,10 +40,12 @@ class Collector(salt.utils.process.SignalHandlingProcess):
port,
aes_key,
timeout=300,
zmq_filtering=False,
):
super().__init__()
self.minion_config = minion_config
self.hexid = hashlib.sha1(
salt.utils.stringutils.to_bytes(self.minion_config["id"])
).hexdigest()
self.interface = interface
self.port = port
self.aes_key = aes_key
@ -49,10 +54,11 @@ class Collector(salt.utils.process.SignalHandlingProcess):
self.hard_timeout = time.time() + timeout + 120
self.manager = multiprocessing.Manager()
self.results = self.manager.list()
self.zmq_filtering = zmq_filtering
self.zmq_filtering = minion_config["zmq_filtering"]
self.stopped = multiprocessing.Event()
self.started = multiprocessing.Event()
self.running = multiprocessing.Event()
self.stop_running = multiprocessing.Event()
self.unpacker = salt.utils.msgpack.Unpacker(raw=False)
@property
@ -86,9 +92,17 @@ class Collector(salt.utils.process.SignalHandlingProcess):
self.ctx = zmq.Context()
self.sock = self.ctx.socket(zmq.SUB)
self.sock.setsockopt(zmq.LINGER, -1)
self.sock.setsockopt(zmq.SUBSCRIBE, b"")
if self.zmq_filtering:
self.sock.setsockopt(zmq.SUBSCRIBE, b"broadcast")
if self.minion_config.get("__role") == "syndic":
self.sock.setsockopt(zmq.SUBSCRIBE, b"syndic")
else:
self.sock.setsockopt(
zmq.SUBSCRIBE, salt.utils.stringutils.to_bytes(self.hexid)
)
else:
self.sock.setsockopt(zmq.SUBSCRIBE, b"")
pub_uri = f"tcp://{self.interface}:{self.port}"
log.info("Collector listen %s", pub_uri)
self.sock.connect(pub_uri)
else:
end = time.time() + 120
@ -110,9 +124,25 @@ class Collector(salt.utils.process.SignalHandlingProcess):
# test_zeromq_filtering requires catching the
# SaltDeserializationError in order to pass.
try:
payload = self.sock.recv(zmq.NOBLOCK)
serial_payload = salt.payload.loads(payload)
raise tornado.gen.Return(serial_payload)
messages = self.sock.recv_multipart(flags=zmq.NOBLOCK, copy=True)
messages_len = len(messages)
if messages_len == 1:
serial_payload = salt.payload.loads(messages[0])
elif messages_len == 2:
message_target = salt.utils.stringutils.to_str(messages[0])
is_syndic = self.minion_config.get("__role") == "syndic"
if (
not is_syndic
and message_target not in ("broadcast", self.hexid)
) or (is_syndic and message_target not in ("broadcast", "syndic")):
log.debug(
"Publish received for not this minion: %s", message_target
)
raise salt.ext.tornado.gen.Return(None)
serial_payload = salt.payload.loads(messages[1])
else:
raise Exception("Invalid number of messages")
raise salt.ext.tornado.gen.Return(serial_payload)
except (zmq.ZMQError, salt.exceptions.SaltDeserializationError):
raise RecvError("ZMQ Error")
else:
@ -164,6 +194,7 @@ class Collector(salt.utils.process.SignalHandlingProcess):
continue
if "stop" in payload:
log.info("Collector stopped")
self.stop_running.set()
break
last_msg = time.time()
self.results.append(payload["jid"])
@ -304,7 +335,14 @@ class PubServerChannelProcess(salt.utils.process.SignalHandlingProcess):
def __exit__(self, *args):
# Publish a payload to tell the collection it's done processing
self.publish({"tgt_type": "glob", "tgt": "*", "jid": -1, "stop": True})
attempts = 300
while attempts > 0:
self.publish({"tgt_type": "glob", "tgt": "*", "jid": -1, "stop": True})
if self.collector.stop_running.wait(1) is True:
break
attempts -= 1
else:
pytest.fail("Failed to confirm the collector has stopped")
# Now trigger the collector to also exit
self.collector.__exit__(*args)
# We can safely wait here without a timeout because the Collector instance has a

View file

@ -263,6 +263,22 @@ def rsync(ctx: Context, name: str, download: bool = False):
"--print-tests-selection",
],
},
"print_system_info": {
"help": "Print the system information",
"action": "store_true",
"flags": [
"--psi",
"--print-system-information",
],
},
"print_system_info_only": {
"help": "Print the system information and exit",
"action": "store_true",
"flags": [
"--psio",
"--print-system-information-only",
],
},
"skip_code_coverage": {
"help": "Skip tracking code coverage",
"action": "store_true",
@ -293,6 +309,7 @@ def test(
skip_requirements_install: bool = False,
print_tests_selection: bool = False,
print_system_info: bool = False,
print_system_info_only: bool = False,
skip_code_coverage: bool = False,
envvars: list[str] = None,
fips: bool = False,
@ -323,6 +340,10 @@ def test(
env["PRINT_SYSTEM_INFO"] = "1"
else:
env["PRINT_SYSTEM_INFO"] = "0"
if print_system_info_only:
env["PRINT_SYSTEM_INFO_ONLY"] = "1"
else:
env["PRINT_SYSTEM_INFO_ONLY"] = "0"
if (
skip_requirements_install
or os.environ.get("SKIP_REQUIREMENTS_INSTALL", "0") == "1"