Merge 3006.x into 3007.x

This commit is contained in:
Pedro Algarvio 2024-01-16 11:50:44 +00:00
commit 82e4e2b55f
No known key found for this signature in database
GPG key ID: BB36BF6584A298FF
99 changed files with 874 additions and 273 deletions

View file

@ -169,7 +169,7 @@ jobs:
- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
run: |
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py', 'pkg/common/env-cleanup-rules.yml') }}" | tee -a "$GITHUB_OUTPUT"
- name: Write Changed Files To A Local File
run:

View file

@ -221,7 +221,7 @@ jobs:
- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
run: |
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py', 'pkg/common/env-cleanup-rules.yml') }}" | tee -a "$GITHUB_OUTPUT"
- name: Write Changed Files To A Local File
run:

View file

@ -115,7 +115,7 @@ jobs:
- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
run: |
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py', 'pkg/common/env-cleanup-rules.yml') }}" | tee -a "$GITHUB_OUTPUT"
download-onedir-artifact:
name: Download Staging Onedir Artifact

View file

@ -211,7 +211,7 @@ jobs:
- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
run: |
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py', 'pkg/common/env-cleanup-rules.yml') }}" | tee -a "$GITHUB_OUTPUT"
- name: Write Changed Files To A Local File
run:

View file

@ -199,7 +199,7 @@ jobs:
- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
run: |
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py', 'pkg/common/env-cleanup-rules.yml') }}" | tee -a "$GITHUB_OUTPUT"
- name: Check Existing Releases
env:

View file

@ -9,6 +9,7 @@
<%- set gpg_key_id = "64CBBC8173D76B3F" %>
<%- set prepare_actual_release = prepare_actual_release | default(False) %>
<%- set gh_actions_workflows_python_version = "3.10" %>
<%- set nox_archive_hashfiles = "${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py', 'pkg/common/env-cleanup-rules.yml') }}" %>
---
<%- block name %>
name: <{ workflow_name }>
@ -216,7 +217,7 @@ jobs:
- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
run: |
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=<{ nox_archive_hashfiles }>" | tee -a "$GITHUB_OUTPUT"
<%- if prepare_actual_release %>

View file

@ -143,7 +143,7 @@ permissions:
- name: Get Hash For Nox Tarball Cache
id: nox-archive-hash
run: |
echo "nox-archive-hash=${{ hashFiles('requirements/**/*.txt', 'cicd/golden-images.json', 'noxfile.py') }}" | tee -a "$GITHUB_OUTPUT"
echo "nox-archive-hash=<{ nox_archive_hashfiles }>" | tee -a "$GITHUB_OUTPUT"
<%- endblock prepare_workflow_job %>
<%- endif %>

View file

@ -0,0 +1,5 @@
Update some requirements which had some security issues:
* Bump to `pycryptodome==3.19.1` and `pycryptodomex==3.19.1` due to https://github.com/advisories/GHSA-j225-cvw7-qrx7
* Bump to `gitpython==3.1.41` due to https://github.com/advisories/GHSA-2mqj-m65w-jghx
* Bump to `jinja2==3.1.3` due to https://github.com/advisories/GHSA-h5c8-rqwp-cp95

View file

@ -1932,6 +1932,11 @@ def ci_test_onedir_pkgs(session):
chunk = session.posargs.pop(0)
cmd_args = chunks[chunk]
for arg in session.posargs:
if arg.startswith("tests/pytests/pkg/"):
# The user is passing test paths
cmd_args.pop()
break
if IS_LINUX:
# Fetch the toolchain

View file

@ -1,5 +1,8 @@
---
common:
exclude_patterns: &common_exclude_patterns
- "**/site-packages/ansible/plugins/test"
- "**/site-packages/ansible/plugins/test/**"
dir_patterns: &common_dir_patterns
- "**/__pycache__"
- "**/lib/python3.*/test"
@ -24,16 +27,22 @@ common:
ci:
darwin:
exclude_patterns: &ci_darwin_exclude_patterns
- *common_exclude_patterns
dir_patterns: &ci_darwin_dir_patterns
- *common_dir_patterns
file_patterns: &ci_darwin_file_patterns
- *common_file_patterns
linux:
exclude_patterns: &ci_linux_exclude_patterns
- *common_exclude_patterns
dir_patterns: &ci_linux_dir_patterns
- *common_dir_patterns
file_patterns: &ci_linux_file_patterns
- *common_file_patterns
windows:
exclude_patterns: &ci_windows_exclude_patterns
- *common_exclude_patterns
dir_patterns: &ci_windows_dir_patterns
- *common_dir_patterns
- "**/artifacts/salt/configs"
@ -52,6 +61,8 @@ ci:
pkg:
darwin:
exclude_patterns:
- *ci_darwin_exclude_patterns
dir_patterns:
- *ci_darwin_dir_patterns
- "**/pkgconfig"
@ -62,11 +73,15 @@ pkg:
file_patterns:
- *ci_darwin_file_patterns
linux:
exclude_patterns:
- *ci_linux_exclude_patterns
dir_patterns:
- *ci_linux_dir_patterns
file_patterns:
- *ci_linux_file_patterns
windows:
exclude_patterns:
- *ci_windows_exclude_patterns
dir_patterns:
- *ci_windows_dir_patterns
- "**/salt/share"

View file

@ -8,3 +8,5 @@ python_files=test_*.py
python_classes=Test*
python_functions = test_*
junit_family=xunit2
# Only the tests should count towards timeouts
timeout_func_only = true

View file

@ -1,3 +1,3 @@
setuptools >= 65.6.3,< 69.0
setuptools-scm < 8.0.0
pip >= 22.3.1,< 23.0
pip >= 23.3,< 24.0

View file

@ -4,8 +4,7 @@
pyiface
pygit2>=1.10.1
pymysql>=1.0.2
ansible>=4.4.0,<5.0.1; python_version < '3.9'
ansible>=7.0.0; python_version >= '3.9'
ansible>=9.1.0; python_version >= '3.10'
twilio
python-telegram-bot>=13.7
yamllint

View file

@ -13,7 +13,7 @@ click==8.1.3
# towncrier
incremental==22.10.0
# via towncrier
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.10/linux.txt
# towncrier

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -142,7 +142,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -188,7 +188,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.10/darwin.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.10/darwin.txt
# -r requirements/base.txt
@ -320,7 +320,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.10/darwin.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.10/darwin.txt
# -r requirements/crypto.txt

View file

@ -58,7 +58,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/py3.10/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.10/linux.txt
# -r requirements/static/ci/docs.in

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -141,7 +141,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -187,7 +187,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.10/freebsd.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.10/freebsd.txt
# -r requirements/base.txt
@ -324,7 +324,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.10/freebsd.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.10/freebsd.txt
# -r requirements/crypto.txt

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -17,11 +17,11 @@ aiosignal==1.3.1
# via
# -c requirements/static/ci/../pkg/py3.10/linux.txt
# aiohttp
ansible-core==2.15.0
ansible-core==2.16.2
# via ansible
ansible==8.0.0 ; python_version >= "3.9"
ansible==9.1.0 ; python_version >= "3.10"
# via -r requirements/static/ci/linux.in
anyio==3.7.0
anyio==4.1.0
# via httpcore
apache-libcloud==3.7.0 ; sys_platform != "win32"
# via -r requirements/static/ci/common.in
@ -157,7 +157,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -165,7 +165,7 @@ h11==0.14.0
# via httpcore
hglib==2.6.2
# via -r requirements/static/ci/linux.in
httpcore==0.17.2
httpcore==0.17.3
# via httpx
httpx==0.24.1
# via python-telegram-bot
@ -211,7 +211,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.10/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.10/linux.txt
# -r requirements/base.txt
@ -350,7 +350,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.10/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.10/linux.txt
# -r requirements/crypto.txt

View file

@ -20,7 +20,7 @@ charset-normalizer==3.2.0
# via requests
idna==3.4
# via requests
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/static/ci/tools.in
jmespath==1.0.1
# via

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -136,7 +136,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -180,7 +180,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.10/windows.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.10/windows.txt
# -r requirements/base.txt
@ -277,7 +277,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.10/windows.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.10/windows.txt
# -r requirements/crypto.txt

View file

@ -13,7 +13,7 @@ click==8.1.3
# towncrier
incremental==17.5.0
# via towncrier
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.11/linux.txt
# towncrier

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.7
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -52,9 +52,9 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==3.1.0
cachetools==5.3.1
# via google-auth
cassandra-driver==3.23.0
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
certifi==2023.07.22
# via
@ -136,11 +136,11 @@ future==0.18.3
# textfsm
genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.1.2
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -186,7 +186,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.11/darwin.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.11/darwin.txt
# -r requirements/base.txt
@ -318,7 +318,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.11/darwin.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.11/darwin.txt
# -r requirements/crypto.txt

