diff --git a/_lastrevision b/_lastrevision index da4e139..7cf99d5 100644 --- a/_lastrevision +++ b/_lastrevision @@ -1 +1 @@ -52475d78d58db61df54486af13c5eb4055c2d12e \ No newline at end of file +4b7e8cbf000c33224e9cd7a7eb581954ca3dbbec \ No newline at end of file diff --git a/make-lazyloader.__init__-call-to-_refresh_file_mappi.patch b/make-lazyloader.__init__-call-to-_refresh_file_mappi.patch new file mode 100644 index 0000000..277808a --- /dev/null +++ b/make-lazyloader.__init__-call-to-_refresh_file_mappi.patch @@ -0,0 +1,29 @@ +From 6af6a52165c70c3be7c8d339a3dd5e539f3c1772 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= + +Date: Thu, 23 Apr 2020 09:54:53 +0100 +Subject: [PATCH] Make LazyLoader.__init__ call to + _refresh_file_mapping thread-safe (bsc#1169604) + +--- + salt/loader.py | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/salt/loader.py b/salt/loader.py +index 5bd4773645c77a133701982e19d19739be00a38f..54dadb0b513dbaa4914b0d4b1d343dde709699ad 100644 +--- a/salt/loader.py ++++ b/salt/loader.py +@@ -1251,7 +1251,8 @@ class LazyLoader(salt.utils.lazy.LazyDict): + self.suffix_order.append(suffix) + + self._lock = threading.RLock() +- self._refresh_file_mapping() ++ with self._lock: ++ self._refresh_file_mapping() + + super(LazyLoader, self).__init__() # late init the lazy loader + # create all of the import namespaces +-- +2.23.0 + + diff --git a/msgpack-support-versions-1.0.0.patch b/msgpack-support-versions-1.0.0.patch new file mode 100644 index 0000000..4ed2394 --- /dev/null +++ b/msgpack-support-versions-1.0.0.patch @@ -0,0 +1,72 @@ +From ef23c1d53e99e19e5b03658aa62b67cfef9adce5 Mon Sep 17 00:00:00 2001 +From: Alberto Planas +Date: Thu, 7 May 2020 12:40:55 +0200 +Subject: [PATCH] msgpack: support versions >= 1.0.0 + +A recent change in msgpack >= 1.0.0, update the default value for the +parameter `raw` to False. This change breaks Salt for those versions. + +This patch add the parameter `raw=True` to all the unpack operations, +restoring the old default. + +Fix bsc#1171257 + +(cherry picked from commit 1b3939fb01fc3405d8d222f118617220aecee092) +--- + salt/utils/msgpack.py | 20 +++++++++++++++++--- + 1 file changed, 17 insertions(+), 3 deletions(-) + +diff --git a/salt/utils/msgpack.py b/salt/utils/msgpack.py +index 4b5a256513..027fe81a18 100644 +--- a/salt/utils/msgpack.py ++++ b/salt/utils/msgpack.py +@@ -69,12 +69,26 @@ def _sanitize_msgpack_kwargs(kwargs): + return kwargs + + ++def _sanitize_msgpack_unpack_kwargs(kwargs): ++ """ ++ Clean up msgpack keyword arguments for unpack operations, based on ++ the version ++ https://github.com/msgpack/msgpack-python/blob/master/ChangeLog.rst ++ """ ++ assert isinstance(kwargs, dict) ++ if version >= (1, 0, 0) and kwargs.get("raw", None) is None: ++ log.info("adding `raw=True` argument to msgpack call") ++ kwargs["raw"] = True ++ ++ return _sanitize_msgpack_kwargs(kwargs) ++ ++ + class Unpacker(msgpack.Unpacker): + ''' + Wraps the msgpack.Unpacker and removes non-relevant arguments + ''' + def __init__(self, *args, **kwargs): +- msgpack.Unpacker.__init__(self, *args, **_sanitize_msgpack_kwargs(kwargs)) ++ msgpack.Unpacker.__init__(self, *args, **_sanitize_msgpack_unpack_kwargs(kwargs)) + + + def pack(o, stream, **kwargs): +@@ -113,7 +127,7 @@ def unpack(stream, **kwargs): + By default, this function uses the msgpack module and falls back to + msgpack_pure, if the msgpack is not available. + ''' +- return msgpack.unpack(stream, **_sanitize_msgpack_kwargs(kwargs)) ++ return msgpack.unpack(stream, **_sanitize_msgpack_unpack_kwargs(kwargs)) + + + def unpackb(packed, **kwargs): +@@ -125,7 +139,7 @@ def unpackb(packed, **kwargs): + By default, this function uses the msgpack module and falls back to + msgpack_pure. + ''' +- return msgpack.unpackb(packed, **_sanitize_msgpack_kwargs(kwargs)) ++ return msgpack.unpackb(packed, **_sanitize_msgpack_unpack_kwargs(kwargs)) + + + # alias for compatibility to simplejson/marshal/pickle. +-- +2.26.1 + + diff --git a/prevent-logging-deadlock-on-salt-api-subprocesses-bs.patch b/prevent-logging-deadlock-on-salt-api-subprocesses-bs.patch new file mode 100644 index 0000000..3fd06d9 --- /dev/null +++ b/prevent-logging-deadlock-on-salt-api-subprocesses-bs.patch @@ -0,0 +1,256 @@ +From 217c5ba75b5de813ddf769e7eeebe4027c1c9a70 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Pablo=20Su=C3=A1rez=20Hern=C3=A1ndez?= + +Date: Wed, 22 Jan 2020 08:19:55 +0000 +Subject: [PATCH] Prevent logging deadlock on salt-api subprocesses + (bsc#1159284) + +--- + salt/_logging/impl.py | 60 ++++++++++++++++++++--------------- + salt/client/ssh/__init__.py | 16 +++++++--- + salt/client/ssh/client.py | 9 +++++- + salt/client/ssh/wrapper/cp.py | 2 +- + salt/loader.py | 2 +- + salt/utils/lazy.py | 5 ++- + 6 files changed, 61 insertions(+), 33 deletions(-) + +diff --git a/salt/_logging/impl.py b/salt/_logging/impl.py +index 347259bcf506705e2ea1a24da030a7132eb8a527..fdfabf6d3b16619350107bd01f2c3a606fb93262 100644 +--- a/salt/_logging/impl.py ++++ b/salt/_logging/impl.py +@@ -19,6 +19,7 @@ PROFILE = logging.PROFILE = 15 + TRACE = logging.TRACE = 5 + GARBAGE = logging.GARBAGE = 1 + QUIET = logging.QUIET = 1000 ++DEBUG = logging.DEBUG = 10 + + # Import Salt libs + from salt._logging.handlers import StreamHandler +@@ -187,11 +188,11 @@ class SaltLoggingClass(six.with_metaclass(LoggingMixinMeta, LOGGING_LOGGER_CLASS + ''' + instance = super(SaltLoggingClass, cls).__new__(cls) + +- try: +- max_logger_length = len(max( +- list(logging.Logger.manager.loggerDict), key=len +- )) +- for handler in logging.root.handlers: ++ max_logger_length = len(max( ++ list(logging.Logger.manager.loggerDict), key=len ++ )) ++ for handler in logging.root.handlers: ++ try: + if handler in (LOGGING_NULL_HANDLER, + LOGGING_STORE_HANDLER, + LOGGING_TEMP_HANDLER): +@@ -210,18 +211,15 @@ class SaltLoggingClass(six.with_metaclass(LoggingMixinMeta, LOGGING_LOGGER_CLASS + match = MODNAME_PATTERN.search(fmt) + if not match: + # Not matched. Release handler and return. +- handler.release() + return instance + + if 'digits' not in match.groupdict(): + # No digits group. Release handler and return. +- handler.release() + return instance + + digits = match.group('digits') + if not digits or not (digits and digits.isdigit()): + # No valid digits. Release handler and return. +- handler.release() + return instance + + if int(digits) < max_logger_length: +@@ -233,9 +231,14 @@ class SaltLoggingClass(six.with_metaclass(LoggingMixinMeta, LOGGING_LOGGER_CLASS + ) + handler.setFormatter(formatter) + handler.release() +- except ValueError: +- # There are no registered loggers yet +- pass ++ except ValueError: ++ # There are no registered loggers yet ++ pass ++ finally: ++ try: ++ handler.release() ++ except: ++ pass + return instance + + def _log(self, level, msg, args, exc_info=None, +@@ -278,20 +281,26 @@ class SaltLoggingClass(six.with_metaclass(LoggingMixinMeta, LOGGING_LOGGER_CLASS + else: + extra['exc_info_on_loglevel'] = exc_info_on_loglevel + +- if sys.version_info < (3,): +- LOGGING_LOGGER_CLASS._log( +- self, level, msg, args, exc_info=exc_info, extra=extra +- ) +- elif sys.version_info < (3, 8): +- LOGGING_LOGGER_CLASS._log( +- self, level, msg, args, exc_info=exc_info, extra=extra, +- stack_info=stack_info +- ) +- else: +- LOGGING_LOGGER_CLASS._log( +- self, level, msg, args, exc_info=exc_info, extra=extra, +- stack_info=stack_info, stacklevel=stacklevel +- ) ++ try: ++ logging._acquireLock() ++ if sys.version_info < (3,): ++ LOGGING_LOGGER_CLASS._log( ++ self, level, msg, args, exc_info=exc_info, extra=extra ++ ) ++ elif sys.version_info < (3, 8): ++ LOGGING_LOGGER_CLASS._log( ++ self, level, msg, args, exc_info=exc_info, extra=extra, ++ stack_info=stack_info ++ ) ++ else: ++ LOGGING_LOGGER_CLASS._log( ++ self, level, msg, args, exc_info=exc_info, extra=extra, ++ stack_info=stack_info, stacklevel=stacklevel ++ ) ++ except: ++ pass ++ finally: ++ logging._releaseLock() + + def makeRecord(self, name, level, fn, lno, msg, args, exc_info, + func=None, extra=None, sinfo=None): +@@ -393,6 +402,7 @@ if logging.getLoggerClass() is not SaltLoggingClass: + logging.addLevelName(PROFILE, 'PROFILE') + logging.addLevelName(TRACE, 'TRACE') + logging.addLevelName(GARBAGE, 'GARBAGE') ++ logging.addLevelName(DEBUG, 'DEBUG') + + # ----- REMOVE ON REFACTORING COMPLETE --------------------------------------------------------------------------> + if not logging.root.handlers: +diff --git a/salt/client/ssh/__init__.py b/salt/client/ssh/__init__.py +index d9e91b0f50bfaa76d519fcaa4bdc868bce80f554..e8aad093e0f6df32faa16a838f1db2c6746e1b8e 100644 +--- a/salt/client/ssh/__init__.py ++++ b/salt/client/ssh/__init__.py +@@ -520,7 +520,9 @@ class SSH(object): + mine=mine, + **target) + ret = {'id': single.id} ++ logging._acquireLock() + stdout, stderr, retcode = single.run() ++ logging._releaseLock() + # This job is done, yield + try: + data = salt.utils.json.find_json(stdout) +@@ -586,10 +588,16 @@ class SSH(object): + self.targets[host], + mine, + ) +- routine = Process( +- target=self.handle_routine, +- args=args) +- routine.start() ++ try: ++ logging._acquireLock() ++ routine = Process( ++ target=self.handle_routine, ++ args=args) ++ routine.start() ++ except: ++ pass ++ finally: ++ logging._releaseLock() + running[host] = {'thread': routine} + continue + ret = {} +diff --git a/salt/client/ssh/client.py b/salt/client/ssh/client.py +index e8e634ca12d85f1e1a9e047f43eac8c041cc5666..d4a89cf4fbbde5282597dc6b82c66dde4288edf1 100644 +--- a/salt/client/ssh/client.py ++++ b/salt/client/ssh/client.py +@@ -6,6 +6,8 @@ import os + import copy + import logging + import random ++import time ++import multiprocessing + + # Import Salt libs + import salt.config +@@ -15,6 +17,7 @@ from salt.exceptions import SaltClientError # Temporary + + log = logging.getLogger(__name__) + ++_LOCK = multiprocessing.Lock() + + class SSHClient(object): + ''' +@@ -61,7 +64,11 @@ class SSHClient(object): + opts['selected_target_option'] = tgt_type + opts['tgt'] = tgt + opts['arg'] = arg +- return salt.client.ssh.SSH(opts) ++ _LOCK.acquire() ++ ret = salt.client.ssh.SSH(opts) ++ time.sleep(0.01) ++ _LOCK.release() ++ return ret + + def cmd_iter( + self, +diff --git a/salt/client/ssh/wrapper/cp.py b/salt/client/ssh/wrapper/cp.py +index 894e62f94c87ae5b68c1f82fc3e80ec8f25ac118..9bf0c150a071b4bfa780fe0293e3d8e93ab8e6ef 100644 +--- a/salt/client/ssh/wrapper/cp.py ++++ b/salt/client/ssh/wrapper/cp.py +@@ -4,7 +4,7 @@ Wrap the cp module allowing for managed ssh file transfers + ''' + # Import Python libs + from __future__ import absolute_import, print_function +-import logging ++import salt.log.setup as logging + import os + + # Import salt libs +diff --git a/salt/loader.py b/salt/loader.py +index 54dadb0b513dbaa4914b0d4b1d343dde709699ad..b824a70a0cc40128f3271f70f676f1551194236c 100644 +--- a/salt/loader.py ++++ b/salt/loader.py +@@ -11,7 +11,7 @@ import os + import re + import sys + import time +-import logging ++import salt.log.setup as logging + import inspect + import tempfile + import functools +diff --git a/salt/utils/lazy.py b/salt/utils/lazy.py +index 3cd6489d2d8c50ec4e6eb70c50407f1084db377b..bb4b38e1a3cfa05945cd438fc9d30e7c47c3391b 100644 +--- a/salt/utils/lazy.py ++++ b/salt/utils/lazy.py +@@ -5,7 +5,8 @@ Lazily-evaluated data structures, primarily used by Salt's loader + + # Import Python Libs + from __future__ import absolute_import, unicode_literals +-import logging ++import salt.log.setup as logging ++import time + import salt.exceptions + + try: +@@ -102,9 +103,11 @@ class LazyDict(MutableMapping): + # load the item + if self._load(key): + log.debug('LazyLoaded %s', key) ++ time.sleep(0.0001) + return self._dict[key] + else: + log.debug('Could not LazyLoad %s: %s', key, self.missing_fun_string(key)) ++ time.sleep(0.0001) + raise KeyError(key) + else: + return self._dict[key] +-- +2.23.0 + + diff --git a/python3.8-compatibility-pr-s-235.patch b/python3.8-compatibility-pr-s-235.patch new file mode 100644 index 0000000..a2fdf15 --- /dev/null +++ b/python3.8-compatibility-pr-s-235.patch @@ -0,0 +1,1995 @@ +From 1721978eb0644c90a834493449ee27e1e4de03e1 Mon Sep 17 00:00:00 2001 +From: Jochen Breuer +Date: Fri, 8 May 2020 15:56:35 +0200 +Subject: [PATCH] Python3.8 compatibility PR's (#235) + +* Update static requirements to include Py3.8 and Py3.9 (except windows) + +Windows required package pywin32 doesn't state that it support any +python version above Py3.7 + +* Allow running the test suite against Py3.8 and Py3.9 + +* Fix deprecation warnings for imports from collections + +DeprecationWarning: Using or importing the ABCs from `collections` +instead of from `collections.abc` is deprecated since Python 3.3, and in +3.9 it will stop working. + +Therefore try to import the abstract base classes from `collections.abc` +before falling back to `collections`. + +Signed-off-by: Benjamin Drung + +* Support distro.linux_distribution + +Salt fails on Python 3.8: + +``` +====================================================================== +ERROR: unit.grains.test_core (unittest.loader._FailedTest) +---------------------------------------------------------------------- +ImportError: Failed to import test module: unit.grains.test_core +Traceback (most recent call last): + File "/usr/lib/python3.8/unittest/loader.py", line 436, in _find_test_path + module = self._get_module_from_name(name) + File "/usr/lib/python3.8/unittest/loader.py", line 377, in _get_module_from_name + __import__(name) + File "tests/unit/grains/test_core.py", line 37, in + import salt.grains.core as core + File "salt/grains/core.py", line 40, in + from platform import _supported_dists +ImportError: cannot import name '_supported_dists' from 'platform' (/usr/lib/python3.8/platform.py) +``` + +So only try to import `_supported_dists` from `platform` for Python <= +3.7. Otherwise rely on the external `distro` module to not need any +special handling. + +Addresses parts of #55835 +Signed-off-by: Benjamin Drung + +* Fix RuntimeError: dictionary keys changed during iteration + +The following unit tests fail on Python 3.8: + +``` +====================================================================== +ERROR: test_state_config (unit.renderers.test_stateconf.StateConfigRendererTestCase) +[CPU:0.0%|MEM:56.6%] +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/<>/tests/unit/renderers/test_stateconf.py", line 74, in test_state_config + result = self._render_sls(''' + File "/<>/tests/unit/renderers/test_stateconf.py", line 66, in _render_sls + return self._renderers['stateconf']( + File "/<>/salt/renderers/stateconf.py", line 227, in render + for k in six.iterkeys(tmplctx): # iterate over a copy of keys +RuntimeError: dictionary keys changed during iteration + +====================================================================== +ERROR: test_apply_cloud_providers_config_extend (unit.test_config.ConfigTestCase) +[CPU:0.0%|MEM:56.6%] +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/<>/tests/unit/test_config.py", line 1243, in test_apply_cloud_providers_config_extend + salt.config.apply_cloud_providers_config( + File "/<>/salt/config/__init__.py", line 3196, in apply_cloud_providers_config + for driver, details in six.iteritems(entries): +RuntimeError: dictionary keys changed during iteration + +====================================================================== +ERROR: test_apply_cloud_providers_config_extend_multiple (unit.test_config.ConfigTestCase) +[CPU:0.0%|MEM:56.6%] +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/<>/tests/unit/test_config.py", line 1334, in test_apply_cloud_providers_config_extend_multiple + self.assertEqual(ret, salt.config.apply_cloud_providers_config(overrides, defaults=DEFAULT)) + File "/<>/salt/config/__init__.py", line 3196, in apply_cloud_providers_config + for driver, details in six.iteritems(entries): +RuntimeError: dictionary keys changed during iteration + +====================================================================== +``` + +Replace the affected for loop of the first case by a dictionary +comprehension to construct the modified dictionary. For the remaining +cases, switch from `iteritems` to `iterkeys`, since the dictionary +values will be modified. + +Signed-off-by: Benjamin Drung + +* Update PyTestSalt requirement(because we now bundle tornado) + +* Run the full test suite on Arch under Py3 + +* Fix deprecation warnings for imports from collections + +DeprecationWarning: Using or importing the ABCs from `collections` +instead of from `collections.abc` is deprecated since Python 3.3, and in +3.9 it will stop working. + +Therefore try to import the abstract base classes from `collections.abc` +before falling back to `collections`. + +Signed-off-by: Benjamin Drung + +* Replace deprecated inspect.formatargspec + +Python 3.7 raises a deprecation warning: + +salt/utils/decorators/signature.py:31: DeprecationWarning: +`formatargspec` is deprecated since Python 3.5. Use `signature` and the +`Signature` object directly + +`inspect.formatargspec` is only used in +`salt.utils.decorators.signature.identical_signature_wrapper` which is +only used in `salt.utils.decorators.path` for decorating the `which` and +`which_bin` functions. The function `identical_signature_wrapper` can be +simply replaced by Python's `functools.wraps` which is available since +at least Python 2.7. + +When inspecting those wrapped functions, the underlying function (stored +in the `__wrapped__` attribute) needs to be inspect instead. + +fixes #50911 +Signed-off-by: Benjamin Drung + +Co-authored-by: Pedro Algarvio +Co-authored-by: Benjamin Drung +--- + .ci/kitchen-archlts-py3 | 2 +- + .pre-commit-config.yaml | 228 ++++++++++++++++++++ + noxfile.py | 4 +- + pkg/windows/req.txt | 2 +- + pkg/windows/req_testing.txt | 12 -- + pkg/windows/req_win.txt | 2 +- + requirements/pytest.txt | 2 +- + requirements/static/py3.5/darwin.txt | 2 +- + requirements/static/py3.5/linux.txt | 2 +- + requirements/static/py3.5/windows.txt | 6 +- + requirements/static/py3.6/darwin.txt | 2 +- + requirements/static/py3.6/linux.txt | 2 +- + requirements/static/py3.6/windows.txt | 6 +- + requirements/static/py3.7/darwin.txt | 2 +- + requirements/static/py3.7/linux.txt | 2 +- + requirements/static/py3.7/windows.txt | 5 +- + requirements/static/py3.8/cloud.txt | 115 ++++++++++ + requirements/static/py3.8/darwin-crypto.txt | 8 + + requirements/static/py3.8/darwin.txt | 123 +++++++++++ + requirements/static/py3.8/docs.txt | 30 +++ + requirements/static/py3.8/lint.txt | 16 ++ + requirements/static/py3.8/linux-crypto.txt | 8 + + requirements/static/py3.8/linux.txt | 119 ++++++++++ + requirements/static/py3.9/cloud.txt | 115 ++++++++++ + requirements/static/py3.9/darwin-crypto.txt | 8 + + requirements/static/py3.9/darwin.txt | 123 +++++++++++ + requirements/static/py3.9/docs.txt | 30 +++ + requirements/static/py3.9/lint.txt | 16 ++ + requirements/static/py3.9/linux-crypto.txt | 8 + + requirements/static/py3.9/linux.txt | 119 ++++++++++ + salt/client/mixins.py | 61 +++--- + salt/ext/tornado/httputil.py | 9 +- + salt/grains/core.py | 28 ++- + salt/renderers/stateconf.py | 4 +- + salt/utils/args.py | 14 +- + salt/utils/decorators/path.py | 13 +- + salt/utils/jinja.py | 24 ++- + salt/utils/oset.py | 4 +- + 38 files changed, 1193 insertions(+), 83 deletions(-) + delete mode 100644 pkg/windows/req_testing.txt + create mode 100644 requirements/static/py3.8/cloud.txt + create mode 100644 requirements/static/py3.8/darwin-crypto.txt + create mode 100644 requirements/static/py3.8/darwin.txt + create mode 100644 requirements/static/py3.8/docs.txt + create mode 100644 requirements/static/py3.8/lint.txt + create mode 100644 requirements/static/py3.8/linux-crypto.txt + create mode 100644 requirements/static/py3.8/linux.txt + create mode 100644 requirements/static/py3.9/cloud.txt + create mode 100644 requirements/static/py3.9/darwin-crypto.txt + create mode 100644 requirements/static/py3.9/darwin.txt + create mode 100644 requirements/static/py3.9/docs.txt + create mode 100644 requirements/static/py3.9/lint.txt + create mode 100644 requirements/static/py3.9/linux-crypto.txt + create mode 100644 requirements/static/py3.9/linux.txt + +diff --git a/.ci/kitchen-archlts-py3 b/.ci/kitchen-archlts-py3 +index f529c5e36c..b360a350a6 100644 +--- a/.ci/kitchen-archlts-py3 ++++ b/.ci/kitchen-archlts-py3 +@@ -8,7 +8,7 @@ runTestSuite( + golden_images_branch: 'master', + jenkins_slave_label: 'kitchen-slave', + nox_env_name: 'runtests-zeromq', +- nox_passthrough_opts: '-n integration.modules.test_pkg', ++ nox_passthrough_opts: '', + python_version: 'py3', + testrun_timeout: 6, + use_spot_instances: true) +diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml +index c4de5c154c..9b704b1426 100644 +--- a/.pre-commit-config.yaml ++++ b/.pre-commit-config.yaml +@@ -416,6 +416,234 @@ repos: + - --py-version=3.7 + - --platform=linux + ++ - id: pip-tools-compile ++ alias: compile-linux-py3.8-zmq-requirements ++ name: Linux Py3.8 ZeroMQ Requirements ++ files: ^requirements/((base|zeromq|pytest)\.txt|static/linux\.in)$ ++ exclude: ^requirements/static/(centos-6|amzn-2018\.03|lint|cloud|docs|darwin|windows)\.in$ ++ args: ++ - -v ++ - --py-version=3.8 ++ - --platform=linux ++ - --include=requirements/base.txt ++ - --include=requirements/zeromq.txt ++ - --include=requirements/pytest.txt ++ ++ - id: pip-tools-compile ++ alias: compile-darwin-py3.8-zmq-requirements ++ name: Darwin Py3.8 ZeroMQ Requirements ++ files: ^(pkg/osx/(req|req_ext)\.txt|requirements/((base|zeromq|pytest)\.txt|static/darwin\.in))$ ++ args: ++ - -v ++ - --py-version=3.8 ++ - --platform=darwin ++ - --include=pkg/osx/req.txt ++ - --include=pkg/osx/req_ext.txt ++ - --include=requirements/base.txt ++ - --include=requirements/zeromq.txt ++ - --include=requirements/pytest.txt ++ - --passthrough-line-from-input=^pyobjc(.*)$ ++ ++# Commented out since pywin32 and pymssql do not have packages or support for Py >= 3.8 ++# - id: pip-tools-compile ++# alias: compile-windows-py3.8-zmq-requirements ++# name: Windows Py3.8 ZeroMQ Requirements ++# files: ^(pkg/windows/(req|req_win)\.txt|requirements/((base|zeromq|pytest)\.txt|static/windows\.in))$ ++# args: ++# - -v ++# - --py-version=3.8 ++# - --platform=windows ++# - --include=pkg/windows/req.txt ++# - --include=pkg/windows/req_win.txt ++# - --include=requirements/base.txt ++# - --include=requirements/zeromq.txt ++# - --include=requirements/pytest.txt ++ ++ - id: pip-tools-compile ++ alias: compile-cloud-py3.8-requirements ++ name: Cloud Py3.8 Requirements ++ files: ^requirements/(static/cloud\.in)$ ++ args: ++ - -v ++ - --py-version=3.8 ++ ++ - id: pip-tools-compile ++ alias: compile-doc-requirements ++ name: Docs Py3.8 Requirements ++ files: ^requirements/((base|zeromq|pytest)\.txt|static/docs\.in)$ ++ args: ++ - -v ++ - --py-version=3.8 ++ - --platform=linux ++ ++ - id: pip-tools-compile ++ alias: compile-linux-crypto-py3.8-requirements ++ name: Linux Py3.8 Crypto Requirements ++ files: ^requirements/(crypto\.txt|static/crypto\.in)$ ++ args: ++ - -v ++ - --py-version=3.8 ++ - --platform=linux ++ - --out-prefix=linux ++ ++ - id: pip-tools-compile ++ alias: compile-darwin-crypto-py3.8-requirements ++ name: Darwin Py3.8 Crypto Requirements ++ files: ^requirements/(crypto\.txt|static/crypto\.in)$ ++ args: ++ - -v ++ - --py-version=3.8 ++ - --platform=darwin ++ - --out-prefix=darwin ++ ++# Commented out since pywin32 and pymssql do not have packages or support for Py >= 3.8 ++# - id: pip-tools-compile ++# alias: compile-windows-crypto-py3.8-requirements ++# name: Windows Py3.8 Crypto Requirements ++# files: ^requirements/(crypto\.txt|static/crypto\.in)$ ++# args: ++# - -v ++# - --py-version=3.8 ++# - --platform=windows ++# - --out-prefix=windows ++ ++ - id: pip-tools-compile ++ alias: compile-lint-py3.8-requirements ++ name: Lint Py3.8 Requirements ++ files: ^requirements/static/lint\.in$ ++ args: ++ - -v ++ - --py-version=3.8 ++ - --platform=linux ++ ++ ++ - id: pip-tools-compile ++ alias: compile-linux-py3.9-zmq-requirements ++ name: Linux Py3.9 ZeroMQ Requirements ++ files: ^requirements/((base|zeromq|pytest)\.txt|static/linux\.in)$ ++ exclude: ^requirements/static/(centos-6|amzn-2018\.03|lint|cloud|docs|darwin|windows)\.in$ ++ args: ++ - -v ++ - --py-version=3.9 ++ - --platform=linux ++ - --include=requirements/base.txt ++ - --include=requirements/zeromq.txt ++ - --include=requirements/pytest.txt ++ ++ - id: pip-tools-compile ++ alias: compile-darwin-py3.9-zmq-requirements ++ name: Darwin Py3.9 ZeroMQ Requirements ++ files: ^(pkg/osx/(req|req_ext)\.txt|requirements/((base|zeromq|pytest)\.txt|static/darwin\.in))$ ++ args: ++ - -v ++ - --py-version=3.9 ++ - --platform=darwin ++ - --include=pkg/osx/req.txt ++ - --include=pkg/osx/req_ext.txt ++ - --include=requirements/base.txt ++ - --include=requirements/zeromq.txt ++ - --include=requirements/pytest.txt ++ - --passthrough-line-from-input=^pyobjc(.*)$ ++ ++# Commented out since pywin32 and pymssql do not have packages or support for Py >= 3.8 ++# - id: pip-tools-compile ++# alias: compile-windows-py3.9-zmq-requirements ++# name: Windows Py3.9 ZeroMQ Requirements ++# files: ^(pkg/windows/(req|req_win)\.txt|requirements/((base|zeromq|pytest)\.txt|static/windows\.in))$ ++# args: ++# - -v ++# - --py-version=3.9 ++# - --platform=windows ++# - --include=pkg/windows/req.txt ++# - --include=pkg/windows/req_win.txt ++# - --include=requirements/base.txt ++# - --include=requirements/zeromq.txt ++# - --include=requirements/pytest.txt ++ ++ - id: pip-tools-compile ++ alias: compile-cloud-py3.9-requirements ++ name: Cloud Py3.9 Requirements ++ files: ^requirements/(static/cloud\.in)$ ++ args: ++ - -v ++ - --py-version=3.9 ++ ++ - id: pip-tools-compile ++ alias: compile-doc-requirements ++ name: Docs Py3.9 Requirements ++ files: ^requirements/((base|zeromq|pytest)\.txt|static/docs\.in)$ ++ args: ++ - -v ++ - --py-version=3.9 ++ - --platform=linux ++ ++ - id: pip-tools-compile ++ alias: compile-linux-crypto-py3.9-requirements ++ name: Linux Py3.9 Crypto Requirements ++ files: ^requirements/(crypto\.txt|static/crypto\.in)$ ++ args: ++ - -v ++ - --py-version=3.9 ++ - --platform=linux ++ - --out-prefix=linux ++ ++ - id: pip-tools-compile ++ alias: compile-darwin-crypto-py3.9-requirements ++ name: Darwin Py3.9 Crypto Requirements ++ files: ^requirements/(crypto\.txt|static/crypto\.in)$ ++ args: ++ - -v ++ - --py-version=3.9 ++ - --platform=darwin ++ - --out-prefix=darwin ++ ++# Commented out since pywin32 and pymssql do not have packages or support for Py >= 3.8 ++# - id: pip-tools-compile ++# alias: compile-windows-crypto-py3.9-requirements ++# name: Windows Py3.9 Crypto Requirements ++# files: ^requirements/(crypto\.txt|static/crypto\.in)$ ++# args: ++# - -v ++# - --py-version=3.9 ++# - --platform=windows ++# - --out-prefix=windows ++ ++ - id: pip-tools-compile ++ alias: compile-lint-py3.9-requirements ++ name: Lint Py3.9 Requirements ++ files: ^requirements/static/lint\.in$ ++ args: ++ - -v ++ - --py-version=3.9 ++ - --platform=linux ++ ++ - repo: https://github.com/timothycrosley/isort ++ rev: "1e78a9acf3110e1f9721feb591f89a451fc9876a" ++ hooks: ++ - id: isort ++ additional_dependencies: ['toml'] ++ # This tells pre-commit not to pass files to isort. ++ # This should be kept in sync with pyproject.toml ++ exclude: > ++ (?x)^( ++ templates/.*| ++ salt/ext/.*| ++ tests/kitchen/.* ++ )$ ++ ++ - repo: https://github.com/psf/black ++ rev: stable ++ hooks: ++ - id: black ++ # This tells pre-commit not to pass files to black. ++ # This should be kept in sync with pyproject.toml ++ exclude: > ++ (?x)^( ++ templates/.*| ++ salt/ext/.*| ++ tests/kitchen/.* ++ )$ ++ + + - repo: https://github.com/saltstack/salt-nox-pre-commit + rev: master +diff --git a/noxfile.py b/noxfile.py +index 355a069d92..65b013eb04 100644 +--- a/noxfile.py ++++ b/noxfile.py +@@ -39,7 +39,7 @@ SITECUSTOMIZE_DIR = os.path.join(REPO_ROOT, 'tests', 'support', 'coverage') + IS_DARWIN = sys.platform.lower().startswith('darwin') + IS_WINDOWS = sys.platform.lower().startswith('win') + # Python versions to run against +-_PYTHON_VERSIONS = ('2', '2.7', '3', '3.4', '3.5', '3.6', '3.7') ++_PYTHON_VERSIONS = ("2", "2.7", "3", "3.4", "3.5", "3.6", "3.7", "3.8", "3.9") + + # Nox options + # Reuse existing virtualenvs +@@ -167,7 +167,7 @@ def _install_system_packages(session): + '{id}-{version_parts[major]}'.format(**distro) + ] + version_info = _get_session_python_version_info(session) +- py_version_keys = [ ++ py_version_keys = +SITECUSTOMIZE_DIR[ + '{}'.format(*version_info), + '{}.{}'.format(*version_info) + ] +diff --git a/pkg/windows/req.txt b/pkg/windows/req.txt +index 8b443e1717..3f2c1628d2 100644 +--- a/pkg/windows/req.txt ++++ b/pkg/windows/req.txt +@@ -1,6 +1,6 @@ + -r req_win.txt + backports-abc==0.5; python_version < '3.0' +-backports.ssl-match-hostname==3.7.0.1 ++backports.ssl-match-hostname==3.7.0.1; python_version < '3.7' + certifi + cffi==1.12.2 + CherryPy==17.4.1 +diff --git a/pkg/windows/req_testing.txt b/pkg/windows/req_testing.txt +deleted file mode 100644 +index 7682a98c0c..0000000000 +--- a/pkg/windows/req_testing.txt ++++ /dev/null +@@ -1,12 +0,0 @@ +-mock +-boto +-boto3 +-moto +-SaltPyLint>=v2017.6.22 +-apache-libcloud +-virtualenv +- +-# Needed for archive, which is gated for Redhat +-# rarfile +-# Needed for keystone +-# python-keystoneclient +diff --git a/pkg/windows/req_win.txt b/pkg/windows/req_win.txt +index 7f279af526..8887884a87 100644 +--- a/pkg/windows/req_win.txt ++++ b/pkg/windows/req_win.txt +@@ -1,2 +1,2 @@ +-pywin32==224 ++pywin32==227 + WMI==1.4.9 +diff --git a/requirements/pytest.txt b/requirements/pytest.txt +index 45aa4dc085..52dd16fc09 100644 +--- a/requirements/pytest.txt ++++ b/requirements/pytest.txt +@@ -1,7 +1,7 @@ + mock >= 3.0.0 + # PyTest + pytest >=4.6.6,<4.7 # PyTest 4.6.x are the last Py2 and Py3 releases +-pytest-salt >= 2019.12.27 ++pytest-salt >= 2020.1.27 + pytest-tempdir >= 2019.10.12 + pytest-helpers-namespace >= 2019.1.8 + pytest-salt-runtests-bridge >= 2019.7.10 +diff --git a/requirements/static/py3.5/darwin.txt b/requirements/static/py3.5/darwin.txt +index ac04286204..d01d1c93ff 100644 +--- a/requirements/static/py3.5/darwin.txt ++++ b/requirements/static/py3.5/darwin.txt +@@ -88,7 +88,7 @@ pyparsing==2.4.5 # via packaging + pyserial==3.4 # via junos-eznc + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 +diff --git a/requirements/static/py3.5/linux.txt b/requirements/static/py3.5/linux.txt +index c3611cfbcc..9309059b6c 100644 +--- a/requirements/static/py3.5/linux.txt ++++ b/requirements/static/py3.5/linux.txt +@@ -85,7 +85,7 @@ pyparsing==2.4.5 # via packaging + pyserial==3.4 # via junos-eznc + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 # via botocore, croniter, kubernetes, moto, vcert +diff --git a/requirements/static/py3.5/windows.txt b/requirements/static/py3.5/windows.txt +index 3c07a12f23..7918945e00 100644 +--- a/requirements/static/py3.5/windows.txt ++++ b/requirements/static/py3.5/windows.txt +@@ -10,7 +10,7 @@ atomicwrites==1.3.0 # via pytest + attrs==19.1.0 # via pytest + aws-xray-sdk==0.95 # via moto + backports.functools-lru-cache==1.5 # via cheroot +-backports.ssl-match-hostname==3.7.0.1 ++backports.ssl-match-hostname==3.7.0.1 ; python_version < "3.7" + boto3==1.9.132 + boto==2.49.0 + botocore==1.12.132 # via boto3, moto, s3transfer +@@ -78,7 +78,7 @@ pyopenssl==19.0.0 + pyparsing==2.4.5 # via packaging + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 +@@ -88,7 +88,7 @@ python-jose==2.0.2 # via moto + pythonnet==2.3.0 + pytz==2019.1 # via moto, tempora + pyvmomi==6.7.1.2018.12 +-pywin32==224 ++pywin32==227 + pyyaml==5.1.2 + pyzmq==18.0.1 ; python_version != "3.4" + requests==2.21.0 +diff --git a/requirements/static/py3.6/darwin.txt b/requirements/static/py3.6/darwin.txt +index a6dd0a120b..2dc822beb8 100644 +--- a/requirements/static/py3.6/darwin.txt ++++ b/requirements/static/py3.6/darwin.txt +@@ -87,7 +87,7 @@ pyparsing==2.4.5 # via packaging + pyserial==3.4 # via junos-eznc + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 +diff --git a/requirements/static/py3.6/linux.txt b/requirements/static/py3.6/linux.txt +index 247bdc6e2b..e5eead5572 100644 +--- a/requirements/static/py3.6/linux.txt ++++ b/requirements/static/py3.6/linux.txt +@@ -84,7 +84,7 @@ pyparsing==2.4.5 # via packaging + pyserial==3.4 # via junos-eznc + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 # via botocore, croniter, kubernetes, moto, vcert +diff --git a/requirements/static/py3.6/windows.txt b/requirements/static/py3.6/windows.txt +index 1c9b6903c6..83896f9d3f 100644 +--- a/requirements/static/py3.6/windows.txt ++++ b/requirements/static/py3.6/windows.txt +@@ -10,7 +10,7 @@ atomicwrites==1.3.0 # via pytest + attrs==19.1.0 # via pytest + aws-xray-sdk==0.95 # via moto + backports.functools-lru-cache==1.5 # via cheroot +-backports.ssl-match-hostname==3.7.0.1 ++backports.ssl-match-hostname==3.7.0.1 ; python_version < "3.7" + boto3==1.9.132 + boto==2.49.0 + botocore==1.12.132 # via boto3, moto, s3transfer +@@ -77,7 +77,7 @@ pyopenssl==19.0.0 + pyparsing==2.4.5 # via packaging + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 +@@ -87,7 +87,7 @@ python-jose==2.0.2 # via moto + pythonnet==2.3.0 + pytz==2019.1 # via moto, tempora + pyvmomi==6.7.1.2018.12 +-pywin32==224 ++pywin32==227 + pyyaml==5.1.2 + pyzmq==18.0.1 ; python_version != "3.4" + requests==2.21.0 +diff --git a/requirements/static/py3.7/darwin.txt b/requirements/static/py3.7/darwin.txt +index 935b110db2..616563d7b6 100644 +--- a/requirements/static/py3.7/darwin.txt ++++ b/requirements/static/py3.7/darwin.txt +@@ -86,7 +86,7 @@ pyparsing==2.4.5 # via packaging + pyserial==3.4 # via junos-eznc + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 +diff --git a/requirements/static/py3.7/linux.txt b/requirements/static/py3.7/linux.txt +index 17e9bc785a..92eedc94d5 100644 +--- a/requirements/static/py3.7/linux.txt ++++ b/requirements/static/py3.7/linux.txt +@@ -84,7 +84,7 @@ pyparsing==2.4.5 # via packaging + pyserial==3.4 # via junos-eznc + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 # via botocore, croniter, kubernetes, moto, vcert +diff --git a/requirements/static/py3.7/windows.txt b/requirements/static/py3.7/windows.txt +index 06c36960b3..d6499eaacd 100644 +--- a/requirements/static/py3.7/windows.txt ++++ b/requirements/static/py3.7/windows.txt +@@ -10,7 +10,6 @@ atomicwrites==1.3.0 # via pytest + attrs==19.1.0 # via pytest + aws-xray-sdk==0.95 # via moto + backports.functools-lru-cache==1.5 # via cheroot +-backports.ssl-match-hostname==3.7.0.1 + boto3==1.9.132 + boto==2.49.0 + botocore==1.12.132 # via boto3, moto, s3transfer +@@ -77,7 +76,7 @@ pyopenssl==19.0.0 + pyparsing==2.4.5 # via packaging + pytest-helpers-namespace==2019.1.8 + pytest-salt-runtests-bridge==2019.7.10 +-pytest-salt==2019.12.27 ++pytest-salt==2020.1.27 + pytest-tempdir==2019.10.12 + pytest==4.6.6 + python-dateutil==2.8.0 +@@ -87,7 +86,7 @@ python-jose==2.0.2 # via moto + pythonnet==2.3.0 + pytz==2019.1 # via moto, tempora + pyvmomi==6.7.1.2018.12 +-pywin32==224 ++pywin32==227 + pyyaml==5.1.2 + pyzmq==18.0.1 ; python_version != "3.4" + requests==2.21.0 +diff --git a/requirements/static/py3.8/cloud.txt b/requirements/static/py3.8/cloud.txt +new file mode 100644 +index 0000000000..ab03f2b2f3 +--- /dev/null ++++ b/requirements/static/py3.8/cloud.txt +@@ -0,0 +1,115 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.8/cloud.txt -v requirements/static/cloud.in ++# ++adal==1.2.1 # via azure-datalake-store, msrestazure ++asn1crypto==0.24.0 # via cryptography ++azure-applicationinsights==0.1.0 # via azure ++azure-batch==4.1.3 # via azure ++azure-common==1.1.18 # via azure-applicationinsights, azure-batch, azure-cosmosdb-table, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy, azure-storage-blob, azure-storage-common, azure-storage-file, azure-storage-queue ++azure-cosmosdb-nspkg==2.0.2 # via azure-cosmosdb-table ++azure-cosmosdb-table==1.0.5 # via azure ++azure-datalake-store==0.0.44 # via azure ++azure-eventgrid==1.2.0 # via azure ++azure-graphrbac==0.40.0 # via azure ++azure-keyvault==1.1.0 # via azure ++azure-loganalytics==0.1.0 # via azure ++azure-mgmt-advisor==1.0.1 # via azure-mgmt ++azure-mgmt-applicationinsights==0.1.1 # via azure-mgmt ++azure-mgmt-authorization==0.50.0 # via azure-mgmt ++azure-mgmt-batch==5.0.1 # via azure-mgmt ++azure-mgmt-batchai==2.0.0 # via azure-mgmt ++azure-mgmt-billing==0.2.0 # via azure-mgmt ++azure-mgmt-cdn==3.1.0 # via azure-mgmt ++azure-mgmt-cognitiveservices==3.0.0 # via azure-mgmt ++azure-mgmt-commerce==1.0.1 # via azure-mgmt ++azure-mgmt-compute==4.6.0 # via azure-mgmt ++azure-mgmt-consumption==2.0.0 # via azure-mgmt ++azure-mgmt-containerinstance==1.4.1 # via azure-mgmt ++azure-mgmt-containerregistry==2.7.0 # via azure-mgmt ++azure-mgmt-containerservice==4.4.0 # via azure-mgmt ++azure-mgmt-cosmosdb==0.4.1 # via azure-mgmt ++azure-mgmt-datafactory==0.6.0 # via azure-mgmt ++azure-mgmt-datalake-analytics==0.6.0 # via azure-mgmt ++azure-mgmt-datalake-nspkg==3.0.1 # via azure-mgmt-datalake-analytics, azure-mgmt-datalake-store ++azure-mgmt-datalake-store==0.5.0 # via azure-mgmt ++azure-mgmt-datamigration==1.0.0 # via azure-mgmt ++azure-mgmt-devspaces==0.1.0 # via azure-mgmt ++azure-mgmt-devtestlabs==2.2.0 # via azure-mgmt ++azure-mgmt-dns==2.1.0 # via azure-mgmt ++azure-mgmt-eventgrid==1.0.0 # via azure-mgmt ++azure-mgmt-eventhub==2.5.0 # via azure-mgmt ++azure-mgmt-hanaonazure==0.1.1 # via azure-mgmt ++azure-mgmt-iotcentral==0.1.0 # via azure-mgmt ++azure-mgmt-iothub==0.5.0 # via azure-mgmt ++azure-mgmt-iothubprovisioningservices==0.2.0 # via azure-mgmt ++azure-mgmt-keyvault==1.1.0 # via azure-mgmt ++azure-mgmt-loganalytics==0.2.0 # via azure-mgmt ++azure-mgmt-logic==3.0.0 # via azure-mgmt ++azure-mgmt-machinelearningcompute==0.4.1 # via azure-mgmt ++azure-mgmt-managementgroups==0.1.0 # via azure-mgmt ++azure-mgmt-managementpartner==0.1.0 # via azure-mgmt ++azure-mgmt-maps==0.1.0 # via azure-mgmt ++azure-mgmt-marketplaceordering==0.1.0 # via azure-mgmt ++azure-mgmt-media==1.0.0 # via azure-mgmt ++azure-mgmt-monitor==0.5.2 # via azure-mgmt ++azure-mgmt-msi==0.2.0 # via azure-mgmt ++azure-mgmt-network==2.6.0 # via azure-mgmt ++azure-mgmt-notificationhubs==2.0.0 # via azure-mgmt ++azure-mgmt-nspkg==3.0.2 # via azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-consumption, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-nspkg, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web ++azure-mgmt-policyinsights==0.1.0 # via azure-mgmt ++azure-mgmt-powerbiembedded==2.0.0 # via azure-mgmt ++azure-mgmt-rdbms==1.8.0 # via azure-mgmt ++azure-mgmt-recoveryservices==0.3.0 # via azure-mgmt ++azure-mgmt-recoveryservicesbackup==0.3.0 # via azure-mgmt ++azure-mgmt-redis==5.0.0 # via azure-mgmt ++azure-mgmt-relay==0.1.0 # via azure-mgmt ++azure-mgmt-reservations==0.2.1 # via azure-mgmt ++azure-mgmt-resource==2.1.0 # via azure-mgmt ++azure-mgmt-scheduler==2.0.0 # via azure-mgmt ++azure-mgmt-search==2.0.0 # via azure-mgmt ++azure-mgmt-servicebus==0.5.3 # via azure-mgmt ++azure-mgmt-servicefabric==0.2.0 # via azure-mgmt ++azure-mgmt-signalr==0.1.1 # via azure-mgmt ++azure-mgmt-sql==0.9.1 # via azure-mgmt ++azure-mgmt-storage==2.0.0 # via azure-mgmt ++azure-mgmt-subscription==0.2.0 # via azure-mgmt ++azure-mgmt-trafficmanager==0.50.0 # via azure-mgmt ++azure-mgmt-web==0.35.0 # via azure-mgmt ++azure-mgmt==4.0.0 # via azure ++azure-nspkg==3.0.2 # via azure-applicationinsights, azure-batch, azure-cosmosdb-nspkg, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-nspkg, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy ++azure-servicebus==0.21.1 # via azure ++azure-servicefabric==6.3.0.0 # via azure ++azure-servicemanagement-legacy==0.20.6 # via azure ++azure-storage-blob==1.5.0 # via azure ++azure-storage-common==1.4.0 # via azure-cosmosdb-table, azure-storage-blob, azure-storage-file, azure-storage-queue ++azure-storage-file==1.4.0 # via azure ++azure-storage-queue==1.4.0 # via azure ++azure==4.0.0 ++certifi==2019.3.9 # via msrest, requests ++cffi==1.12.2 # via azure-datalake-store, cryptography ++chardet==3.0.4 # via requests ++cryptography==2.6.1 # via adal, azure-cosmosdb-table, azure-keyvault, azure-storage-common, requests-ntlm, smbprotocol ++idna==2.8 # via requests ++isodate==0.6.0 # via msrest ++msrest==0.6.6 # via azure-applicationinsights, azure-eventgrid, azure-keyvault, azure-loganalytics, azure-mgmt-cdn, azure-mgmt-compute, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-dns, azure-mgmt-eventhub, azure-mgmt-keyvault, azure-mgmt-media, azure-mgmt-network, azure-mgmt-rdbms, azure-mgmt-resource, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-servicefabric, msrestazure ++msrestazure==0.6.0 # via azure-batch, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web ++netaddr==0.7.19 ++ntlm-auth==1.3.0 # via requests-ntlm, smbprotocol ++oauthlib==3.0.1 # via requests-oauthlib ++profitbricks==4.1.3 ++pyasn1==0.4.5 # via smbprotocol ++pycparser==2.19 # via cffi ++pyjwt==1.7.1 # via adal ++pypsexec==0.1.0 ++python-dateutil==2.8.0 # via adal, azure-cosmosdb-table, azure-storage-common ++pywinrm==0.3.0 ++requests-ntlm==1.1.0 # via pywinrm ++requests-oauthlib==1.2.0 # via msrest ++requests==2.21.0 # via adal, azure-cosmosdb-table, azure-datalake-store, azure-keyvault, azure-servicebus, azure-servicemanagement-legacy, azure-storage-common, msrest, profitbricks, pywinrm, requests-ntlm, requests-oauthlib ++six==1.12.0 # via cryptography, isodate, profitbricks, pypsexec, python-dateutil, pywinrm, smbprotocol ++smbprotocol==0.1.1 # via pypsexec ++urllib3==1.24.2 # via requests ++xmltodict==0.12.0 # via pywinrm +diff --git a/requirements/static/py3.8/darwin-crypto.txt b/requirements/static/py3.8/darwin-crypto.txt +new file mode 100644 +index 0000000000..b1edfefdab +--- /dev/null ++++ b/requirements/static/py3.8/darwin-crypto.txt +@@ -0,0 +1,8 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.8/darwin-crypto.txt -v requirements/static/crypto.in ++# ++m2crypto==0.35.2 ++pycryptodomex==3.9.0 +diff --git a/requirements/static/py3.8/darwin.txt b/requirements/static/py3.8/darwin.txt +new file mode 100644 +index 0000000000..95bcd7748d +--- /dev/null ++++ b/requirements/static/py3.8/darwin.txt +@@ -0,0 +1,123 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.8/darwin.txt -v pkg/osx/req.txt pkg/osx/req_ext.txt requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/darwin.in ++# ++apache-libcloud==2.4.0 ++appdirs==1.4.3 # via virtualenv ++argh==0.26.2 # via watchdog ++asn1crypto==1.3.0 # via certvalidator, cryptography, oscrypto ++atomicwrites==1.3.0 # via pytest ++attrs==19.1.0 # via pytest ++aws-xray-sdk==0.95 # via moto ++backports.functools-lru-cache==1.5 # via cheroot ++backports.ssl_match_hostname==3.7.0.1 ++bcrypt==3.1.6 # via paramiko ++boto3==1.9.132 ++boto==2.49.0 ++botocore==1.12.132 # via boto3, moto, s3transfer ++cachetools==3.1.0 # via google-auth ++certifi==2019.3.9 ++certvalidator==0.11.1 # via vcert ++cffi==1.12.2 ++chardet==3.0.4 # via requests ++cheetah3==3.1.0 ++cheroot==6.5.5 # via cherrypy ++cherrypy==17.4.1 ++click==7.0 ++clustershell==1.8.1 ++contextlib2==0.5.5 # via cherrypy ++croniter==0.3.29 ++cryptography==2.6.1 ++distlib==0.3.0 # via virtualenv ++dnspython==1.16.0 ++docker-pycreds==0.4.0 # via docker ++docker==3.7.2 ++docutils==0.14 # via botocore ++ecdsa==0.13.3 # via python-jose ++enum34==1.1.6 ++filelock==3.0.12 # via virtualenv ++future==0.17.1 # via python-jose ++genshi==0.7.3 ++gitdb2==2.0.5 # via gitpython ++gitpython==2.1.15 ++google-auth==1.6.3 # via kubernetes ++idna==2.8 ++ipaddress==1.0.22 ++jaraco.functools==2.0 # via tempora ++jinja2==2.10.1 ++jmespath==0.9.4 ++jsondiff==1.1.1 # via moto ++jsonpickle==1.1 # via aws-xray-sdk ++jsonschema==2.6.0 ++junos-eznc==2.2.0 ++jxmlease==1.0.1 ++keyring==5.7.1 ++kubernetes==3.0.0 ++linode-python==1.1.1 ++lxml==4.3.3 # via junos-eznc, ncclient ++mako==1.0.7 ++markupsafe==1.1.1 ++mock==3.0.5 ++more-itertools==5.0.0 ++moto==1.3.7 ++msgpack-python==0.5.6 ++msgpack==0.5.6 ++ncclient==0.6.4 # via junos-eznc ++netaddr==0.7.19 # via junos-eznc ++oscrypto==1.2.0 # via certvalidator ++packaging==19.2 # via pytest ++paramiko==2.4.2 # via junos-eznc, ncclient, scp ++pathtools==0.1.2 # via watchdog ++pluggy==0.13.1 # via pytest ++portend==2.4 # via cherrypy ++psutil==5.6.6 ++py==1.8.0 # via pytest ++pyaml==19.4.1 # via moto ++pyasn1-modules==0.2.4 # via google-auth ++pyasn1==0.4.5 ++pycparser==2.19 ++pycryptodome==3.8.1 ++pynacl==1.3.0 # via paramiko ++pyopenssl==19.0.0 ++pyparsing==2.4.5 # via packaging ++pyserial==3.4 # via junos-eznc ++pytest-helpers-namespace==2019.1.8 ++pytest-salt-runtests-bridge==2019.7.10 ++pytest-salt==2020.1.27 ++pytest-tempdir==2019.10.12 ++pytest==4.6.6 ++python-dateutil==2.8.0 ++python-etcd==0.4.5 ++python-gnupg==0.4.4 ++python-jose==2.0.2 # via moto ++pytz==2019.1 # via moto, tempora ++pyvmomi==6.7.1.2018.12 ++pyyaml==5.1.2 ++pyzmq==18.0.1 ; python_version != "3.4" ++requests==2.21.0 ++responses==0.10.6 # via moto ++rfc3987==1.3.8 ++rsa==4.0 # via google-auth ++s3transfer==0.2.0 # via boto3 ++salttesting==2017.6.1 ++scp==0.13.2 # via junos-eznc ++setproctitle==1.1.10 ++six==1.12.0 # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kubernetes, mock, more-itertools, moto, ncclient, packaging, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, virtualenv, websocket-client ++smmap2==2.0.5 # via gitdb2 ++strict-rfc3339==0.7 ++tempora==1.14.1 # via portend ++timelib==0.2.4 ++urllib3==1.24.2 # via botocore, kubernetes, python-etcd, requests ++vcert==0.7.3 ++virtualenv==20.0.10 ++vultr==1.0.1 ++watchdog==0.9.0 ++wcwidth==0.1.7 # via pytest ++websocket-client==0.40.0 # via docker, kubernetes ++werkzeug==0.15.6 # via moto ++wrapt==1.11.1 # via aws-xray-sdk ++xmltodict==0.12.0 # via moto ++yamlordereddictloader==0.4.0 ++zc.lockfile==1.4 # via cherrypy +diff --git a/requirements/static/py3.8/docs.txt b/requirements/static/py3.8/docs.txt +new file mode 100644 +index 0000000000..ab3ce4ada7 +--- /dev/null ++++ b/requirements/static/py3.8/docs.txt +@@ -0,0 +1,30 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.8/docs.txt -v requirements/static/docs.in ++# ++alabaster==0.7.12 # via sphinx ++babel==2.7.0 # via sphinx ++certifi==2019.3.9 # via requests ++chardet==3.0.4 # via requests ++docutils==0.14 # via sphinx ++idna==2.8 # via requests ++imagesize==1.1.0 # via sphinx ++jinja2==2.10.1 # via sphinx ++markupsafe==1.1.1 # via jinja2 ++packaging==19.0 # via sphinx ++pygments==2.4.2 # via sphinx ++pyparsing==2.4.0 # via packaging ++pytz==2019.1 # via babel ++requests==2.22.0 # via sphinx ++six==1.12.0 # via packaging ++snowballstemmer==1.2.1 # via sphinx ++sphinx==2.0.1 ++sphinxcontrib-applehelp==1.0.1 # via sphinx ++sphinxcontrib-devhelp==1.0.1 # via sphinx ++sphinxcontrib-htmlhelp==1.0.2 # via sphinx ++sphinxcontrib-jsmath==1.0.1 # via sphinx ++sphinxcontrib-qthelp==1.0.2 # via sphinx ++sphinxcontrib-serializinghtml==1.1.3 # via sphinx ++urllib3==1.25.3 # via requests +diff --git a/requirements/static/py3.8/lint.txt b/requirements/static/py3.8/lint.txt +new file mode 100644 +index 0000000000..f027cab8e5 +--- /dev/null ++++ b/requirements/static/py3.8/lint.txt +@@ -0,0 +1,16 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.8/lint.txt -v requirements/static/lint.in ++# ++astroid==2.3.3 # via pylint ++isort==4.3.17 # via pylint ++lazy-object-proxy==1.4.3 # via astroid ++mccabe==0.6.1 # via pylint ++modernize==0.5 # via saltpylint ++pycodestyle==2.5.0 # via saltpylint ++pylint==2.4.4 ++saltpylint==2019.11.14 ++six==1.12.0 # via astroid ++wrapt==1.11.1 # via astroid +diff --git a/requirements/static/py3.8/linux-crypto.txt b/requirements/static/py3.8/linux-crypto.txt +new file mode 100644 +index 0000000000..f625936c6e +--- /dev/null ++++ b/requirements/static/py3.8/linux-crypto.txt +@@ -0,0 +1,8 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.8/linux-crypto.txt -v requirements/static/crypto.in ++# ++m2crypto==0.35.2 ++pycryptodomex==3.9.3 +diff --git a/requirements/static/py3.8/linux.txt b/requirements/static/py3.8/linux.txt +new file mode 100644 +index 0000000000..5d42a310fa +--- /dev/null ++++ b/requirements/static/py3.8/linux.txt +@@ -0,0 +1,119 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.8/linux.txt -v requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/linux.in ++# ++apache-libcloud==2.0.0 ++argh==0.26.2 # via watchdog ++asn1crypto==1.3.0 # via certvalidator, cryptography, oscrypto ++atomicwrites==1.3.0 # via pytest ++attrs==19.1.0 # via pytest ++aws-xray-sdk==0.95 # via moto ++backports.functools-lru-cache==1.5 # via cheroot ++bcrypt==3.1.6 # via paramiko ++boto3==1.9.132 ++boto==2.49.0 ++botocore==1.12.132 # via boto3, moto, s3transfer ++cachetools==3.1.0 # via google-auth ++certifi==2019.3.9 ++certvalidator==0.11.1 # via vcert ++cffi==1.12.2 ++chardet==3.0.4 # via requests ++cheetah3==3.1.0 ++cheroot==6.5.4 # via cherrypy ++cherrypy==17.3.0 ++contextlib2==0.5.5 # via cherrypy ++croniter==0.3.29 ++cryptography==2.6.1 # via moto, paramiko, pyopenssl, vcert ++dnspython==1.16.0 ++docker-pycreds==0.4.0 # via docker ++docker==3.7.2 ++docutils==0.14 # via botocore ++ecdsa==0.13.3 # via python-jose ++future==0.17.1 # via python-jose ++genshi==0.7.3 ++gitdb2==2.0.5 # via gitpython ++gitpython==2.1.11 ++google-auth==1.6.3 # via kubernetes ++hgtools==8.1.1 ++idna==2.8 # via requests ++ipaddress==1.0.22 # via kubernetes ++jaraco.functools==2.0 # via tempora ++jinja2==2.10.1 ++jmespath==0.9.4 ++jsondiff==1.1.1 # via moto ++jsonpickle==1.1 # via aws-xray-sdk ++jsonschema==2.6.0 ++junos-eznc==2.2.0 ++jxmlease==1.0.1 ++kazoo==2.6.1 ++keyring==5.7.1 ++kubernetes==3.0.0 ++libnacl==1.7.1 ++lxml==4.3.3 # via junos-eznc, ncclient ++mako==1.1.0 ++markupsafe==1.1.1 ++mock==3.0.5 ++more-itertools==5.0.0 ++moto==1.3.7 ++msgpack==0.5.6 ++ncclient==0.6.4 # via junos-eznc ++netaddr==0.7.19 # via junos-eznc ++oscrypto==1.2.0 # via certvalidator ++packaging==19.2 # via pytest ++paramiko==2.4.2 ++pathtools==0.1.2 # via watchdog ++pluggy==0.13.0 # via pytest ++portend==2.4 # via cherrypy ++psutil==5.6.1 ++py==1.8.0 # via pytest ++pyaml==19.4.1 # via moto ++pyasn1-modules==0.2.4 # via google-auth ++pyasn1==0.4.5 # via paramiko, pyasn1-modules, rsa ++pycparser==2.19 # via cffi ++pycrypto==2.6.1 ; sys_platform not in "win32,darwin" ++pycryptodome==3.8.1 # via python-jose ++pygit2==0.28.2 ++pyinotify==0.9.6 ++pynacl==1.3.0 # via paramiko ++pyopenssl==19.0.0 ++pyparsing==2.4.5 # via packaging ++pyserial==3.4 # via junos-eznc ++pytest-helpers-namespace==2019.1.8 ++pytest-salt-runtests-bridge==2019.7.10 ++pytest-salt==2020.1.27 ++pytest-tempdir==2019.10.12 ++pytest==4.6.6 ++python-dateutil==2.8.0 # via botocore, croniter, kubernetes, moto, vcert ++python-etcd==0.4.5 ++python-gnupg==0.4.4 ++python-jose==2.0.2 # via moto ++pytz==2019.1 # via moto, tempora ++pyvmomi==6.7.1.2018.12 ++pyyaml==5.1.2 ++pyzmq==18.0.1 ; python_version != "3.4" ++requests==2.21.0 ++responses==0.10.6 # via moto ++rfc3987==1.3.8 ++rsa==4.0 # via google-auth ++s3transfer==0.2.0 # via boto3 ++salttesting==2017.6.1 ++scp==0.13.2 # via junos-eznc ++setproctitle==1.1.10 ++setuptools-scm==3.2.0 ++six==1.12.0 # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kazoo, kubernetes, mock, more-itertools, moto, ncclient, packaging, pygit2, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, websocket-client ++smmap2==2.0.5 # via gitdb2 ++strict-rfc3339==0.7 ++tempora==1.14.1 # via portend ++timelib==0.2.4 ++urllib3==1.24.2 # via botocore, kubernetes, python-etcd, requests ++vcert==0.7.3 ++virtualenv==16.4.3 ++watchdog==0.9.0 ++wcwidth==0.1.7 # via pytest ++websocket-client==0.40.0 # via docker, kubernetes ++werkzeug==0.15.6 # via moto ++wrapt==1.11.1 # via aws-xray-sdk ++xmltodict==0.12.0 # via moto ++zc.lockfile==1.4 # via cherrypy +diff --git a/requirements/static/py3.9/cloud.txt b/requirements/static/py3.9/cloud.txt +new file mode 100644 +index 0000000000..cc569aa714 +--- /dev/null ++++ b/requirements/static/py3.9/cloud.txt +@@ -0,0 +1,115 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.9/cloud.txt -v requirements/static/cloud.in ++# ++adal==1.2.1 # via azure-datalake-store, msrestazure ++asn1crypto==0.24.0 # via cryptography ++azure-applicationinsights==0.1.0 # via azure ++azure-batch==4.1.3 # via azure ++azure-common==1.1.18 # via azure-applicationinsights, azure-batch, azure-cosmosdb-table, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy, azure-storage-blob, azure-storage-common, azure-storage-file, azure-storage-queue ++azure-cosmosdb-nspkg==2.0.2 # via azure-cosmosdb-table ++azure-cosmosdb-table==1.0.5 # via azure ++azure-datalake-store==0.0.44 # via azure ++azure-eventgrid==1.2.0 # via azure ++azure-graphrbac==0.40.0 # via azure ++azure-keyvault==1.1.0 # via azure ++azure-loganalytics==0.1.0 # via azure ++azure-mgmt-advisor==1.0.1 # via azure-mgmt ++azure-mgmt-applicationinsights==0.1.1 # via azure-mgmt ++azure-mgmt-authorization==0.50.0 # via azure-mgmt ++azure-mgmt-batch==5.0.1 # via azure-mgmt ++azure-mgmt-batchai==2.0.0 # via azure-mgmt ++azure-mgmt-billing==0.2.0 # via azure-mgmt ++azure-mgmt-cdn==3.1.0 # via azure-mgmt ++azure-mgmt-cognitiveservices==3.0.0 # via azure-mgmt ++azure-mgmt-commerce==1.0.1 # via azure-mgmt ++azure-mgmt-compute==4.6.0 # via azure-mgmt ++azure-mgmt-consumption==2.0.0 # via azure-mgmt ++azure-mgmt-containerinstance==1.4.1 # via azure-mgmt ++azure-mgmt-containerregistry==2.7.0 # via azure-mgmt ++azure-mgmt-containerservice==4.4.0 # via azure-mgmt ++azure-mgmt-cosmosdb==0.4.1 # via azure-mgmt ++azure-mgmt-datafactory==0.6.0 # via azure-mgmt ++azure-mgmt-datalake-analytics==0.6.0 # via azure-mgmt ++azure-mgmt-datalake-nspkg==3.0.1 # via azure-mgmt-datalake-analytics, azure-mgmt-datalake-store ++azure-mgmt-datalake-store==0.5.0 # via azure-mgmt ++azure-mgmt-datamigration==1.0.0 # via azure-mgmt ++azure-mgmt-devspaces==0.1.0 # via azure-mgmt ++azure-mgmt-devtestlabs==2.2.0 # via azure-mgmt ++azure-mgmt-dns==2.1.0 # via azure-mgmt ++azure-mgmt-eventgrid==1.0.0 # via azure-mgmt ++azure-mgmt-eventhub==2.5.0 # via azure-mgmt ++azure-mgmt-hanaonazure==0.1.1 # via azure-mgmt ++azure-mgmt-iotcentral==0.1.0 # via azure-mgmt ++azure-mgmt-iothub==0.5.0 # via azure-mgmt ++azure-mgmt-iothubprovisioningservices==0.2.0 # via azure-mgmt ++azure-mgmt-keyvault==1.1.0 # via azure-mgmt ++azure-mgmt-loganalytics==0.2.0 # via azure-mgmt ++azure-mgmt-logic==3.0.0 # via azure-mgmt ++azure-mgmt-machinelearningcompute==0.4.1 # via azure-mgmt ++azure-mgmt-managementgroups==0.1.0 # via azure-mgmt ++azure-mgmt-managementpartner==0.1.0 # via azure-mgmt ++azure-mgmt-maps==0.1.0 # via azure-mgmt ++azure-mgmt-marketplaceordering==0.1.0 # via azure-mgmt ++azure-mgmt-media==1.0.0 # via azure-mgmt ++azure-mgmt-monitor==0.5.2 # via azure-mgmt ++azure-mgmt-msi==0.2.0 # via azure-mgmt ++azure-mgmt-network==2.6.0 # via azure-mgmt ++azure-mgmt-notificationhubs==2.0.0 # via azure-mgmt ++azure-mgmt-nspkg==3.0.2 # via azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-consumption, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-nspkg, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web ++azure-mgmt-policyinsights==0.1.0 # via azure-mgmt ++azure-mgmt-powerbiembedded==2.0.0 # via azure-mgmt ++azure-mgmt-rdbms==1.8.0 # via azure-mgmt ++azure-mgmt-recoveryservices==0.3.0 # via azure-mgmt ++azure-mgmt-recoveryservicesbackup==0.3.0 # via azure-mgmt ++azure-mgmt-redis==5.0.0 # via azure-mgmt ++azure-mgmt-relay==0.1.0 # via azure-mgmt ++azure-mgmt-reservations==0.2.1 # via azure-mgmt ++azure-mgmt-resource==2.1.0 # via azure-mgmt ++azure-mgmt-scheduler==2.0.0 # via azure-mgmt ++azure-mgmt-search==2.0.0 # via azure-mgmt ++azure-mgmt-servicebus==0.5.3 # via azure-mgmt ++azure-mgmt-servicefabric==0.2.0 # via azure-mgmt ++azure-mgmt-signalr==0.1.1 # via azure-mgmt ++azure-mgmt-sql==0.9.1 # via azure-mgmt ++azure-mgmt-storage==2.0.0 # via azure-mgmt ++azure-mgmt-subscription==0.2.0 # via azure-mgmt ++azure-mgmt-trafficmanager==0.50.0 # via azure-mgmt ++azure-mgmt-web==0.35.0 # via azure-mgmt ++azure-mgmt==4.0.0 # via azure ++azure-nspkg==3.0.2 # via azure-applicationinsights, azure-batch, azure-cosmosdb-nspkg, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-nspkg, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy ++azure-servicebus==0.21.1 # via azure ++azure-servicefabric==6.3.0.0 # via azure ++azure-servicemanagement-legacy==0.20.6 # via azure ++azure-storage-blob==1.5.0 # via azure ++azure-storage-common==1.4.0 # via azure-cosmosdb-table, azure-storage-blob, azure-storage-file, azure-storage-queue ++azure-storage-file==1.4.0 # via azure ++azure-storage-queue==1.4.0 # via azure ++azure==4.0.0 ++certifi==2019.3.9 # via msrest, requests ++cffi==1.12.2 # via azure-datalake-store, cryptography ++chardet==3.0.4 # via requests ++cryptography==2.6.1 # via adal, azure-cosmosdb-table, azure-keyvault, azure-storage-common, requests-ntlm, smbprotocol ++idna==2.8 # via requests ++isodate==0.6.0 # via msrest ++msrest==0.6.6 # via azure-applicationinsights, azure-eventgrid, azure-keyvault, azure-loganalytics, azure-mgmt-cdn, azure-mgmt-compute, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-dns, azure-mgmt-eventhub, azure-mgmt-keyvault, azure-mgmt-media, azure-mgmt-network, azure-mgmt-rdbms, azure-mgmt-resource, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-servicefabric, msrestazure ++msrestazure==0.6.0 # via azure-batch, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web ++netaddr==0.7.19 ++ntlm-auth==1.3.0 # via requests-ntlm, smbprotocol ++oauthlib==3.0.1 # via requests-oauthlib ++profitbricks==4.1.3 ++pyasn1==0.4.5 # via smbprotocol ++pycparser==2.19 # via cffi ++pyjwt==1.7.1 # via adal ++pypsexec==0.1.0 ++python-dateutil==2.8.0 # via adal, azure-cosmosdb-table, azure-storage-common ++pywinrm==0.3.0 ++requests-ntlm==1.1.0 # via pywinrm ++requests-oauthlib==1.2.0 # via msrest ++requests==2.21.0 # via adal, azure-cosmosdb-table, azure-datalake-store, azure-keyvault, azure-servicebus, azure-servicemanagement-legacy, azure-storage-common, msrest, profitbricks, pywinrm, requests-ntlm, requests-oauthlib ++six==1.12.0 # via cryptography, isodate, profitbricks, pypsexec, python-dateutil, pywinrm, smbprotocol ++smbprotocol==0.1.1 # via pypsexec ++urllib3==1.24.2 # via requests ++xmltodict==0.12.0 # via pywinrm +diff --git a/requirements/static/py3.9/darwin-crypto.txt b/requirements/static/py3.9/darwin-crypto.txt +new file mode 100644 +index 0000000000..838b5c329f +--- /dev/null ++++ b/requirements/static/py3.9/darwin-crypto.txt +@@ -0,0 +1,8 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.9/darwin-crypto.txt -v requirements/static/crypto.in ++# ++m2crypto==0.35.2 ++pycryptodomex==3.9.0 +diff --git a/requirements/static/py3.9/darwin.txt b/requirements/static/py3.9/darwin.txt +new file mode 100644 +index 0000000000..419f8ee1d1 +--- /dev/null ++++ b/requirements/static/py3.9/darwin.txt +@@ -0,0 +1,123 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.9/darwin.txt -v pkg/osx/req.txt pkg/osx/req_ext.txt requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/darwin.in ++# ++apache-libcloud==2.4.0 ++appdirs==1.4.3 # via virtualenv ++argh==0.26.2 # via watchdog ++asn1crypto==1.3.0 # via certvalidator, cryptography, oscrypto ++atomicwrites==1.3.0 # via pytest ++attrs==19.1.0 # via pytest ++aws-xray-sdk==0.95 # via moto ++backports.functools-lru-cache==1.5 # via cheroot ++backports.ssl_match_hostname==3.7.0.1 ++bcrypt==3.1.6 # via paramiko ++boto3==1.9.132 ++boto==2.49.0 ++botocore==1.12.132 # via boto3, moto, s3transfer ++cachetools==3.1.0 # via google-auth ++certifi==2019.3.9 ++certvalidator==0.11.1 # via vcert ++cffi==1.12.2 ++chardet==3.0.4 # via requests ++cheetah3==3.1.0 ++cheroot==6.5.5 # via cherrypy ++cherrypy==17.4.1 ++click==7.0 ++clustershell==1.8.1 ++contextlib2==0.5.5 # via cherrypy ++croniter==0.3.29 ++cryptography==2.6.1 ++distlib==0.3.0 # via virtualenv ++dnspython==1.16.0 ++docker-pycreds==0.4.0 # via docker ++docker==3.7.2 ++docutils==0.14 # via botocore ++ecdsa==0.13.3 # via python-jose ++enum34==1.1.6 ++filelock==3.0.12 # via virtualenv ++future==0.17.1 # via python-jose ++genshi==0.7.3 ++gitdb2==2.0.5 # via gitpython ++gitpython==2.1.15 ++google-auth==1.6.3 # via kubernetes ++idna==2.8 ++ipaddress==1.0.22 ++jaraco.functools==2.0 # via tempora ++jinja2==2.10.1 ++jmespath==0.9.4 ++jsondiff==1.1.1 # via moto ++jsonpickle==1.1 # via aws-xray-sdk ++jsonschema==2.6.0 ++junos-eznc==2.2.0 ++jxmlease==1.0.1 ++keyring==5.7.1 ++kubernetes==3.0.0 ++linode-python==1.1.1 ++lxml==4.3.3 # via junos-eznc, ncclient ++mako==1.0.7 ++markupsafe==1.1.1 ++mock==3.0.5 ++more-itertools==5.0.0 ++moto==1.3.7 ++msgpack-python==0.5.6 ++msgpack==0.5.6 ++ncclient==0.6.4 # via junos-eznc ++netaddr==0.7.19 # via junos-eznc ++oscrypto==1.2.0 # via certvalidator ++packaging==19.2 # via pytest ++paramiko==2.4.2 # via junos-eznc, ncclient, scp ++pathtools==0.1.2 # via watchdog ++pluggy==0.13.1 # via pytest ++portend==2.4 # via cherrypy ++psutil==5.6.6 ++py==1.8.0 # via pytest ++pyaml==19.4.1 # via moto ++pyasn1-modules==0.2.4 # via google-auth ++pyasn1==0.4.5 ++pycparser==2.19 ++pycryptodome==3.8.1 ++pynacl==1.3.0 # via paramiko ++pyopenssl==19.0.0 ++pyparsing==2.4.5 # via packaging ++pyserial==3.4 # via junos-eznc ++pytest-helpers-namespace==2019.1.8 ++pytest-salt-runtests-bridge==2019.7.10 ++pytest-salt==2020.1.27 ++pytest-tempdir==2019.10.12 ++pytest==4.6.6 ++python-dateutil==2.8.0 ++python-etcd==0.4.5 ++python-gnupg==0.4.4 ++python-jose==2.0.2 # via moto ++pytz==2019.1 # via moto, tempora ++pyvmomi==6.7.1.2018.12 ++pyyaml==5.1.2 ++pyzmq==18.0.1 ; python_version != "3.4" ++requests==2.21.0 ++responses==0.10.6 # via moto ++rfc3987==1.3.8 ++rsa==4.0 # via google-auth ++s3transfer==0.2.0 # via boto3 ++salttesting==2017.6.1 ++scp==0.13.2 # via junos-eznc ++setproctitle==1.1.10 ++six==1.12.0 # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kubernetes, mock, more-itertools, moto, ncclient, packaging, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, virtualenv, websocket-client ++smmap2==2.0.5 # via gitdb2 ++strict-rfc3339==0.7 ++tempora==1.14.1 # via portend ++timelib==0.2.4 ++urllib3==1.24.2 # via botocore, kubernetes, python-etcd, requests ++vcert==0.7.3 ++virtualenv==20.0.10 ++vultr==1.0.1 ++watchdog==0.9.0 ++wcwidth==0.1.7 # via pytest ++websocket-client==0.40.0 # via docker, kubernetes ++werkzeug==0.15.6 # via moto ++wrapt==1.11.1 # via aws-xray-sdk ++xmltodict==0.12.0 # via moto ++yamlordereddictloader==0.4.0 ++zc.lockfile==1.4 # via cherrypy +diff --git a/requirements/static/py3.9/docs.txt b/requirements/static/py3.9/docs.txt +new file mode 100644 +index 0000000000..89552f5688 +--- /dev/null ++++ b/requirements/static/py3.9/docs.txt +@@ -0,0 +1,30 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.9/docs.txt -v requirements/static/docs.in ++# ++alabaster==0.7.12 # via sphinx ++babel==2.7.0 # via sphinx ++certifi==2019.3.9 # via requests ++chardet==3.0.4 # via requests ++docutils==0.14 # via sphinx ++idna==2.8 # via requests ++imagesize==1.1.0 # via sphinx ++jinja2==2.10.1 # via sphinx ++markupsafe==1.1.1 # via jinja2 ++packaging==19.0 # via sphinx ++pygments==2.4.2 # via sphinx ++pyparsing==2.4.0 # via packaging ++pytz==2019.1 # via babel ++requests==2.22.0 # via sphinx ++six==1.12.0 # via packaging ++snowballstemmer==1.2.1 # via sphinx ++sphinx==2.0.1 ++sphinxcontrib-applehelp==1.0.1 # via sphinx ++sphinxcontrib-devhelp==1.0.1 # via sphinx ++sphinxcontrib-htmlhelp==1.0.2 # via sphinx ++sphinxcontrib-jsmath==1.0.1 # via sphinx ++sphinxcontrib-qthelp==1.0.2 # via sphinx ++sphinxcontrib-serializinghtml==1.1.3 # via sphinx ++urllib3==1.25.3 # via requests +diff --git a/requirements/static/py3.9/lint.txt b/requirements/static/py3.9/lint.txt +new file mode 100644 +index 0000000000..bb8a2756a3 +--- /dev/null ++++ b/requirements/static/py3.9/lint.txt +@@ -0,0 +1,16 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.9/lint.txt -v requirements/static/lint.in ++# ++astroid==2.3.3 # via pylint ++isort==4.3.17 # via pylint ++lazy-object-proxy==1.4.3 # via astroid ++mccabe==0.6.1 # via pylint ++modernize==0.5 # via saltpylint ++pycodestyle==2.5.0 # via saltpylint ++pylint==2.4.4 ++saltpylint==2019.11.14 ++six==1.12.0 # via astroid ++wrapt==1.11.1 # via astroid +diff --git a/requirements/static/py3.9/linux-crypto.txt b/requirements/static/py3.9/linux-crypto.txt +new file mode 100644 +index 0000000000..148f8bec31 +--- /dev/null ++++ b/requirements/static/py3.9/linux-crypto.txt +@@ -0,0 +1,8 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.9/linux-crypto.txt -v requirements/static/crypto.in ++# ++m2crypto==0.35.2 ++pycryptodomex==3.9.3 +diff --git a/requirements/static/py3.9/linux.txt b/requirements/static/py3.9/linux.txt +new file mode 100644 +index 0000000000..b7eb8320de +--- /dev/null ++++ b/requirements/static/py3.9/linux.txt +@@ -0,0 +1,119 @@ ++# ++# This file is autogenerated by pip-compile ++# To update, run: ++# ++# pip-compile -o requirements/static/py3.9/linux.txt -v requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/linux.in ++# ++apache-libcloud==2.0.0 ++argh==0.26.2 # via watchdog ++asn1crypto==1.3.0 # via certvalidator, cryptography, oscrypto ++atomicwrites==1.3.0 # via pytest ++attrs==19.1.0 # via pytest ++aws-xray-sdk==0.95 # via moto ++backports.functools-lru-cache==1.5 # via cheroot ++bcrypt==3.1.6 # via paramiko ++boto3==1.9.132 ++boto==2.49.0 ++botocore==1.12.132 # via boto3, moto, s3transfer ++cachetools==3.1.0 # via google-auth ++certifi==2019.3.9 ++certvalidator==0.11.1 # via vcert ++cffi==1.12.2 ++chardet==3.0.4 # via requests ++cheetah3==3.1.0 ++cheroot==6.5.4 # via cherrypy ++cherrypy==17.3.0 ++contextlib2==0.5.5 # via cherrypy ++croniter==0.3.29 ++cryptography==2.6.1 # via moto, paramiko, pyopenssl, vcert ++dnspython==1.16.0 ++docker-pycreds==0.4.0 # via docker ++docker==3.7.2 ++docutils==0.14 # via botocore ++ecdsa==0.13.3 # via python-jose ++future==0.17.1 # via python-jose ++genshi==0.7.3 ++gitdb2==2.0.5 # via gitpython ++gitpython==2.1.11 ++google-auth==1.6.3 # via kubernetes ++hgtools==8.1.1 ++idna==2.8 # via requests ++ipaddress==1.0.22 # via kubernetes ++jaraco.functools==2.0 # via tempora ++jinja2==2.10.1 ++jmespath==0.9.4 ++jsondiff==1.1.1 # via moto ++jsonpickle==1.1 # via aws-xray-sdk ++jsonschema==2.6.0 ++junos-eznc==2.2.0 ++jxmlease==1.0.1 ++kazoo==2.6.1 ++keyring==5.7.1 ++kubernetes==3.0.0 ++libnacl==1.7.1 ++lxml==4.3.3 # via junos-eznc, ncclient ++mako==1.1.0 ++markupsafe==1.1.1 ++mock==3.0.5 ++more-itertools==5.0.0 ++moto==1.3.7 ++msgpack==0.5.6 ++ncclient==0.6.4 # via junos-eznc ++netaddr==0.7.19 # via junos-eznc ++oscrypto==1.2.0 # via certvalidator ++packaging==19.2 # via pytest ++paramiko==2.4.2 ++pathtools==0.1.2 # via watchdog ++pluggy==0.13.0 # via pytest ++portend==2.4 # via cherrypy ++psutil==5.6.1 ++py==1.8.0 # via pytest ++pyaml==19.4.1 # via moto ++pyasn1-modules==0.2.4 # via google-auth ++pyasn1==0.4.5 # via paramiko, pyasn1-modules, rsa ++pycparser==2.19 # via cffi ++pycrypto==2.6.1 ; sys_platform not in "win32,darwin" ++pycryptodome==3.8.1 # via python-jose ++pygit2==0.28.2 ++pyinotify==0.9.6 ++pynacl==1.3.0 # via paramiko ++pyopenssl==19.0.0 ++pyparsing==2.4.5 # via packaging ++pyserial==3.4 # via junos-eznc ++pytest-helpers-namespace==2019.1.8 ++pytest-salt-runtests-bridge==2019.7.10 ++pytest-salt==2020.1.27 ++pytest-tempdir==2019.10.12 ++pytest==4.6.6 ++python-dateutil==2.8.0 # via botocore, croniter, kubernetes, moto, vcert ++python-etcd==0.4.5 ++python-gnupg==0.4.4 ++python-jose==2.0.2 # via moto ++pytz==2019.1 # via moto, tempora ++pyvmomi==6.7.1.2018.12 ++pyyaml==5.1.2 ++pyzmq==18.0.1 ; python_version != "3.4" ++requests==2.21.0 ++responses==0.10.6 # via moto ++rfc3987==1.3.8 ++rsa==4.0 # via google-auth ++s3transfer==0.2.0 # via boto3 ++salttesting==2017.6.1 ++scp==0.13.2 # via junos-eznc ++setproctitle==1.1.10 ++setuptools-scm==3.2.0 ++six==1.12.0 # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kazoo, kubernetes, mock, more-itertools, moto, ncclient, packaging, pygit2, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, websocket-client ++smmap2==2.0.5 # via gitdb2 ++strict-rfc3339==0.7 ++tempora==1.14.1 # via portend ++timelib==0.2.4 ++urllib3==1.24.2 # via botocore, kubernetes, python-etcd, requests ++vcert==0.7.3 ++virtualenv==16.4.3 ++watchdog==0.9.0 ++wcwidth==0.1.7 # via pytest ++websocket-client==0.40.0 # via docker, kubernetes ++werkzeug==0.15.6 # via moto ++wrapt==1.11.1 # via aws-xray-sdk ++xmltodict==0.12.0 # via moto ++zc.lockfile==1.4 # via cherrypy +diff --git a/salt/client/mixins.py b/salt/client/mixins.py +index 131aa1e3de..8ca8c7fbf6 100644 +--- a/salt/client/mixins.py ++++ b/salt/client/mixins.py +@@ -4,7 +4,9 @@ A collection of mixins useful for the various *Client interfaces + ''' + + # Import Python libs +-from __future__ import absolute_import, print_function, with_statement, unicode_literals ++from __future__ import absolute_import, print_function, unicode_literals, with_statement ++ ++import copy as pycopy + import fnmatch + import signal + import logging +@@ -34,31 +36,40 @@ from salt.ext import six + + # Import 3rd-party libs + import salt.ext.tornado.stack_context ++try: ++ from collections.abc import Mapping, MutableMapping ++except ImportError: ++ # pylint: disable=no-name-in-module ++ from collections import Mapping, MutableMapping ++ + + log = logging.getLogger(__name__) + +-CLIENT_INTERNAL_KEYWORDS = frozenset([ +- 'client', +- 'cmd', +- 'eauth', +- 'fun', +- 'kwarg', +- 'match', +- 'token', +- '__jid__', +- '__tag__', +- '__user__', +- 'username', +- 'password', +- 'full_return', +- 'print_event' +-]) +- +- +-class ClientFuncsDict(collections.MutableMapping): +- ''' ++CLIENT_INTERNAL_KEYWORDS = frozenset( ++ [ ++ "client", ++ "cmd", ++ "eauth", ++ "fun", ++ "kwarg", ++ "match", ++ "token", ++ "__jid__", ++ "__tag__", ++ "__user__", ++ "username", ++ "password", ++ "full_return", ++ "print_event", ++ ] ++) ++ ++ ++class ClientFuncsDict(MutableMapping): ++ """ + Class to make a read-only dict for accessing runner funcs "directly" +- ''' ++ """ ++ + def __init__(self, client): + self.client = client + +@@ -141,9 +152,9 @@ class SyncClientMixin(object): + crypt='clear', + usage='master_call') as channel: + ret = channel.send(load) +- if isinstance(ret, collections.Mapping): +- if 'error' in ret: +- salt.utils.error.raise_error(**ret['error']) ++ if isinstance(ret, Mapping): ++ if "error" in ret: ++ salt.utils.error.raise_error(**ret["error"]) + return ret + + def cmd_sync(self, low, timeout=None, full_return=False): +diff --git a/salt/ext/tornado/httputil.py b/salt/ext/tornado/httputil.py +index d49733481a..c5b9c242d5 100644 +--- a/salt/ext/tornado/httputil.py ++++ b/salt/ext/tornado/httputil.py +@@ -36,6 +36,13 @@ from salt.ext.tornado.escape import native_str, parse_qs_bytes, utf8 + from salt.ext.tornado.log import gen_log + from salt.ext.tornado.util import ObjectDict, PY3 + ++try: ++ from collections.abc import MutableMapping ++except ImportError: ++ # pylint: disable=no-name-in-module ++ from collections import MutableMapping ++ ++ + if PY3: + import http.cookies as Cookie + from http.client import responses +@@ -104,7 +111,7 @@ class _NormalizedHeaderCache(dict): + _normalized_headers = _NormalizedHeaderCache(1000) + + +-class HTTPHeaders(collections.MutableMapping): ++class HTTPHeaders(MutableMapping): + """A dictionary that maintains ``Http-Header-Case`` for all keys. + + Supports multiple values per key via a pair of new methods, +diff --git a/salt/grains/core.py b/salt/grains/core.py +index 358b66fdb0..38290d034a 100644 +--- a/salt/grains/core.py ++++ b/salt/grains/core.py +@@ -47,13 +47,29 @@ try: + # Extend the default list of supported distros. This will be used for the + # /etc/DISTRO-release checking that is part of linux_distribution() + from platform import _supported_dists +- _supported_dists += ('arch', 'mageia', 'meego', 'vmware', 'bluewhite64', +- 'slamd64', 'ovs', 'system', 'mint', 'oracle', 'void') ++ ++ _supported_dists += ( ++ "arch", ++ "mageia", ++ "meego", ++ "vmware", ++ "bluewhite64", ++ "slamd64", ++ "ovs", ++ "system", ++ "mint", ++ "oracle", ++ "void", ++ ) + + def linux_distribution(**kwargs): + with warnings.catch_warnings(): + warnings.simplefilter("ignore") +- return _deprecated_linux_distribution(supported_dists=_supported_dists, **kwargs) ++ return _deprecated_linux_distribution( ++ supported_dists=_supported_dists, **kwargs ++ ) ++ ++ + except ImportError: + from distro import linux_distribution + +@@ -1974,9 +1990,9 @@ def os_data(): + 'Getting OS name, release, and codename from ' + 'platform.linux_distribution()' + ) +- (osname, osrelease, oscodename) = \ +- [x.strip('"').strip("'") for x in +- linux_distribution()] ++ (osname, osrelease, oscodename) = [ ++ x.strip('"').strip("'") for x in linux_distribution() ++ ] + # Try to assign these three names based on the lsb info, they tend to + # be more accurate than what python gets from /etc/DISTRO-release. + # It's worth noting that Ubuntu has patched their Python distribution +diff --git a/salt/renderers/stateconf.py b/salt/renderers/stateconf.py +index 5c8a8322ed..97308087f5 100644 +--- a/salt/renderers/stateconf.py ++++ b/salt/renderers/stateconf.py +@@ -223,9 +223,9 @@ def render(input, saltenv='base', sls='', argline='', **kws): + if STATE_CONF: + tmplctx = STATE_CONF.copy() + if tmplctx: +- prefix = sls + '::' ++ prefix = sls + "::" + tmplctx = { +- k[len(prefix):] if k.startswith(prefix) else k: v ++ k[len(prefix) :] if k.startswith(prefix) else k: v + for k, v in six.iteritems(tmplctx) + } + else: +diff --git a/salt/utils/args.py b/salt/utils/args.py +index 666a502498..f7961cf012 100644 +--- a/salt/utils/args.py ++++ b/salt/utils/args.py +@@ -238,8 +238,13 @@ if six.PY3: + + + def get_function_argspec(func, is_class_method=None): +- ''' +- A small wrapper around getargspec that also supports callable classes ++ """ ++ A small wrapper around getargspec that also supports callable classes and wrapped functions ++ ++ If the given function is a wrapper around another function (i.e. has a ++ ``__wrapped__`` attribute), return the functions specification of the underlying ++ function. ++ + :param is_class_method: Pass True if you are sure that the function being passed + is a class method. The reason for this is that on Python 3 + ``inspect.ismethod`` only returns ``True`` for bound methods, +@@ -247,10 +252,13 @@ def get_function_argspec(func, is_class_method=None): + methods. So, on Python 3, in case of a class method, you'd + need the class to which the function belongs to be instantiated + and this is not always wanted. +- ''' ++ """ + if not callable(func): + raise TypeError('{0} is not a callable'.format(func)) + ++ if hasattr(func, "__wrapped__"): ++ func = func.__wrapped__ ++ + if six.PY2: + if is_class_method is True: + aspec = inspect.getargspec(func) +diff --git a/salt/utils/decorators/path.py b/salt/utils/decorators/path.py +index 4adacf0e4e..8ee7fb1d11 100644 +--- a/salt/utils/decorators/path.py ++++ b/salt/utils/decorators/path.py +@@ -4,10 +4,11 @@ Decorators for salt.utils.path + ''' + from __future__ import absolute_import, print_function, unicode_literals + ++import functools ++ + # Import Salt libs + import salt.utils.path + from salt.exceptions import CommandNotFoundError +-from salt.utils.decorators.signature import identical_signature_wrapper + + + def which(exe): +@@ -15,13 +16,16 @@ def which(exe): + Decorator wrapper for salt.utils.path.which + ''' + def wrapper(function): ++ @functools.wraps(function) + def wrapped(*args, **kwargs): + if salt.utils.path.which(exe) is None: + raise CommandNotFoundError( + 'The \'{0}\' binary was not found in $PATH.'.format(exe) + ) + return function(*args, **kwargs) +- return identical_signature_wrapper(function, wrapped) ++ ++ return wrapped ++ + return wrapper + + +@@ -30,6 +34,7 @@ def which_bin(exes): + Decorator wrapper for salt.utils.path.which_bin + ''' + def wrapper(function): ++ @functools.wraps(function) + def wrapped(*args, **kwargs): + if salt.utils.path.which_bin(exes) is None: + raise CommandNotFoundError( +@@ -39,5 +44,7 @@ def which_bin(exes): + ) + ) + return function(*args, **kwargs) +- return identical_signature_wrapper(function, wrapped) ++ ++ return wrapped ++ + return wrapper +diff --git a/salt/utils/jinja.py b/salt/utils/jinja.py +index 6e4261e68e..31ce179808 100644 +--- a/salt/utils/jinja.py ++++ b/salt/utils/jinja.py +@@ -6,7 +6,6 @@ Jinja loading utils to enable a more powerful backend for jinja templates + # Import python libs + from __future__ import absolute_import, unicode_literals + import atexit +-import collections + import logging + import os.path + import pipes +@@ -37,6 +36,13 @@ import salt.utils.yaml + from salt.utils.decorators.jinja import jinja_filter, jinja_test, jinja_global + from salt.utils.odict import OrderedDict + ++try: ++ from collections.abc import Hashable ++except ImportError: ++ # pylint: disable=no-name-in-module ++ from collections import Hashable ++ ++ + log = logging.getLogger(__name__) + + __all__ = [ +@@ -329,7 +335,7 @@ def to_bool(val): + return val.lower() in ('yes', '1', 'true') + if isinstance(val, six.integer_types): + return val > 0 +- if not isinstance(val, collections.Hashable): ++ if not isinstance(val, Hashable): + return len(val) > 0 + return False + +@@ -500,7 +506,7 @@ def unique(values): + ['a', 'b', 'c'] + ''' + ret = None +- if isinstance(values, collections.Hashable): ++ if isinstance(values, Hashable): + ret = set(values) + else: + ret = [] +@@ -564,8 +570,8 @@ def lst_avg(lst): + + 2.5 + ''' +- if not isinstance(lst, collections.Hashable): +- return float(sum(lst)/len(lst)) ++ if not isinstance(lst, Hashable): ++ return float(sum(lst) / len(lst)) + return float(lst) + + +@@ -585,7 +591,7 @@ def union(lst1, lst2): + + [1, 2, 3, 4, 6] + ''' +- if isinstance(lst1, collections.Hashable) and isinstance(lst2, collections.Hashable): ++ if isinstance(lst1, Hashable) and isinstance(lst2, Hashable): + return set(lst1) | set(lst2) + return unique(lst1 + lst2) + +@@ -606,7 +612,7 @@ def intersect(lst1, lst2): + + [2, 4] + ''' +- if isinstance(lst1, collections.Hashable) and isinstance(lst2, collections.Hashable): ++ if isinstance(lst1, Hashable) and isinstance(lst2, Hashable): + return set(lst1) & set(lst2) + return unique([ele for ele in lst1 if ele in lst2]) + +@@ -627,7 +633,7 @@ def difference(lst1, lst2): + + [1, 3, 6] + ''' +- if isinstance(lst1, collections.Hashable) and isinstance(lst2, collections.Hashable): ++ if isinstance(lst1, Hashable) and isinstance(lst2, Hashable): + return set(lst1) - set(lst2) + return unique([ele for ele in lst1 if ele not in lst2]) + +@@ -648,7 +654,7 @@ def symmetric_difference(lst1, lst2): + + [1, 3] + ''' +- if isinstance(lst1, collections.Hashable) and isinstance(lst2, collections.Hashable): ++ if isinstance(lst1, Hashable) and isinstance(lst2, Hashable): + return set(lst1) ^ set(lst2) + return unique([ele for ele in union(lst1, lst2) if ele not in intersect(lst1, lst2)]) + +diff --git a/salt/utils/oset.py b/salt/utils/oset.py +index cd4e88be40..aa0d2a3af5 100644 +--- a/salt/utils/oset.py ++++ b/salt/utils/oset.py +@@ -21,10 +21,12 @@ Rob Speer's changes are as follows: + - added a __getstate__ and __setstate__ so it can be pickled + - added __getitem__ + ''' +-from __future__ import absolute_import, unicode_literals, print_function ++from __future__ import absolute_import, print_function, unicode_literals ++ + try: + from collections.abc import MutableSet + except ImportError: ++ # pylint: disable=no-name-in-module + from collections import MutableSet + + SLICE_ALL = slice(None) +-- +2.26.1 + + diff --git a/salt.changes b/salt.changes index d5f63b1..5278bf7 100644 --- a/salt.changes +++ b/salt.changes @@ -1,3 +1,25 @@ +------------------------------------------------------------------- +Fri May 8 14:24:19 UTC 2020 - Jochen Breuer + +- Python 3.8 compatibility changes +- msgpack support for version >= 1.0.0 (bsc#1171257) + +- Added: + * python3.8-compatibility-pr-s-235.patch + * msgpack-support-versions-1.0.0.patch + +------------------------------------------------------------------- +Thu May 7 15:36:38 UTC 2020 - Pablo Suárez Hernández + +- Prevent sporious "salt-api" stuck processes when managing SSH minions + because of logging deadlock (bsc#1159284) +- Avoid segfault from "salt-api" under certain conditions of heavy load + managing SSH minions (bsc#1169604) + +- Added: + * prevent-logging-deadlock-on-salt-api-subprocesses-bs.patch + * make-lazyloader.__init__-call-to-_refresh_file_mappi.patch + ------------------------------------------------------------------- Thu Apr 30 13:24:35 UTC 2020 - Pablo Suárez Hernández diff --git a/salt.spec b/salt.spec index 959fa50..e895867 100644 --- a/salt.spec +++ b/salt.spec @@ -300,6 +300,14 @@ Patch107: fixed-bug-lvm-has-no-parttion-type.-the-scipt-later-.patch Patch108: remove-vendored-backports-abc-from-requirements.patch # PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/commit/a5ef829408685d9e65eaa24bba40d221adffaa95 Patch109: fix-typo-in-minion_runner-for-aesfuncs-exposed-metho.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/57119 +Patch110: make-lazyloader.__init__-call-to-_refresh_file_mappi.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/57123 +Patch111: prevent-logging-deadlock-on-salt-api-subprocesses-bs.patch +# PATCH-FIX_UPSTREAM: https://github.com/saltstack/salt/pull/57122 +Patch112: msgpack-support-versions-1.0.0.patch +# PATCH-FIX_OPENSUSE: https://github.com/openSUSE/salt/pull/235 +Patch113: python3.8-compatibility-pr-s-235.patch BuildRoot: %{_tmppath}/%{name}-%{version}-build BuildRequires: logrotate @@ -916,6 +924,10 @@ cp %{S:5} ./.travis.yml %patch107 -p1 %patch108 -p1 %patch109 -p1 +%patch110 -p1 +%patch111 -p1 +%patch112 -p1 +%patch113 -p1 %build %if 0%{?build_py2}