View file

@ -62,7 +62,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/py3.11/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.11/linux.txt
# -r requirements/static/ci/docs.in

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.7
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -52,9 +52,9 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==3.1.0
cachetools==5.3.1
# via google-auth
cassandra-driver==3.24.0
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
certifi==2023.07.22
# via
@ -139,7 +139,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -185,7 +185,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.11/freebsd.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.11/freebsd.txt
# -r requirements/base.txt
@ -322,7 +322,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.11/freebsd.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.11/freebsd.txt
# -r requirements/crypto.txt

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.7
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -21,9 +21,9 @@ annotated-types==0.6.0
# via
# -c requirements/static/ci/../pkg/py3.11/linux.txt
# pydantic
ansible-core==2.15.0
ansible-core==2.16.2
# via ansible
ansible==8.0.0 ; python_version >= "3.9"
ansible==9.1.0 ; python_version >= "3.10"
# via -r requirements/static/ci/linux.in
anyio==4.1.0
# via httpcore
@ -62,9 +62,9 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==4.2.2
cachetools==5.3.1
# via google-auth
cassandra-driver==3.23.0
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
certifi==2023.07.22
# via
@ -149,11 +149,11 @@ future==0.18.3
# textfsm
genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.1.2
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -207,7 +207,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.11/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.11/linux.txt
# -r requirements/base.txt
@ -346,7 +346,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.11/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.11/linux.txt
# -r requirements/crypto.txt

View file

@ -20,7 +20,7 @@ charset-normalizer==3.2.0
# via requests
idna==3.4
# via requests
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/static/ci/tools.in
jmespath==1.0.1
# via

View file

@ -4,9 +4,7 @@
#
# pip-compile --no-emit-index-url --output-file=requirements/static/ci/py3.11/windows-crypto.txt requirements/static/ci/crypto.in
#
m2crypto==0.37.1
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
parameterized==0.8.1
# via m2crypto
pycryptodome==3.10.1
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -44,9 +44,9 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==3.1.0
cachetools==5.3.1
# via google-auth
cassandra-driver==3.23.0
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
certifi==2023.07.22
# via
@ -130,11 +130,11 @@ frozenlist==1.4.0
# aiosignal
genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.1.2
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -178,7 +178,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# -r requirements/base.txt
@ -275,7 +275,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# cffi
pycryptodomex==3.10.1
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# -r requirements/crypto.txt
@ -308,7 +308,7 @@ pyopenssl==23.2.0
# etcd3-py
pyrsistent==0.19.3
# via jsonschema
pyspnego==0.10.2
pyspnego==0.9.0
# via requests-ntlm
pytest-custom-exit-code==0.3.0
# via -r requirements/pytest.txt
@ -440,8 +440,6 @@ smmap==5.0.0
# via gitdb
sqlparse==0.4.4
# via -r requirements/static/ci/common.in
sspilib==0.1.0
# via pyspnego
strict-rfc3339==0.7
# via -r requirements/static/ci/common.in
tempora==5.3.0

View file

@ -13,7 +13,7 @@ click==8.1.3
# towncrier
incremental==17.5.0
# via towncrier
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.12/linux.txt
# towncrier

View file

@ -66,7 +66,7 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==4.2.2
cachetools==5.3.1
# via
# -c requirements/static/ci/py3.12/linux.txt
# google-auth
@ -197,7 +197,7 @@ gitdb==4.0.10
# via
# -c requirements/static/ci/py3.12/linux.txt
# gitpython
gitpython==3.1.40
gitpython==3.1.41
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/static/ci/common.in
@ -257,7 +257,7 @@ jaraco.text==3.11.1
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
@ -448,7 +448,7 @@ pycparser==2.21
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.7
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -4,7 +4,7 @@
#
# pip-compile --no-emit-index-url --output-file=requirements/static/ci/py3.12/darwin.txt requirements/darwin.txt requirements/pytest.txt requirements/static/ci/common.in requirements/static/ci/darwin.in requirements/static/pkg/darwin.in
#
aiohttp==3.9.0
aiohttp==3.9.1
# via
# -r requirements/base.txt
# etcd3-py
@ -48,9 +48,9 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==3.1.0
cachetools==5.3.1
# via google-auth
cassandra-driver==3.23.0
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
certifi==2023.07.22
# via
@ -121,7 +121,7 @@ filelock==3.13.1
# via virtualenv
flaky==3.7.0
# via -r requirements/pytest.txt
frozenlist==1.3.0
frozenlist==1.4.0
# via
# aiohttp
# aiosignal
@ -131,12 +131,16 @@ future==0.18.3
# textfsm
genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.1.2
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
# via -r requirements/static/ci/common.in
# via
# -c requirements/static/ci/../pkg/py3.12/darwin.txt
# gitpython
gitpython==3.1.41
# via
# -c requirements/static/ci/../pkg/py3.12/darwin.txt
# -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
hglib==2.6.2
@ -181,7 +185,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.12/darwin.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.12/darwin.txt
# -r requirements/base.txt
@ -312,7 +316,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.12/darwin.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.12/darwin.txt
# -r requirements/crypto.txt

View file

@ -106,7 +106,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/py3.12/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/base.txt
@ -171,7 +171,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/py3.12/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/crypto.txt

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.7
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -52,9 +52,9 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==3.1.0
cachetools==5.3.1
# via google-auth
cassandra-driver==3.24.0
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
certifi==2023.07.22
# via
@ -139,7 +139,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -185,7 +185,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.12/freebsd.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.12/freebsd.txt
# -r requirements/base.txt
@ -322,7 +322,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.12/freebsd.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.12/freebsd.txt
# -r requirements/crypto.txt

View file

@ -26,11 +26,11 @@ annotated-types==0.6.0
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
# pydantic
ansible-core==2.15.0
ansible-core==2.16.2
# via
# -c requirements/static/ci/py3.12/linux.txt
# ansible
ansible==8.0.0 ; python_version >= "3.9"
ansible==9.1.0 ; python_version >= "3.10"
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/static/ci/linux.in
@ -80,7 +80,7 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==4.2.2
cachetools==5.3.1
# via
# -c requirements/static/ci/py3.12/linux.txt
# google-auth
@ -203,7 +203,7 @@ gitdb==4.0.10
# via
# -c requirements/static/ci/py3.12/linux.txt
# gitpython
gitpython==3.1.40
gitpython==3.1.41
# via
# -c requirements/static/ci/py3.12/linux.txt
# -r requirements/static/ci/common.in
@ -279,7 +279,7 @@ jaraco.text==3.11.1
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
@ -470,7 +470,7 @@ pycparser==2.21
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -c requirements/static/ci/py3.12/linux.txt

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.7
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -21,9 +21,9 @@ annotated-types==0.6.0
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# pydantic
ansible-core==2.15.0
ansible-core==2.16.2
# via ansible
ansible==8.0.0 ; python_version >= "3.9"
ansible==9.1.0 ; python_version >= "3.10"
# via -r requirements/static/ci/linux.in
anyio==4.1.0
# via httpcore
@ -62,7 +62,7 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==4.2.2
cachetools==5.3.1
# via google-auth
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
@ -153,7 +153,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -207,7 +207,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -r requirements/base.txt
@ -346,7 +346,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.12/linux.txt
# -r requirements/crypto.txt

View file

@ -20,7 +20,7 @@ charset-normalizer==3.2.0
# via requests
idna==3.4
# via requests
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/static/ci/tools.in
jmespath==1.0.1
# via

View file

@ -4,9 +4,7 @@
#
# pip-compile --no-emit-index-url --output-file=requirements/static/ci/py3.12/windows-crypto.txt requirements/static/ci/crypto.in
#
m2crypto==0.37.1
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
parameterized==0.8.1
# via m2crypto
pycryptodome==3.10.1
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -4,7 +4,7 @@
#
# pip-compile --no-emit-index-url --output-file=requirements/static/ci/py3.11/windows.txt requirements/pytest.txt requirements/static/ci/common.in requirements/static/ci/windows.in requirements/static/pkg/windows.in requirements/windows.txt
#
aiohttp==3.9.0
aiohttp==3.9.1
# via etcd3-py
aiosignal==1.3.1
# via aiohttp
@ -44,9 +44,9 @@ botocore==1.29.152
# boto3
# moto
# s3transfer
cachetools==3.1.0
cachetools==5.3.1
# via google-auth
cassandra-driver==3.23.0
cassandra-driver==3.28.0
# via -r requirements/static/ci/common.in
certifi==2023.07.22
# via
@ -127,7 +127,7 @@ filelock==3.13.1
# via virtualenv
flaky==3.7.0
# via -r requirements/pytest.txt
frozenlist==1.3.3
frozenlist==1.4.0
# via
# aiohttp
# aiosignal
@ -135,11 +135,35 @@ genshi==0.7.7
# via -r requirements/static/ci/common.in
geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
gitdb==4.0.10
# via
# -c requirements/static/ci/../pkg/py3.12/windows.txt
# gitpython
gitpython==3.1.41
# via
# -c requirements/static/ci/../pkg/py3.12/windows.txt
# -r requirements/static/ci/common.in
# -r requirements/windows.txt
google-auth==2.19.1
gitdb==4.0.10
# via
# -c requirements/static/ci/../pkg/py3.12/windows.txt
# gitpython
gitpython==3.1.41
# via
# -c requirements/static/ci/../pkg/py3.12/windows.txt
# -r requirements/static/ci/common.in
# -r requirements/windows.txt
google-auth==2.19.1
# via kubernetes
idna==3.4
# via
@ -181,7 +205,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# -r requirements/base.txt
@ -282,7 +306,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# cffi
pycryptodomex==3.10.1
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.11/windows.txt
# -r requirements/crypto.txt

View file

@ -13,7 +13,7 @@ click==8.1.3
# towncrier
incremental==22.10.0
# via towncrier
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.8/linux.txt
# towncrier

View file

@ -66,7 +66,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/py3.8/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.8/linux.txt
# -r requirements/static/ci/docs.in

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -141,7 +141,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -191,7 +191,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.8/freebsd.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.8/freebsd.txt
# -r requirements/base.txt
@ -328,7 +328,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.8/freebsd.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.8/freebsd.txt
# -r requirements/crypto.txt

View file

@ -14,7 +14,7 @@ mccabe==0.6.1
# via pylint
modernize==0.5
# via saltpylint
pycodestyle==2.10.0
pycodestyle==2.5.0
# via saltpylint
pylint==2.4.4
# via

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -17,11 +17,7 @@ aiosignal==1.3.1
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# aiohttp
ansible-core==2.11.12
# via ansible
ansible==4.10.0 ; python_version < "3.9"
# via -r requirements/static/ci/linux.in
anyio==3.7.0
anyio==4.1.0
# via httpcore
apache-libcloud==3.7.0 ; sys_platform != "win32"
# via -r requirements/static/ci/common.in
@ -113,7 +109,6 @@ cryptography==41.0.7
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# -r requirements/base.txt
# ansible-core
# etcd3-py
# moto
# paramiko
@ -157,7 +152,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -165,7 +160,7 @@ h11==0.14.0
# via httpcore
hglib==2.6.2
# via -r requirements/static/ci/linux.in
httpcore==0.17.2
httpcore==0.17.3
# via httpx
httpx==0.24.1
# via python-telegram-bot
@ -215,11 +210,10 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# -r requirements/base.txt
# ansible-core
# junos-eznc
# moto
# napalm
@ -314,7 +308,6 @@ packaging==23.1
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# -r requirements/base.txt
# ansible-core
# docker
# pytest
paramiko==3.4.0 ; sys_platform != "win32" and sys_platform != "darwin"
@ -354,7 +347,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# -r requirements/crypto.txt
@ -458,7 +451,6 @@ pyyaml==6.0.1
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt
# -r requirements/base.txt
# ansible-core
# clustershell
# junos-eznc
# kubernetes
@ -492,9 +484,7 @@ requests==2.31.0
# responses
# twilio
# vcert
resolvelib==0.5.4
# via ansible-core
responses==0.23.1
responses==0.24.1
# via moto
rfc3987==1.3.8
# via -r requirements/static/ci/common.in
@ -584,8 +574,6 @@ ttp==0.9.5
# ttp-templates
twilio==8.2.2
# via -r requirements/static/ci/linux.in
types-pyyaml==6.0.1
# via responses
typing-extensions==4.8.0
# via
# -c requirements/static/ci/../pkg/py3.8/linux.txt

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -136,7 +136,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -184,7 +184,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.8/windows.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.8/windows.txt
# -r requirements/base.txt
@ -281,7 +281,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.8/windows.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.8/windows.txt
# -r requirements/crypto.txt

View file

@ -13,7 +13,7 @@ click==8.1.3
# towncrier
incremental==22.10.0
# via towncrier
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.9/linux.txt
# towncrier

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -142,7 +142,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -188,7 +188,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.9/darwin.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.9/darwin.txt
# -r requirements/base.txt
@ -320,7 +320,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.9/darwin.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.9/darwin.txt
# -r requirements/crypto.txt

View file

@ -62,7 +62,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/py3.9/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/py3.9/linux.txt
# -r requirements/static/ci/docs.in

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -141,7 +141,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -187,7 +187,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.9/freebsd.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.9/freebsd.txt
# -r requirements/base.txt
@ -324,7 +324,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.9/freebsd.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.9/freebsd.txt
# -r requirements/crypto.txt

View file

@ -14,7 +14,7 @@ mccabe==0.6.1
# via pylint
modernize==0.5
# via saltpylint
pycodestyle==2.10.0
pycodestyle==2.5.0
# via saltpylint
pylint==2.4.4
# via

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -17,11 +17,7 @@ aiosignal==1.3.1
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# aiohttp
ansible-core==2.15.0
# via ansible
ansible==8.0.0 ; python_version >= "3.9"
# via -r requirements/static/ci/linux.in
anyio==3.7.0
anyio==4.1.0
# via httpcore
apache-libcloud==3.7.0 ; sys_platform != "win32"
# via -r requirements/static/ci/common.in
@ -113,7 +109,6 @@ cryptography==41.0.7
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# -r requirements/base.txt
# ansible-core
# etcd3-py
# moto
# paramiko
@ -157,7 +152,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -165,7 +160,7 @@ h11==0.14.0
# via httpcore
hglib==2.6.2
# via -r requirements/static/ci/linux.in
httpcore==0.17.2
httpcore==0.17.3
# via httpx
httpx==0.24.1
# via python-telegram-bot
@ -185,8 +180,6 @@ importlib-metadata==6.6.0
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# -r requirements/base.txt
importlib-resources==5.0.7
# via ansible-core
inflect==6.0.4
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
@ -213,11 +206,10 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# -r requirements/base.txt
# ansible-core
# junos-eznc
# moto
# napalm
@ -312,7 +304,6 @@ packaging==23.1
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# -r requirements/base.txt
# ansible-core
# docker
# pytest
paramiko==3.4.0 ; sys_platform != "win32" and sys_platform != "darwin"
@ -352,7 +343,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# -r requirements/crypto.txt
@ -456,7 +447,6 @@ pyyaml==6.0.1
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt
# -r requirements/base.txt
# ansible-core
# clustershell
# junos-eznc
# kubernetes
@ -490,9 +480,7 @@ requests==2.31.0
# responses
# twilio
# vcert
resolvelib==1.0.1
# via ansible-core
responses==0.23.1
responses==0.24.1
# via moto
rfc3987==1.3.8
# via -r requirements/static/ci/common.in
@ -582,8 +570,6 @@ ttp==0.9.5
# ttp-templates
twilio==8.2.2
# via -r requirements/static/ci/linux.in
types-pyyaml==6.0.1
# via responses
typing-extensions==4.8.0
# via
# -c requirements/static/ci/../pkg/py3.9/linux.txt

View file

@ -20,7 +20,7 @@ charset-normalizer==3.2.0
# via requests
idna==3.4
# via requests
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/static/ci/tools.in
jmespath==1.0.1
# via

View file

@ -6,5 +6,5 @@
#
m2crypto==0.38.0
# via -r requirements/static/ci/crypto.in
pycryptodome==3.9.8
pycryptodome==3.19.1
# via -r requirements/static/ci/crypto.in

View file

@ -136,7 +136,7 @@ geomet==0.2.1.post1
# via cassandra-driver
gitdb==4.0.10
# via gitpython
gitpython==3.1.40
gitpython==3.1.41
# via -r requirements/static/ci/common.in
google-auth==2.19.1
# via kubernetes
@ -180,7 +180,7 @@ jaraco.text==3.11.1
# via
# -c requirements/static/ci/../pkg/py3.9/windows.txt
# jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via
# -c requirements/static/ci/../pkg/py3.9/windows.txt
# -r requirements/base.txt
@ -277,7 +277,7 @@ pycparser==2.21
# via
# -c requirements/static/ci/../pkg/py3.9/windows.txt
# cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -c requirements/static/ci/../pkg/py3.9/windows.txt
# -r requirements/crypto.txt

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -61,7 +61,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -93,7 +93,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -61,7 +61,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -93,7 +93,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.10.1
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -26,8 +26,28 @@ cryptography==41.0.7
# pyopenssl
distro==1.8.0
# via -r requirements/base.txt
idna==3.4
# via requests
gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/darwin.txt
idna==3.4
# via
# -r requirements/darwin.txt
# requests
gitdb==4.0.10
# via gitpython
gitpython==3.1.41
# via -r requirements/darwin.txt
idna==3.4
# via
# -r requirements/darwin.txt
# requests
immutables==0.15
# via contextvars
importlib-metadata==6.6.0
@ -45,7 +65,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -70,8 +90,20 @@ portend==3.1.0
psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via
# -r requirements/darwin.txt
# cffi
pycryptodomex==3.19.1
# via
# -r requirements/darwin.txt
# cffi
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -61,7 +61,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -93,7 +93,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.10.1
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic-core==2.14.5
# via pydantic

View file

@ -59,7 +59,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -89,7 +89,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -59,7 +59,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -89,7 +89,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -63,7 +63,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -95,7 +95,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -57,7 +57,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -87,7 +87,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -61,7 +61,7 @@ jaraco.functools==3.7.0
# tempora
jaraco.text==3.11.1
# via jaraco.collections
jinja2==3.1.2
jinja2==3.1.3
# via -r requirements/base.txt
jmespath==1.0.1
# via -r requirements/base.txt
@ -93,7 +93,7 @@ psutil==5.9.6
# via -r requirements/base.txt
pycparser==2.21
# via cffi
pycryptodomex==3.9.8
pycryptodomex==3.19.1
# via -r requirements/crypto.txt
pydantic==1.10.8
# via inflect

View file

@ -7,7 +7,7 @@ This is a base library used by a number of AWS services.
:depends: requests
"""
import binascii
import copy
import hashlib
import hmac
@ -15,43 +15,18 @@ import logging
import random
import re
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.xmlutil as xml
try:
import requests
HAS_REQUESTS = True # pylint: disable=W0612
except ImportError:
HAS_REQUESTS = False # pylint: disable=W0612
try:
import binascii
HAS_BINASCII = True # pylint: disable=W0612
except ImportError:
HAS_BINASCII = False # pylint: disable=W0612
try:
import urllib.parse
HAS_URLLIB = True # pylint: disable=W0612
except ImportError:
HAS_URLLIB = False # pylint: disable=W0612
try:
import xml.etree.ElementTree as ET
HAS_ETREE = True # pylint: disable=W0612
except ImportError:
HAS_ETREE = False # pylint: disable=W0612
# pylint: enable=import-error,redefined-builtin,no-name-in-module
log = logging.getLogger(__name__)
DEFAULT_LOCATION = "us-east-1"
DEFAULT_AWS_API_VERSION = "2016-11-15"
AWS_RETRY_CODES = [

View file

@ -0,0 +1,58 @@
PRIVKEY_DATA = (
"-----BEGIN RSA PRIVATE KEY-----\n"
"MIIEpAIBAAKCAQEA75GR6ZTv5JOv90Vq8tKhKC7YQnhDIo2hM0HVziTEk5R4UQBW\n"
"a0CKytFMbTONY2msEDwX9iA0x7F5Lgj0X8eD4ZMsYqLzqjWMekLC8bjhxc+EuPo9\n"
"Dygu3mJ2VgRC7XhlFpmdo5NN8J2E7B/CNB3R4hOcMMZNZdi0xLtFoTfwU61UPfFX\n"
"14mV2laqLbvDEfQLJhUTDeFFV8EN5Z4H1ttLP3sMXJvc3EvM0JiDVj4l1TWFUHHz\n"
"eFgCA1Im0lv8i7PFrgW7nyMfK9uDSsUmIp7k6ai4tVzwkTmV5PsriP1ju88Lo3MB\n"
"4/sUmDv/JmlZ9YyzTO3Po8Uz3Aeq9HJWyBWHAQIDAQABAoIBAGOzBzBYZUWRGOgl\n"
"IY8QjTT12dY/ymC05GM6gMobjxuD7FZ5d32HDLu/QrknfS3kKlFPUQGDAbQhbbb0\n"
"zw6VL5NO9mfOPO2W/3FaG1sRgBQcerWonoSSSn8OJwVBHMFLG3a+U1Zh1UvPoiPK\n"
"S734swIM+zFpNYivGPvOm/muF/waFf8tF/47t1cwt/JGXYQnkG/P7z0vp47Irpsb\n"
"Yjw7vPe4BnbY6SppSxscW3KoV7GtJLFKIxAXbxsuJMF/rYe3O3w2VKJ1Sug1VDJl\n"
"/GytwAkSUer84WwP2b07Wn4c5pCnmLslMgXCLkENgi1NnJMhYVOnckxGDZk54hqP\n"
"9RbLnkkCgYEA/yKuWEvgdzYRYkqpzB0l9ka7Y00CV4Dha9Of6GjQi9i4VCJ/UFVr\n"
"UlhTo5y0ZzpcDAPcoZf5CFZsD90a/BpQ3YTtdln2MMCL/Kr3QFmetkmDrt+3wYnX\n"
"sKESfsa2nZdOATRpl1antpwyD4RzsAeOPwBiACj4fkq5iZJBSI0bxrMCgYEA8GFi\n"
"qAjgKh81/Uai6KWTOW2kX02LEMVRrnZLQ9VPPLGid4KZDDk1/dEfxjjkcyOxX1Ux\n"
"Klu4W8ZEdZyzPcJrfk7PdopfGOfrhWzkREK9C40H7ou/1jUecq/STPfSOmxh3Y+D\n"
"ifMNO6z4sQAHx8VaHaxVsJ7SGR/spr0pkZL+NXsCgYEA84rIgBKWB1W+TGRXJzdf\n"
"yHIGaCjXpm2pQMN3LmP3RrcuZWm0vBt94dHcrR5l+u/zc6iwEDTAjJvqdU4rdyEr\n"
"tfkwr7v6TNlQB3WvpWanIPyVzfVSNFX/ZWSsAgZvxYjr9ixw6vzWBXOeOb/Gqu7b\n"
"cvpLkjmJ0wxDhbXtyXKhZA8CgYBZyvcQb+hUs732M4mtQBSD0kohc5TsGdlOQ1AQ\n"
"McFcmbpnzDghkclyW8jzwdLMk9uxEeDAwuxWE/UEvhlSi6qdzxC+Zifp5NBc0fVe\n"
"7lMx2mfJGxj5CnSqQLVdHQHB4zSXkAGB6XHbBd0MOUeuvzDPfs2voVQ4IG3FR0oc\n"
"3/znuwKBgQChZGH3McQcxmLA28aUwOVbWssfXKdDCsiJO+PEXXlL0maO3SbnFn+Q\n"
"Tyf8oHI5cdP7AbwDSx9bUfRPjg9dKKmATBFr2bn216pjGxK0OjYOCntFTVr0psRB\n"
"CrKg52Qrq71/2l4V2NLQZU40Dr1bN9V+Ftd9L0pvpCAEAWpIbLXGDw==\n"
"-----END RSA PRIVATE KEY-----"
)
PUBKEY_DATA = (
"-----BEGIN PUBLIC KEY-----\n"
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA75GR6ZTv5JOv90Vq8tKh\n"
"KC7YQnhDIo2hM0HVziTEk5R4UQBWa0CKytFMbTONY2msEDwX9iA0x7F5Lgj0X8eD\n"
"4ZMsYqLzqjWMekLC8bjhxc+EuPo9Dygu3mJ2VgRC7XhlFpmdo5NN8J2E7B/CNB3R\n"
"4hOcMMZNZdi0xLtFoTfwU61UPfFX14mV2laqLbvDEfQLJhUTDeFFV8EN5Z4H1ttL\n"
"P3sMXJvc3EvM0JiDVj4l1TWFUHHzeFgCA1Im0lv8i7PFrgW7nyMfK9uDSsUmIp7k\n"
"6ai4tVzwkTmV5PsriP1ju88Lo3MB4/sUmDv/JmlZ9YyzTO3Po8Uz3Aeq9HJWyBWH\n"
"AQIDAQAB\n"
"-----END PUBLIC KEY-----"
)
MSG = b"It's me, Mario"
SIG = (
b"\x07\xf3\xb1\xe7\xdb\x06\xf4_\xe2\xdc\xcb!F\xfb\xbex{W\x1d\xe4E"
b"\xd3\r\xc5\x90\xca(\x05\x1d\x99\x8b\x1aug\x9f\x95>\x94\x7f\xe3+"
b"\x12\xfa\x9c\xd4\xb8\x02]\x0e\xa5\xa3LL\xc3\xa2\x8f+\x83Z\x1b\x17"
b'\xbfT\xd3\xc7\xfd\x0b\xf4\xd7J\xfe^\x86q"I\xa3x\xbc\xd3$\xe9M<\xe1'
b"\x07\xad\xf2_\x9f\xfa\xf7g(~\xd8\xf5\xe7\xda-\xa3Ko\xfc.\x99\xcf"
b"\x9b\xb9\xc1U\x97\x82'\xcb\xc6\x08\xaa\xa0\xe4\xd0\xc1+\xfc\x86"
b'\r\xe4y\xb1#\xd3\x1dS\x96D28\xc4\xd5\r\xd4\x98\x1a44"\xd7\xc2\xb4'
b"]\xa7\x0f\xa7Db\x85G\x8c\xd6\x94!\x8af1O\xf6g\xd7\x03\xfd\xb3\xbc"
b"\xce\x9f\xe7\x015\xb8\x1d]AHK\xa0\x14m\xda=O\xa7\xde\xf2\xff\x9b"
b"\x8e\x83\xc8j\x11\x1a\x98\x85\xde\xc5\x91\x07\x84!\x12^4\xcb\xa8"
b"\x98\x8a\x8a&#\xb9(#?\x80\x15\x9eW\xb5\x12\xd1\x95S\xf2<G\xeb\xf1"
b"\x14H\xb2\xc4>\xc3A\xed\x86x~\xcfU\xd5Q\xfe~\x10\xd2\x9b"
)

View file

@ -0,0 +1,108 @@
import os
import pytest
import salt.crypt
from tests.support.mock import MagicMock, MockCall, mock_open, patch
from . import MSG, PRIVKEY_DATA, PUBKEY_DATA, SIG
try:
import M2Crypto # pylint: disable=unused-import
HAS_M2 = True
except ImportError:
HAS_M2 = False
try:
from Cryptodome.PublicKey import RSA
HAS_PYCRYPTO_RSA = True
except ImportError:
HAS_PYCRYPTO_RSA = False
if not HAS_PYCRYPTO_RSA:
try:
from Crypto.PublicKey import RSA # nosec
HAS_PYCRYPTO_RSA = True
except ImportError:
HAS_PYCRYPTO_RSA = False
pytestmark = [
pytest.mark.skipif(not HAS_PYCRYPTO_RSA, reason="pycrypto >= 2.6 is not available"),
pytest.mark.skipif(HAS_M2, reason="m2crypto is used by salt.crypt if installed"),
]
@pytest.mark.slow_test
def test_gen_keys():
open_priv_wb = MockCall("/keydir{}keyname.pem".format(os.sep), "wb+")
open_pub_wb = MockCall("/keydir{}keyname.pub".format(os.sep), "wb+")
with patch.multiple(
os,
umask=MagicMock(),
chmod=MagicMock(),
access=MagicMock(return_value=True),
):
with patch("salt.utils.files.fopen", mock_open()) as m_open, patch(
"os.path.isfile", return_value=True
):
result = salt.crypt.gen_keys("/keydir", "keyname", 2048)
assert result == "/keydir{}keyname.pem".format(os.sep), result
assert open_priv_wb not in m_open.calls
assert open_pub_wb not in m_open.calls
with patch("salt.utils.files.fopen", mock_open()) as m_open, patch(
"os.path.isfile", return_value=False
):
salt.crypt.gen_keys("/keydir", "keyname", 2048)
assert open_priv_wb in m_open.calls
assert open_pub_wb in m_open.calls
@patch("os.umask", MagicMock())
@patch("os.chmod", MagicMock())
@patch("os.chown", MagicMock(), create=True)
@patch("os.access", MagicMock(return_value=True))
@pytest.mark.slow_test
def test_gen_keys_with_passphrase():
key_path = os.path.join(os.sep, "keydir")
open_priv_wb = MockCall(os.path.join(key_path, "keyname.pem"), "wb+")
open_pub_wb = MockCall(os.path.join(key_path, "keyname.pub"), "wb+")
with patch("salt.utils.files.fopen", mock_open()) as m_open, patch(
"os.path.isfile", return_value=True
):
assert salt.crypt.gen_keys(
key_path, "keyname", 2048, passphrase="password"
) == os.path.join(key_path, "keyname.pem")
result = salt.crypt.gen_keys(key_path, "keyname", 2048, passphrase="password")
assert result == os.path.join(key_path, "keyname.pem"), result
assert open_priv_wb not in m_open.calls
assert open_pub_wb not in m_open.calls
with patch("salt.utils.files.fopen", mock_open()) as m_open, patch(
"os.path.isfile", return_value=False
):
salt.crypt.gen_keys(key_path, "keyname", 2048)
assert open_priv_wb in m_open.calls
assert open_pub_wb in m_open.calls
def test_sign_message():
key = RSA.importKey(PRIVKEY_DATA)
with patch("salt.crypt.get_rsa_key", return_value=key):
assert SIG == salt.crypt.sign_message("/keydir/keyname.pem", MSG)
def test_sign_message_with_passphrase():
key = RSA.importKey(PRIVKEY_DATA)
with patch("salt.crypt.get_rsa_key", return_value=key):
assert SIG == salt.crypt.sign_message(
"/keydir/keyname.pem", MSG, passphrase="password"
)
def test_verify_signature():
with patch("salt.utils.files.fopen", mock_open(read_data=PUBKEY_DATA)):
assert salt.crypt.verify_signature("/keydir/keyname.pub", MSG, SIG)

View file

@ -0,0 +1,98 @@
import os
import pytest
import salt.crypt
from tests.support.mock import MagicMock, mock_open, patch
from . import MSG, PRIVKEY_DATA, PUBKEY_DATA, SIG
M2Crypto = pytest.importorskip("M2Crypto")
@pytest.mark.slow_test
def test_gen_keys():
with patch("os.umask", MagicMock()), patch("os.chmod", MagicMock()), patch(
"os.access", MagicMock(return_value=True)
):
with patch("M2Crypto.RSA.RSA.save_pem", MagicMock()) as save_pem, patch(
"M2Crypto.RSA.RSA.save_pub_key", MagicMock()
) as save_pub:
with patch("os.path.isfile", return_value=True):
assert salt.crypt.gen_keys(
"/keydir", "keyname", 2048
) == "/keydir{}keyname.pem".format(os.sep)
save_pem.assert_not_called()
save_pub.assert_not_called()
with patch("os.path.isfile", return_value=False):
assert salt.crypt.gen_keys(
"/keydir", "keyname", 2048
) == "/keydir{}keyname.pem".format(os.sep)
save_pem.assert_called_once_with(
"/keydir{}keyname.pem".format(os.sep), cipher=None
)
save_pub.assert_called_once_with("/keydir{}keyname.pub".format(os.sep))
@pytest.mark.slow_test
def test_gen_keys_with_passphrase():
with patch("os.umask", MagicMock()), patch("os.chmod", MagicMock()), patch(
"os.chown", MagicMock()
), patch("os.access", MagicMock(return_value=True)):
with patch("M2Crypto.RSA.RSA.save_pem", MagicMock()) as save_pem, patch(
"M2Crypto.RSA.RSA.save_pub_key", MagicMock()
) as save_pub:
with patch("os.path.isfile", return_value=True):
assert salt.crypt.gen_keys(
"/keydir", "keyname", 2048, passphrase="password"
) == "/keydir{}keyname.pem".format(os.sep)
save_pem.assert_not_called()
save_pub.assert_not_called()
with patch("os.path.isfile", return_value=False):
assert salt.crypt.gen_keys(
"/keydir", "keyname", 2048, passphrase="password"
) == "/keydir{}keyname.pem".format(os.sep)
callback = save_pem.call_args[1]["callback"]
save_pem.assert_called_once_with(
"/keydir{}keyname.pem".format(os.sep),
cipher="des_ede3_cbc",
callback=callback,
)
assert callback(None) == b"password"
save_pub.assert_called_once_with("/keydir{}keyname.pub".format(os.sep))
def test_sign_message():
key = M2Crypto.RSA.load_key_string(salt.utils.stringutils.to_bytes(PRIVKEY_DATA))
with patch("salt.crypt.get_rsa_key", return_value=key):
assert SIG == salt.crypt.sign_message("/keydir/keyname.pem", MSG)
def test_sign_message_with_passphrase():
key = M2Crypto.RSA.load_key_string(salt.utils.stringutils.to_bytes(PRIVKEY_DATA))
with patch("salt.crypt.get_rsa_key", return_value=key):
assert SIG == salt.crypt.sign_message(
"/keydir/keyname.pem", MSG, passphrase="password"
)
def test_verify_signature():
with patch(
"salt.utils.files.fopen",
mock_open(read_data=salt.utils.stringutils.to_bytes(PUBKEY_DATA)),
):
assert salt.crypt.verify_signature("/keydir/keyname.pub", MSG, SIG)
def test_encrypt_decrypt_bin():
priv_key = M2Crypto.RSA.load_key_string(
salt.utils.stringutils.to_bytes(PRIVKEY_DATA)
)
pub_key = M2Crypto.RSA.load_pub_key_bio(
M2Crypto.BIO.MemoryBuffer(salt.utils.stringutils.to_bytes(PUBKEY_DATA))
)
encrypted = salt.crypt.private_encrypt(priv_key, b"salt")
decrypted = salt.crypt.public_decrypt(pub_key, encrypted)
assert b"salt" == decrypted

View file

@ -4,16 +4,36 @@
Test the salt aws functions
"""
import io
import os
import time
from datetime import datetime, timedelta
import pytest
import requests
import salt.utils.aws as aws
from tests.support.helpers import patched_environ
from tests.support.mock import MagicMock, patch
pytestmark = [
# Skip testing on windows since it does not support signals
# which is what the timeout marker is using.
pytest.mark.skip_on_windows,
pytest.mark.timeout(60, method="signal"),
]
@pytest.fixture(autouse=True)
def _cleanup():
# Make sure this cache is clear before each test
aws.__AssumeCache__.clear()
# Remove any AWS_ prefixed environment variables
with patched_environ(
__cleanup__=[k for k in os.environ if k.startswith("AWS_")],
):
yield
def test_get_metadata_imdsv1():
response = requests.Response()

241
tests/unit/test_crypt.py Normal file
View file

@ -0,0 +1,241 @@
import os
import shutil
import tempfile
import pytest
import salt.utils.files
import salt.utils.stringutils
from tests.support.mock import mock_open, patch
from tests.support.unit import TestCase
try:
import M2Crypto
HAS_M2 = True
except ImportError:
HAS_M2 = False
try:
from Cryptodome.PublicKey import RSA # pylint: disable=unused-import
HAS_PYCRYPTO_RSA = True
except ImportError:
HAS_PYCRYPTO_RSA = False
if not HAS_PYCRYPTO_RSA:
try:
from Crypto.PublicKey import RSA # nosec
HAS_PYCRYPTO_RSA = True
except ImportError:
HAS_PYCRYPTO_RSA = False
PRIVKEY_DATA = (
"-----BEGIN RSA PRIVATE KEY-----\n"
"MIIEpAIBAAKCAQEA75GR6ZTv5JOv90Vq8tKhKC7YQnhDIo2hM0HVziTEk5R4UQBW\n"
"a0CKytFMbTONY2msEDwX9iA0x7F5Lgj0X8eD4ZMsYqLzqjWMekLC8bjhxc+EuPo9\n"
"Dygu3mJ2VgRC7XhlFpmdo5NN8J2E7B/CNB3R4hOcMMZNZdi0xLtFoTfwU61UPfFX\n"
"14mV2laqLbvDEfQLJhUTDeFFV8EN5Z4H1ttLP3sMXJvc3EvM0JiDVj4l1TWFUHHz\n"
"eFgCA1Im0lv8i7PFrgW7nyMfK9uDSsUmIp7k6ai4tVzwkTmV5PsriP1ju88Lo3MB\n"
"4/sUmDv/JmlZ9YyzTO3Po8Uz3Aeq9HJWyBWHAQIDAQABAoIBAGOzBzBYZUWRGOgl\n"
"IY8QjTT12dY/ymC05GM6gMobjxuD7FZ5d32HDLu/QrknfS3kKlFPUQGDAbQhbbb0\n"
"zw6VL5NO9mfOPO2W/3FaG1sRgBQcerWonoSSSn8OJwVBHMFLG3a+U1Zh1UvPoiPK\n"
"S734swIM+zFpNYivGPvOm/muF/waFf8tF/47t1cwt/JGXYQnkG/P7z0vp47Irpsb\n"
"Yjw7vPe4BnbY6SppSxscW3KoV7GtJLFKIxAXbxsuJMF/rYe3O3w2VKJ1Sug1VDJl\n"
"/GytwAkSUer84WwP2b07Wn4c5pCnmLslMgXCLkENgi1NnJMhYVOnckxGDZk54hqP\n"
"9RbLnkkCgYEA/yKuWEvgdzYRYkqpzB0l9ka7Y00CV4Dha9Of6GjQi9i4VCJ/UFVr\n"
"UlhTo5y0ZzpcDAPcoZf5CFZsD90a/BpQ3YTtdln2MMCL/Kr3QFmetkmDrt+3wYnX\n"
"sKESfsa2nZdOATRpl1antpwyD4RzsAeOPwBiACj4fkq5iZJBSI0bxrMCgYEA8GFi\n"
"qAjgKh81/Uai6KWTOW2kX02LEMVRrnZLQ9VPPLGid4KZDDk1/dEfxjjkcyOxX1Ux\n"
"Klu4W8ZEdZyzPcJrfk7PdopfGOfrhWzkREK9C40H7ou/1jUecq/STPfSOmxh3Y+D\n"
"ifMNO6z4sQAHx8VaHaxVsJ7SGR/spr0pkZL+NXsCgYEA84rIgBKWB1W+TGRXJzdf\n"
"yHIGaCjXpm2pQMN3LmP3RrcuZWm0vBt94dHcrR5l+u/zc6iwEDTAjJvqdU4rdyEr\n"
"tfkwr7v6TNlQB3WvpWanIPyVzfVSNFX/ZWSsAgZvxYjr9ixw6vzWBXOeOb/Gqu7b\n"
"cvpLkjmJ0wxDhbXtyXKhZA8CgYBZyvcQb+hUs732M4mtQBSD0kohc5TsGdlOQ1AQ\n"
"McFcmbpnzDghkclyW8jzwdLMk9uxEeDAwuxWE/UEvhlSi6qdzxC+Zifp5NBc0fVe\n"
"7lMx2mfJGxj5CnSqQLVdHQHB4zSXkAGB6XHbBd0MOUeuvzDPfs2voVQ4IG3FR0oc\n"
"3/znuwKBgQChZGH3McQcxmLA28aUwOVbWssfXKdDCsiJO+PEXXlL0maO3SbnFn+Q\n"
"Tyf8oHI5cdP7AbwDSx9bUfRPjg9dKKmATBFr2bn216pjGxK0OjYOCntFTVr0psRB\n"
"CrKg52Qrq71/2l4V2NLQZU40Dr1bN9V+Ftd9L0pvpCAEAWpIbLXGDw==\n"
"-----END RSA PRIVATE KEY-----"
)
PUBKEY_DATA = (
"-----BEGIN PUBLIC KEY-----\n"
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA75GR6ZTv5JOv90Vq8tKh\n"
"KC7YQnhDIo2hM0HVziTEk5R4UQBWa0CKytFMbTONY2msEDwX9iA0x7F5Lgj0X8eD\n"
"4ZMsYqLzqjWMekLC8bjhxc+EuPo9Dygu3mJ2VgRC7XhlFpmdo5NN8J2E7B/CNB3R\n"
"4hOcMMZNZdi0xLtFoTfwU61UPfFX14mV2laqLbvDEfQLJhUTDeFFV8EN5Z4H1ttL\n"
"P3sMXJvc3EvM0JiDVj4l1TWFUHHzeFgCA1Im0lv8i7PFrgW7nyMfK9uDSsUmIp7k\n"
"6ai4tVzwkTmV5PsriP1ju88Lo3MB4/sUmDv/JmlZ9YyzTO3Po8Uz3Aeq9HJWyBWH\n"
"AQIDAQAB\n"
"-----END PUBLIC KEY-----"
)
MSG = b"It's me, Mario"
SIG = (
b"\x07\xf3\xb1\xe7\xdb\x06\xf4_\xe2\xdc\xcb!F\xfb\xbex{W\x1d\xe4E"
b"\xd3\r\xc5\x90\xca(\x05\x1d\x99\x8b\x1aug\x9f\x95>\x94\x7f\xe3+"
b"\x12\xfa\x9c\xd4\xb8\x02]\x0e\xa5\xa3LL\xc3\xa2\x8f+\x83Z\x1b\x17"
b'\xbfT\xd3\xc7\xfd\x0b\xf4\xd7J\xfe^\x86q"I\xa3x\xbc\xd3$\xe9M<\xe1'
b"\x07\xad\xf2_\x9f\xfa\xf7g(~\xd8\xf5\xe7\xda-\xa3Ko\xfc.\x99\xcf"
b"\x9b\xb9\xc1U\x97\x82'\xcb\xc6\x08\xaa\xa0\xe4\xd0\xc1+\xfc\x86"
b'\r\xe4y\xb1#\xd3\x1dS\x96D28\xc4\xd5\r\xd4\x98\x1a44"\xd7\xc2\xb4'
b"]\xa7\x0f\xa7Db\x85G\x8c\xd6\x94!\x8af1O\xf6g\xd7\x03\xfd\xb3\xbc"
b"\xce\x9f\xe7\x015\xb8\x1d]AHK\xa0\x14m\xda=O\xa7\xde\xf2\xff\x9b"
b"\x8e\x83\xc8j\x11\x1a\x98\x85\xde\xc5\x91\x07\x84!\x12^4\xcb\xa8"
b"\x98\x8a\x8a&#\xb9(#?\x80\x15\x9eW\xb5\x12\xd1\x95S\xf2<G\xeb\xf1"
b"\x14H\xb2\xc4>\xc3A\xed\x86x~\xcfU\xd5Q\xfe~\x10\xd2\x9b"
)
class TestBadCryptodomePubKey(TestCase):
"""
Test that we can load public keys exported by pycrpytodome<=3.4.6
"""
TEST_KEY = (
"-----BEGIN RSA PUBLIC KEY-----\n"
"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzLtFhsvfbFDFaUgulSEX\n"
"Gl12XriL1DT78Ef2/u8HHaSMmPie37BLWas/zaHwI6066bIyYQJ/nUCahTaoHM7L\n"
"GlWc0wOU6zyfpihCRQHil05Y6F+olFBoZuYbFPvtp7/hJx/D7I/0n2o/c7M5i3Y2\n"
"3sBxAYNooIQHXHUmPQW6C9iu95ylZDW8JQzYy/EI4vCC8yQMdTK8jK1FQV0Sbwny\n"
"qcMxSyAWDoFbnhh2P2TnO8HOWuUOaXR8ZHOJzVcDl+a6ew+medW090x3K5O1f80D\n"
"+WjgnG6b2HG7VQpOCfM2GALD/FrxicPilvZ38X1aLhJuwjmVE4LAAv8DVNJXohaO\n"
"WQIDAQAB\n"
"-----END RSA PUBLIC KEY-----\n"
)
def setUp(self):
self.test_dir = tempfile.mkdtemp()
self.key_path = os.path.join(self.test_dir, "cryptodom-3.4.6.pub")
with salt.utils.files.fopen(self.key_path, "wb") as fd:
fd.write(self.TEST_KEY.encode())
def tearDown(self):
shutil.rmtree(self.test_dir)
@pytest.mark.skipif(not HAS_M2, reason="Skip when m2crypto is not installed")
def test_m2_bad_key(self):
"""
Load public key with an invalid header using m2crypto and validate it
"""
key = salt.crypt.get_rsa_pub_key(self.key_path)
assert key.check_key() == 1
@pytest.mark.skipif(HAS_M2, reason="Skip when m2crypto is installed")
def test_crypto_bad_key(self):
"""
Load public key with an invalid header and validate it without m2crypto
"""
key = salt.crypt.get_rsa_pub_key(self.key_path)
assert key.can_encrypt()
class TestM2CryptoRegression47124(TestCase):
SIGNATURE = (
b"w\xac\xfe18o\xeb\xfb\x14+\x9e\xd1\xb7\x7fe}\xec\xd6\xe1P\x9e\xab"
b"\xb5\x07\xe0\xc1\xfd\xda#\x04Z\x8d\x7f\x0b\x1f}:~\xb2s\x860u\x02N"
b'\xd4q"\xb7\x86*\x8f\x1f\xd0\x9d\x11\x92\xc5~\xa68\xac>\x12H\xc2%y,'
b"\xe6\xceU\x1e\xa3?\x0c,\xf0u\xbb\xd0[g_\xdd\x8b\xb0\x95:Y\x18\xa5*"
b"\x99\xfd\xf3K\x92\x92 ({\xd1\xff\xd9F\xc8\xd6K\x86e\xf9\xa8\xad\xb0z"
b"\xe3\x9dD\xf5k\x8b_<\xe7\xe7\xec\xf3\"'\xd5\xd2M\xb4\xce\x1a\xe3$"
b"\x9c\x81\xad\xf9\x11\xf6\xf5>)\xc7\xdd\x03&\xf7\x86@ks\xa6\x05\xc2"
b"\xd0\xbd\x1a7\xfc\xde\xe6\xb0\xad!\x12#\xc86Y\xea\xc5\xe3\xe2\xb3"
b"\xc9\xaf\xfa\x0c\xf2?\xbf\x93w\x18\x9e\x0b\xa2a\x10:M\x05\x89\xe2W.Q"
b"\xe8;yGT\xb1\xf2\xc6A\xd2\xc4\xbeN\xb3\xcfS\xaf\x03f\xe2\xb4)\xe7\xf6"
b'\xdbs\xd0Z}8\xa4\xd2\x1fW*\xe6\x1c"\x8b\xd0\x18w\xb9\x7f\x9e\x96\xa3'
b"\xd9v\xf7\x833\x8e\x01"
)
@pytest.mark.skipif(not HAS_M2, reason="Skip when m2crypto is not installed")
def test_m2crypto_verify_bytes(self):
message = salt.utils.stringutils.to_unicode("meh")
with patch(
"salt.utils.files.fopen",
mock_open(read_data=salt.utils.stringutils.to_bytes(PUBKEY_DATA)),
):
salt.crypt.verify_signature("/keydir/keyname.pub", message, self.SIGNATURE)
@pytest.mark.skipif(not HAS_M2, reason="Skip when m2crypto is not installed")
def test_m2crypto_verify_unicode(self):
message = salt.utils.stringutils.to_bytes("meh")
with patch(
"salt.utils.files.fopen",
mock_open(read_data=salt.utils.stringutils.to_bytes(PUBKEY_DATA)),
):
salt.crypt.verify_signature("/keydir/keyname.pub", message, self.SIGNATURE)
@pytest.mark.skipif(not HAS_M2, reason="Skip when m2crypto is not installed")
def test_m2crypto_sign_bytes(self):
message = salt.utils.stringutils.to_unicode("meh")
key = M2Crypto.RSA.load_key_string(
salt.utils.stringutils.to_bytes(PRIVKEY_DATA)
)
with patch("salt.crypt.get_rsa_key", return_value=key):
signature = salt.crypt.sign_message(
"/keydir/keyname.pem", message, passphrase="password"
)
self.assertEqual(signature, self.SIGNATURE)
@pytest.mark.skipif(not HAS_M2, reason="Skip when m2crypto is not installed")
def test_m2crypto_sign_unicode(self):
message = salt.utils.stringutils.to_bytes("meh")
key = M2Crypto.RSA.load_key_string(
salt.utils.stringutils.to_bytes(PRIVKEY_DATA)
)
with patch("salt.crypt.get_rsa_key", return_value=key):
signature = salt.crypt.sign_message(
"/keydir/keyname.pem", message, passphrase="password"
)
self.assertEqual(signature, self.SIGNATURE)
@pytest.mark.skipif(
not HAS_M2 and not HAS_PYCRYPTO_RSA,
reason="No crypto library found. Install either M2Crypto or Cryptodome to run this test",
)
class TestCrypt(TestCase):
def test_pwdata_decrypt(self):
key_string = """-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEAzhBRyyHa7b63RLE71uKMKgrpulcAJjaIaN68ltXcCvy4w9pi
Kj+4I3Qp6RvUaHOEmymqyjOMjQc6iwpe0scCFqh3nUk5YYaLZ3WAW0htQVlnesgB
ZiBg9PBeTQY/LzqtudL6RCng/AX+fbnCsddlIysRxnUoNVMvz0gAmCY2mnTDjcTt
pyxuk2T0AHSHNCKCalm75L1bWDFF+UzFemf536tBfBUGRWR6jWTij85vvCntxHS/
HdknaTJ50E7XGVzwBJpCyV4Y2VXuW/3KrCNTqXw+jTmEw0vlcshfDg/vb3IxsUSK
5KuHalKq/nUIc+F4QCJOl+A10goGdIfYC1/67QIDAQABAoIBAAOP+qoFWtCTZH22
hq9PWVb8u0+yY1lFxhPyDdaZueUiu1r/coUCdv996Z+TEJgBr0AzdzVpsLtbbaKr
ujnwoNOdc/vvISPTfKN8P4zUcrcXgZd4z7VhR+vUH/0652q8m/ZDdHorMy2IOP8Z
cAk9DQ2PmA4TRm+tkX0G5KO8vWLsK921aRMWdsKJyQ0lYxl7M8JWupFsCJFr/U+8
dAVtwnUiS7RnhBABZ1cfNTHYhXVAh4d+a9y/gZ00a66OGqPxiXfhjjDUZ6fGvWKN
FlhKWEg6YqIx/H4aNXkLI5Rzzhdx/c2ukNm7+X2veRcAW7bcTwk8wxJxciEP5pBi
1el9VE0CgYEA/lbzdE2M4yRBvTfYYC6BqZcn+BqtrAUc2h3fEy+p7lwlet0af1id
gWpYpOJyLc0AUfR616/m2y3PwEH/nMKDSTuU7o/qKNtlHW0nQcnhDCjTUydS3+J/
JM3dhfgVqi03rjqNcgHA2eOEwcu/OBZtiaC0wqKbuRZRtfGffyoO3ssCgYEAz2iw
wqu/NkA+MdQIxz/a3Is7gGwoFu6h7O+XU2uN8Y2++jSBw9AzzWj31YCvyjuJPAE+
gxHm6yOnNoLVn423NtibHejhabzHNIK6UImH99bSTKabsxfF2BX6v982BimU1jwc
bYykzws37oN/poPb5FTpEiAUrsd2bAMn/1S43icCgYEAulHkY0z0aumCpyUkA8HO
BvjOtPiGRcAxFLBRXPLL3+vtIQachLHcIJRRf+jLkDXfiCo7W4pm6iWzTbqLkMEG
AD3/qowPFAM1Hct6uL01efzmYsIp+g0o60NMhvnolRQu+Bm4yM30AyqjdHzYBjSX
5fyuru8EeSCal1j8aOHcpuUCgYEAhGhDH6Pg59NPYSQJjpm3MMA59hwV473n5Yh2
xKyO6zwgRT6r8MPDrkhqnwQONT6Yt5PbwnT1Q/t4zhXsJnWkFwFk1U1MSeJYEa+7
HZsPECs2CfT6xPRSO0ac00y+AmUdPT8WruDwfbSdukh8f2MCR9vlBsswKPvxH7dM
G3aMplUCgYEAmMFgB/6Ox4OsQPPC6g4G+Ezytkc4iVkMEcjiVWzEsYATITjq3weO
/XDGBYJoBhYwWPi9oBufFc/2pNtWy1FKKXPuVyXQATdA0mfEPbtsHjMFQNZbeKnm
0na/SysSDCK3P+9ijlbjqLjMmPEmhJxGWTJ7khnTTkfre7/w9ZxJxi8=
-----END RSA PRIVATE KEY-----"""
pwdata = b"""\
V\x80+b\xca\x06M\xb6\x12\xc6\xe8\xf2\xb5\xbb\xd8m\xc0\x97\x9a\xeb\xb9q\x19\xc3\
\xcdi\xb84\x90\xaf\x12kT\xe2@u\xd6\xe8T\x89\xa3\xc7\xb2Y\xd1N\x00\xa9\xc0"\xbe\
\xed\xb1\xc3\xb7^\xbf\xbd\x8b\x13\xd3/L\x1b\xa1`\xe2\xea\x03\x98\x82\xf3uS&|\
\xe5\xd8J\xce\xfc\x97\x8d\x0b\x949\xc0\xbd^\xef\xc6\xfd\xce\xbb\x1e\xd0"(m\xe1\
\x95\xfb\xc8/\x07\x93\xb8\xda\x8f\x99\xfe\xdc\xd5\xcb\xdb\xb2\xf11M\xdbD\xcf\
\x95\x13p\r\xa4\x1c{\xd5\xdb\xc7\xe5\xaf\x95F\x97\xa9\x00p~\xb5\xec\xa4.\xd0\
\xa4\xb4\xf4f\xcds,Y/\xa1:WF\xb8\xc7\x07\xaa\x0b<\'~\x1b$D9\xd4\x8d\xf0x\xc5\
\xee\xa8:\xe6\x00\x10\xc5i\x11\xc7]C8\x05l\x8b\x9b\xc3\x83e\xf7y\xadi:0\xb4R\
\x1a(\x04&yL8\x19s\n\x11\x81\xfd?\xfb2\x80Ll\xa1\xdc\xc9\xb6P\xca\x8d\'\x11\xc1\
\x07\xa5\xa1\x058\xc7\xce\xbeb\x92\xbf\x0bL\xec\xdf\xc3M\x83\xfb$\xec\xd5\xf9\
"""
self.assertEqual("1234", salt.crypt.pwdata_decrypt(key_string, pwdata))

View file

@ -257,6 +257,10 @@ def pre_archive_cleanup(ctx: Context, cleanup_path: str, pkg: bool = False):
else:
yield patterns
exclude_patterns = set()
for pattern in unnest_lists(patterns["exclude_patterns"]):
exclude_patterns.add(pattern)
dir_patterns = set()
for pattern in unnest_lists(patterns["dir_patterns"]):
dir_patterns.add(pattern)
@ -271,6 +275,16 @@ def pre_archive_cleanup(ctx: Context, cleanup_path: str, pkg: bool = False):
if not path.exists():
continue
match_path = path.as_posix()
skip_match = False
for pattern in exclude_patterns:
if fnmatch.fnmatch(str(match_path), pattern):
ctx.info(
f"Excluded file: {match_path}; Matching pattern: {pattern!r}"
)
skip_match = True
break
if skip_match:
continue
for pattern in dir_patterns:
if fnmatch.fnmatch(str(match_path), pattern):
ctx.info(
@ -283,6 +297,16 @@ def pre_archive_cleanup(ctx: Context, cleanup_path: str, pkg: bool = False):
if not path.exists():
continue
match_path = path.as_posix()
skip_match = False
for pattern in exclude_patterns:
if fnmatch.fnmatch(str(match_path), pattern):
ctx.info(
f"Excluded file: {match_path}; Matching pattern: {pattern!r}"
)
skip_match = True
break
if skip_match:
continue
for pattern in file_patterns:
if fnmatch.fnmatch(str(match_path), pattern):
ctx.info(

View file

@ -48,7 +48,7 @@ ts = command_group(name="ts", help="Test Suite Related Commands", description=__
},
"platform": {
"help": "The onedir platform artifact to download",
"choices": ("linux", "darwin", "windows"),
"choices": ("linux", "macos", "windows"),
"required": True,
},
"arch": {
@ -146,7 +146,12 @@ def setup_testsuite(
if exitcode and exitcode != ExitCode.SOFT_FAIL:
ctx.exit(exitcode)
exitcode = tools.utils.gh.download_nox_artifact(
ctx, run_id=run_id, slug=slug, nox_env="ci-test-onedir", repository=repository
ctx,
run_id=run_id,
platform=platform,
arch=arch,
nox_env="ci-test-onedir",
repository=repository,
)
if exitcode and exitcode != ExitCode.SOFT_FAIL:
ctx.exit(exitcode)

View file

@ -77,10 +77,15 @@ def download_onedir_artifact(
"help": "The workflow run ID from where to download artifacts from",
"required": True,
},
"slug": {
"help": "The OS slug",
"platform": {
"help": "The onedir platform artifact to download",
"choices": ("linux", "macos", "windows"),
"required": True,
},
"arch": {
"help": "The onedir artifact architecture",
"choices": ("x86_64", "aarch64", "amd64", "x86"),
"required": True,
"choices": OS_SLUGS,
},
"nox_env": {
"help": "The nox environment name.",
@ -93,7 +98,8 @@ def download_onedir_artifact(
def download_nox_artifact(
ctx: Context,
run_id: int = None,
slug: str = None,
platform: str = None,
arch: str = None,
nox_env: str = "ci-test-onedir",
repository: str = "saltstack/salt",
):
@ -102,14 +108,16 @@ def download_nox_artifact(
"""
if TYPE_CHECKING:
assert run_id is not None
assert slug is not None
if slug.endswith("arm64"):
slug = slug.replace("-arm64", "")
nox_env += "-aarch64"
assert arch is not None
assert platform is not None
exitcode = tools.utils.gh.download_nox_artifact(
ctx=ctx, run_id=run_id, slug=slug, nox_env=nox_env, repository=repository
ctx=ctx,
run_id=run_id,
platform=platform,
arch=arch,
nox_env=nox_env,
repository=repository,
)
ctx.exit(exitcode)

View file

@ -105,8 +105,9 @@ def download_onedir_artifact(
def download_nox_artifact(
ctx: Context,
platform: str,
arch: str,
run_id: int = None,
slug: str = None,
nox_env: str = "ci-test-onedir",
repository: str = "saltstack/salt",
) -> ExitCode:
@ -115,7 +116,8 @@ def download_nox_artifact(
"""
if TYPE_CHECKING:
assert run_id is not None
assert slug is not None
assert arch is not None
assert platform is not None
artifacts_path = tools.utils.REPO_ROOT / ".nox" / nox_env
if artifacts_path.exists():
@ -123,7 +125,7 @@ def download_nox_artifact(
f"The '.nox/{nox_env}' directory already exists ... Stopped processing."
)
return ExitCode.SOFT_FAIL
artifact_name = f"nox-{slug}-{nox_env}"
artifact_name = f"nox-{platform}-{arch}-{nox_env}"
ctx.info(
f"Searching for artifact {artifact_name} from run_id {run_id} in repository {repository} ..."
)
@ -139,7 +141,14 @@ def download_nox_artifact(
ctx.error("Could not find the 'nox' binary in $PATH")
return ExitCode.FAIL
ret = ctx.run(
nox, "--force-color", "-e", "decompress-dependencies", "--", slug, check=False
nox,
"--force-color",
"-e",
"decompress-dependencies",
"--",
platform,
arch,
check=False,
)
if ret.returncode:
ctx.error("Failed to decompress the nox dependencies")