diff --git a/.github/workflows/build-and-package.yml b/.github/workflows/build-and-package.yml index e92dd965d..5a7c5c5f5 100644 --- a/.github/workflows/build-and-package.yml +++ b/.github/workflows/build-and-package.yml @@ -11,12 +11,14 @@ on: jobs: build: runs-on: ubuntu-latest + env: + ASYNC_TEST_TIMEOUT: 120 steps: - uses: actions/checkout@v2 - - name: Set up Python 3.8 + - name: Set up Python 3.10.5 uses: actions/setup-python@v1 with: - python-version: 3.8 + python-version: 3.10.5 - name: Install Terraform uses: hashicorp/setup-terraform@v1 - name: Install dependencies @@ -60,10 +62,10 @@ jobs: # master builds don't have tags, which breaks setupmeta versioning. This retrieves the tags. - run: git fetch --prune --unshallow --tags if: github.ref == 'refs/heads/master' - - name: Set up Python 3.8 + - name: Set up Python 3.10.5 uses: actions/setup-python@v1 with: - python-version: 3.8 + python-version: 3.10.5 - name: Build UI assets run: | curl -sL https://deb.nodesource.com/setup_14.x | sudo bash diff --git a/.isort.cfg b/.isort.cfg index 06df9b4ec..3c69e3bf1 100644 --- a/.isort.cfg +++ b/.isort.cfg @@ -1,6 +1,6 @@ [settings] known_first_party=consoleme,consoleme_ecs_cdk -known_third_party = aiozipkin,asgiref,atlassian,aws_cdk,bcrypt,billiard,bleach,boto3,botocore,celery,cfnresponse,click,click_log,cloudaux,cryptography,dateutil,deepdiff,distutils,elasticsearch,email_validator,furl,git,google,googleapiclient,jsonschema,jwt,logmatic,marshmallow,mock,mockredis,moto,nacl,nested_stacks,okta_jwt,onelogin,pandas,parliament,password_strength,pkg_resources,policy_sentry,policyuniverse,pydantic,pytest,pytz,questionary,redis,redislite,requests,retrying,ruamel,sentry_sdk,setuptools,simplejson,tenacity,tornado,ujson,uvloop,validate_email,yaml +known_third_party = aiozipkin,asgiref,atlassian,aws_cdk,bcrypt,billiard,bleach,boto3,botocore,celery,cfnresponse,click,click_log,cloudaux,cryptography,dateutil,deepdiff,distutils,elasticsearch,email_validator,fakeredis,furl,git,google,googleapiclient,jsonschema,jwt,logmatic,marshmallow,mock,mockredis,moto,nacl,nested_stacks,okta_jwt,onelogin,pandas,parliament,password_strength,pkg_resources,policy_sentry,policyuniverse,pydantic,pytest,pytz,questionary,redis,requests,retrying,ruamel,sentry_sdk,setuptools,simplejson,tenacity,tornado,ujson,uvloop,validate_email,yaml multi_line_output=3 include_trailing_comma=True balanced_wrapping=True diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index ef24c9ca7..3049d8e56 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,7 +31,7 @@ repos: rev: 22.3.0 hooks: - id: black - language_version: python3.8 + language_version: python3.10 - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.7.0 diff --git a/Dockerfile b/Dockerfile index 022924e6d..ec4441940 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ # Dockerfile should instantiate AWS Project with configurable plugins -FROM python:3.8 +FROM python:3.10 MAINTAINER Netflix Security WORKDIR /apps/consoleme # NODE_OPTIONS meeded to increase memory size of Node for the `yarn build` step. The Monaco Editor diff --git a/Makefile b/Makefile index 5667e704d..d78ce8fbb 100644 --- a/Makefile +++ b/Makefile @@ -49,7 +49,7 @@ redis: .PHONY: test test: clean - ASYNC_TEST_TIMEOUT=60 $(pytest) + ASYNC_TEST_TIMEOUT=60 CONFIG_LOCATION=example_config/example_config_test.yaml $(pytest) .PHONY: bandit bandit: clean diff --git a/README.md b/README.md index 4d0bae9a2..38b91c738 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -[![Python 3.8](https://img.shields.io/badge/python-3.8-blue.svg)](https://www.python.org/downloads/release/python-386/) +[![Python 3.10](https://img.shields.io/badge/python-3.10-blue.svg)](https://www.python.org/downloads/release/python-3105/) [![Discord](https://img.shields.io/discord/730908778299523072?label=Discord&logo=discord&style=flat-square)](https://discord.gg/nQVpNGGkYu) # ConsoleMe diff --git a/consoleme/celery_tasks/celery_tasks.py b/consoleme/celery_tasks/celery_tasks.py index 56315cdb8..7b541d40a 100644 --- a/consoleme/celery_tasks/celery_tasks.py +++ b/consoleme/celery_tasks/celery_tasks.py @@ -10,7 +10,6 @@ from __future__ import absolute_import import json # We use a separate SetEncoder here so we cannot use ujson -import os import sys import time from datetime import datetime, timedelta @@ -117,25 +116,13 @@ def on_configure(self) -> None: ), backend=config.get( f"celery.backend.{config.region}", - config.get("celery.broker.global", "redis://127.0.0.1:6379/2"), + config.get("celery.backend.global"), ), ) -if config.get("redis.use_redislite"): - import tempfile - - import redislite - - redislite_db_path = os.path.join( - config.get("redis.redislite.db_path", tempfile.NamedTemporaryFile().name) - ) - redislite_client = redislite.Redis(redislite_db_path) - redislite_socket_path = f"redis+socket://{redislite_client.socket_file}" - app = Celery( - "tasks", - broker=f"{redislite_socket_path}?virtual_host=1", - backend=f"{redislite_socket_path}?virtual_host=2", - ) +broker_transport_options = config.get("celery.broker_transport_options") +if broker_transport_options: + app.conf.update({"broker_transport_options": dict(broker_transport_options)}) app.conf.result_expires = config.get("celery.result_expires", 60) app.conf.worker_prefetch_multiplier = config.get("celery.worker_prefetch_multiplier", 4) diff --git a/consoleme/config/config.py b/consoleme/config/config.py index cc5400019..6a991aab8 100644 --- a/consoleme/config/config.py +++ b/consoleme/config/config.py @@ -1,5 +1,5 @@ """Configuration handling library.""" -import collections +import collections.abc import datetime import logging import os @@ -35,7 +35,7 @@ def dict_merge(dct: dict, merge_dct: dict): if ( k in dct and isinstance(dct[k], dict) - and isinstance(merge_dct[k], collections.Mapping) + and isinstance(merge_dct[k], collections.abc.Mapping) ): dict_merge(dct[k], merge_dct[k]) else: @@ -156,24 +156,6 @@ def __set_flag_on_main_exit(self): # Main thread exited, signal to other threads main_exit_flag.set() - def purge_redislite_cache(self): - """ - Purges redislite cache in primary DB periodically. This will force a cache refresh, and it is - convenient for cases where you cannot securely run shared Redis (ie: AWS AppRunner) - """ - if not self.get("redis.use_redislite"): - return - from consoleme.lib.redis import RedisHandler - - red = RedisHandler().redis_sync() - while threading.main_thread().is_alive(): - red.flushdb() - # Wait till main exit flag is set OR a fixed timeout - if main_exit_flag.wait( - timeout=self.get("redis.purge_redislite_cache_interval", 1800) - ): - break - async def merge_extended_paths(self, extends, dir_path): for s in extends: extend_config = {} @@ -243,10 +225,6 @@ async def load_config( if allow_start_background_threads: Timer(0, self.__set_flag_on_main_exit, ()).start() - if allow_start_background_threads and self.get("redis.use_redislite"): - t = Timer(1, self.purge_redislite_cache, ()) - t.start() - if allow_start_background_threads and self.get("config.load_from_dynamo", True): t = Timer(2, self.load_config_from_dynamo_bg_thread, ()) t.start() @@ -361,8 +339,6 @@ def set_logging_levels(self): "spectator.HttpClient": "WARNING", "spectator.Registry": "WARNING", "urllib3": "ERROR", - "redislite.client": "WARNING", - "redislite.configuration": "WARNING", } for logger, level in self.get("logging_levels", default_logging_levels).items(): logging.getLogger(logger).setLevel(level) diff --git a/consoleme/default_plugins/plugins/celery_tasks/celery_tasks.py b/consoleme/default_plugins/plugins/celery_tasks/celery_tasks.py index 8bd3e56df..05e42592f 100644 --- a/consoleme/default_plugins/plugins/celery_tasks/celery_tasks.py +++ b/consoleme/default_plugins/plugins/celery_tasks/celery_tasks.py @@ -4,7 +4,6 @@ """ import json -import os from datetime import timedelta from asgiref.sync import async_to_sync @@ -26,31 +25,15 @@ ), backend=config.get( f"celery.backend.{config.region}", - config.get("celery.broker.global", "redis://127.0.0.1:6379/2"), + config.get("celery.backend.global"), ), ) -if config.get("redis.use_redislite"): - import tempfile - - import redislite - - redislite_db_path = os.path.join( - config.get("redis.redislite.db_path", tempfile.NamedTemporaryFile().name) - ) - redislite_client = redislite.Redis(redislite_db_path) - redislite_socket_path = f"redis+socket://{redislite_client.socket_file}" - app = Celery( - "tasks", - broker=f"{redislite_socket_path}?virtual_host=1", - backend=f"{redislite_socket_path}?virtual_host=2", - ) - app.conf.result_expires = config.get("celery.result_expires", 60) app.conf.worker_prefetch_multiplier = config.get("celery.worker_prefetch_multiplier", 4) app.conf.task_acks_late = config.get("celery.task_acks_late", True) -if config.get("celery.purge") and not config.get("redis.use_redislite"): +if config.get("celery.purge"): # Useful to clear celery queue in development with Timeout(seconds=5, error_message="Timeout: Are you sure Redis is running?"): app.control.purge() diff --git a/consoleme/lib/plugins.py b/consoleme/lib/plugins.py index f9bf97b6a..f491f1d84 100644 --- a/consoleme/lib/plugins.py +++ b/consoleme/lib/plugins.py @@ -27,8 +27,8 @@ def get_plugin_by_name(plugin_name: str) -> Any: if plugin_name == "default_config": initial_exception_message = ( f"Could not find the specified plugin: {plugin_name}. " - "Please install it with `pip install -e default_plugins` " - "from the ConsoleMe directory. " + "Please install it with `pip install -e consoleme/default_plugins` " + "from the ConsoleMe base directory. " ) exception_message = ( diff --git a/consoleme/lib/redis.py b/consoleme/lib/redis.py index a9ad5da61..3b8572665 100644 --- a/consoleme/lib/redis.py +++ b/consoleme/lib/redis.py @@ -1,4 +1,3 @@ -import os import sys import threading import time @@ -13,14 +12,6 @@ from consoleme.config import config from consoleme.lib.plugins import get_plugin_by_name -if config.get("redis.use_redislite"): - import tempfile - - import redislite - - if not config.get("redis.redis_lite.db_path"): - default_redislite_db_path = tempfile.NamedTemporaryFile().name - region = config.region log = config.get_logger() stats = get_plugin_by_name(config.get("plugins.metrics", "default_metrics"))() @@ -371,11 +362,6 @@ def __init__( self.enabled = False async def redis(self, db: int = 0) -> Redis: - if config.get("redis.use_redislite"): - REDIS_DB_PATH = os.path.join( - config.get("redis.redislite.db_path", default_redislite_db_path) - ) - return redislite.StrictRedis(REDIS_DB_PATH, decode_responses=True) self.red = await sync_to_async(ConsoleMeRedis)( host=self.host, port=self.port, @@ -386,11 +372,6 @@ async def redis(self, db: int = 0) -> Redis: return self.red def redis_sync(self, db: int = 0) -> Redis: - if config.get("redis.use_redislite"): - REDIS_DB_PATH = os.path.join( - config.get("redis.redislite.db_path", default_redislite_db_path) - ) - return redislite.StrictRedis(REDIS_DB_PATH, decode_responses=True) self.red = ConsoleMeRedis( host=self.host, port=self.port, diff --git a/example_config/example_config_test.yaml b/example_config/example_config_test.yaml index feb3e4899..2f2ea32c6 100644 --- a/example_config/example_config_test.yaml +++ b/example_config/example_config_test.yaml @@ -41,6 +41,12 @@ celery: enabled: true cache_cloudtrail_denies: enabled: true + broker: + global: filesystem://.pytest_cache/0 + broker_transport_options: + data_folder_in: .pytest_cache/celery_data_folder_in + data_folder_out: .pytest_cache/celery_data_folder_out + data_folder_processed: .pytest_cache/celery_data_folder_processed event_bridge: detect_role_changes_and_update_cache: queue_arn: arn:aws:sqs:{region}:123456789012:consoleme-cloudtrail-role-events-test diff --git a/requirements-docs.txt b/requirements-docs.txt index e0191d87e..7c7b2be69 100644 --- a/requirements-docs.txt +++ b/requirements-docs.txt @@ -1,55 +1,56 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.10 # To update, run: # # pip-compile --no-emit-index-url --output-file=requirements-docs.txt requirements-docs.in # -click==8.0.3 +click==8.1.3 # via # -c requirements-test.txt # -c requirements.txt # mkdocs -ghp-import==2.0.1 +ghp-import==2.1.0 # via mkdocs -importlib-metadata==4.8.1 +importlib-metadata==4.12.0 # via mkdocs -jinja2==3.0.1 +jinja2==3.1.2 # via # -c requirements-test.txt # -c requirements.txt # mkdocs -markdown==3.3.4 + # mkdocs-material +markdown==3.3.7 # via # mkdocs # mkdocs-material # pymdown-extensions -markupsafe==2.0.1 +markupsafe==2.1.1 # via # -c requirements-test.txt # -c requirements.txt # jinja2 mergedeep==1.3.4 # via mkdocs -mkdocs-material-extensions==1.0.3 - # via mkdocs-material -mkdocs-material==7.2.6 - # via -r requirements-docs.in -mkdocs==1.2.3 +mkdocs==1.3.0 # via # -r requirements-docs.in # mkdocs-material -packaging==21.0 +mkdocs-material==8.3.9 + # via -r requirements-docs.in +mkdocs-material-extensions==1.0.3 + # via mkdocs-material +packaging==21.3 # via # -c requirements-test.txt # -c requirements.txt # mkdocs -pygments==2.10.0 +pygments==2.12.0 # via # -c requirements-test.txt # mkdocs-material -pymdown-extensions==8.2 +pymdown-extensions==9.5 # via mkdocs-material -pyparsing==2.4.7 +pyparsing==3.0.9 # via # -c requirements-test.txt # -c requirements.txt @@ -59,21 +60,21 @@ python-dateutil==2.8.2 # -c requirements-test.txt # -c requirements.txt # ghp-import -pyyaml-env-tag==0.1 - # via mkdocs -pyyaml==5.4.1 +pyyaml==6.0 # via # -c requirements-test.txt # -c requirements.txt # -r requirements-docs.in # mkdocs # pyyaml-env-tag +pyyaml-env-tag==0.1 + # via mkdocs six==1.16.0 # via # -c requirements-test.txt # -c requirements.txt # python-dateutil -watchdog==2.1.5 +watchdog==2.1.9 # via mkdocs -zipp==3.5.0 +zipp==3.8.1 # via importlib-metadata diff --git a/requirements-test.in b/requirements-test.in index 6fb149d4e..b310316dd 100644 --- a/requirements-test.in +++ b/requirements-test.in @@ -4,10 +4,11 @@ bandit black coverage docker # Required by moto +fakeredis flake8 flake8-docstrings flake8-import-order -mock<4 # Mock 4 breaks a bunch of unit tests +mock mockredispy moto mypy @@ -20,7 +21,6 @@ pytest-mock pytest-timeout pytest-tornado pytest-xdist -redislite readme_renderer tornado tox diff --git a/requirements-test.txt b/requirements-test.txt index 922897944..547cb6441 100644 --- a/requirements-test.txt +++ b/requirements-test.txt @@ -1,204 +1,667 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.10 # To update, run: # -# pip-compile --no-emit-index-url --output-file=requirements-test.txt requirements-test.in +# pip-compile --no-emit-index-url --output-file=requirements-test.txt requirements-test.in requirements.txt # +aiohttp==3.8.1 + # via + # -c requirements.txt + # -r requirements.txt + # aiozipkin +aiosignal==1.2.0 + # via + # -c requirements.txt + # -r requirements.txt + # aiohttp +aiozipkin==1.1.1 + # via + # -c requirements.txt + # -r requirements.txt +amqp==5.1.1 + # via + # -c requirements.txt + # -r requirements.txt + # kombu +argcomplete==2.0.0 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator +asgiref==3.5.2 + # via + # -c requirements.txt + # -r requirements.txt +astroid==2.11.7 + # via + # -c requirements.txt + # -r requirements.txt + # pylint +async-timeout==4.0.2 + # via + # -c requirements.txt + # -r requirements.txt + # aiohttp + # redis asynctest==0.13.0 # via -r requirements-test.in -attrs==21.2.0 +atlassian-python-api==3.25.0 + # via + # -c requirements.txt + # -r requirements.txt +attrs==21.4.0 # via # -c requirements.txt + # -r requirements.txt + # aiohttp + # jsonschema # pytest -backports.entry-points-selectable==1.1.0 - # via virtualenv -bandit==1.7.0 +bandit==1.7.4 # via -r requirements-test.in -black==21.8b0 +bcrypt==3.2.2 + # via + # -c requirements.txt + # -r requirements.txt +beautifulsoup4==4.11.1 + # via + # -c requirements.txt + # -r requirements.txt + # policy-sentry +billiard==3.6.4.0 + # via + # -c requirements.txt + # -r requirements.txt + # celery +black==22.6.0 # via # -c requirements.txt # -r requirements-test.in -bleach==4.1.0 + # -r requirements.txt + # datamodel-code-generator +bleach==5.0.1 # via # -c requirements.txt + # -r requirements.txt # readme-renderer -boto3==1.18.38 +boto==2.49.0 + # via + # -c requirements.txt + # -r requirements.txt + # cloudaux +boto3==1.24.30 # via # -c requirements.txt + # -r requirements.txt + # cloudaux # moto -botocore==1.21.38 + # parliament +botocore==1.27.30 # via # -c requirements.txt + # -r requirements.txt # boto3 + # cloudaux # moto # s3transfer -certifi==2021.5.30 +cachetools==5.2.0 # via # -c requirements.txt + # -r requirements.txt + # google-auth +cchardet==2.1.7 + # via + # -c requirements.txt + # -r requirements.txt +celery==5.2.7 + # via + # -c requirements.txt + # -r requirements.txt +certifi==2022.6.15 + # via + # -c requirements.txt + # -r requirements.txt + # elasticsearch # requests -cffi==1.14.6 + # sentry-sdk +cffi==1.15.1 # via # -c requirements.txt + # -r requirements.txt + # bcrypt # cryptography + # pynacl cfgv==3.3.1 # via pre-commit -charset-normalizer==2.0.4 +chardet==4.0.0 + # via + # -c requirements.txt + # -r requirements.txt + # prance +charset-normalizer==2.1.0 # via # -c requirements.txt + # -r requirements.txt + # aiohttp # requests -click==8.0.3 +click==8.1.3 # via # -c requirements.txt + # -r requirements.txt # black -coverage==5.5 + # celery + # click-didyoumean + # click-plugins + # click-repl + # policy-sentry + # presto-python-client +click-didyoumean==0.3.0 + # via + # -c requirements.txt + # -r requirements.txt + # celery +click-plugins==1.1.1 + # via + # -c requirements.txt + # -r requirements.txt + # celery +click-repl==0.2.0 + # via + # -c requirements.txt + # -r requirements.txt + # celery +cloudaux==1.9.6 + # via + # -c requirements.txt + # -r requirements.txt +contextlib2==21.6.0 + # via + # -c requirements.txt + # -r requirements.txt + # schema +coverage[toml]==6.4.2 # via # -r requirements-test.in # pytest-cov -cryptography==36.0.1 +cryptography==37.0.4 # via # -c requirements.txt + # -r requirements.txt # moto -distlib==0.3.2 +datamodel-code-generator==0.13.0 + # via + # -c requirements.txt + # -r requirements.txt +decorator==5.1.1 + # via + # -c requirements.txt + # -r requirements.txt + # retry +deepdiff==5.8.1 + # via + # -c requirements.txt + # -r requirements.txt +defusedxml==0.7.1 + # via + # -c requirements.txt + # -r requirements.txt + # cloudaux +deprecated==1.2.13 + # via + # -c requirements.txt + # -r requirements.txt + # atlassian-python-api + # redis +dill==0.3.5.1 + # via + # -c requirements.txt + # -r requirements.txt + # pylint +distlib==0.3.5 # via virtualenv -docker==5.0.2 +dnspython==2.2.1 + # via + # -c requirements.txt + # -r requirements.txt + # email-validator +docker==5.0.3 # via -r requirements-test.in -docutils==0.17.1 +docutils==0.19 # via readme-renderer +ecdsa==0.18.0 + # via + # -c requirements.txt + # -r requirements.txt + # python-jose +elasticsearch==7.17.4 + # via + # -c requirements.txt + # -r requirements.txt + # elasticsearch-dsl +elasticsearch-dsl==7.4.0 + # via + # -c requirements.txt + # -r requirements.txt +email-validator==1.2.1 + # via + # -c requirements.txt + # -r requirements.txt + # pydantic execnet==1.9.0 # via pytest-xdist -filelock==3.0.12 +fakeredis==1.8.1 + # via -r requirements-test.in +filelock==3.7.1 # via # tox # virtualenv +flagpole==1.1.1 + # via + # -c requirements.txt + # -r requirements.txt + # cloudaux +flake8==4.0.1 + # via + # -r requirements-test.in + # flake8-docstrings flake8-docstrings==1.6.0 # via -r requirements-test.in flake8-import-order==0.18.1 # via -r requirements-test.in -flake8==3.9.2 +frozenlist==1.3.0 # via - # -r requirements-test.in - # flake8-docstrings -gitdb==4.0.7 + # -c requirements.txt + # -r requirements.txt + # aiohttp + # aiosignal +furl==2.1.3 + # via + # -c requirements.txt + # -r requirements.txt +genson==1.2.2 # via # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator +gitdb==4.0.9 + # via + # -c requirements.txt + # -r requirements.txt # gitpython -gitpython==3.1.18 +gitpython==3.1.27 # via # -c requirements.txt + # -r requirements.txt # bandit -identify==2.2.14 +google-api-core==2.8.2 + # via + # -c requirements.txt + # -r requirements.txt + # google-api-python-client + # google-cloud-core + # google-cloud-storage +google-api-python-client==2.53.0 + # via + # -c requirements.txt + # -r requirements.txt +google-auth==2.9.1 + # via + # -c requirements.txt + # -r requirements.txt + # google-api-core + # google-api-python-client + # google-auth-httplib2 + # google-cloud-core + # google-cloud-storage +google-auth-httplib2==0.1.0 + # via + # -c requirements.txt + # -r requirements.txt + # google-api-python-client +google-cloud-core==2.3.1 + # via + # -c requirements.txt + # -r requirements.txt + # google-cloud-storage +google-cloud-storage==2.4.0 + # via + # -c requirements.txt + # -r requirements.txt +google-crc32c==1.3.0 + # via + # -c requirements.txt + # -r requirements.txt + # google-resumable-media +google-resumable-media==2.3.3 + # via + # -c requirements.txt + # -r requirements.txt + # google-cloud-storage +googleapis-common-protos==1.56.4 + # via + # -c requirements.txt + # -r requirements.txt + # google-api-core +gunicorn==20.1.0 + # via + # -c requirements.txt + # -r requirements.txt +hiredis==2.0.0 + # via + # -c requirements.txt + # -r requirements.txt +httplib2==0.20.4 + # via + # -c requirements.txt + # -r requirements.txt + # google-api-python-client + # google-auth-httplib2 +identify==2.5.1 # via pre-commit -idna==2.10 +idna==3.3 # via # -c requirements.txt + # -r requirements.txt + # email-validator # requests + # yarl +inflect==5.6.1 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator +inflection==0.5.1 + # via + # -c requirements.txt + # -r requirements.txt + # cloudaux iniconfig==1.1.1 # via pytest -jinja2==3.0.1 +isodate==0.6.1 # via # -c requirements.txt + # -r requirements.txt + # openapi-schema-validator + # python3-saml +isort==5.10.1 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator + # pylint +jinja2==3.1.2 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator # moto -jmespath==0.10.0 +jmespath==1.0.1 # via # -c requirements.txt + # -r requirements.txt # boto3 # botocore -markupsafe==2.0.1 + # parliament +joblib==1.1.0 + # via + # -c requirements.txt + # -r requirements.txt + # cloudaux +json-cfg==0.4.2 + # via + # -c requirements.txt + # -r requirements.txt + # parliament +jsonschema==3.2.0 + # via + # -c requirements.txt + # -r requirements.txt + # openapi-schema-validator + # openapi-spec-validator +kombu==5.2.4 + # via + # -c requirements.txt + # -r requirements.txt + # celery +kwonly-args==1.0.10 + # via + # -c requirements.txt + # -r requirements.txt + # json-cfg +lazy-object-proxy==1.7.1 + # via + # -c requirements.txt + # -r requirements.txt + # astroid +logmatic-python==0.1.7 + # via + # -c requirements.txt + # -r requirements.txt +lxml==4.6.5 # via # -c requirements.txt + # -r requirements.txt + # python3-saml + # xmlsec +markupsafe==2.1.1 + # via + # -c requirements.txt + # -r requirements.txt # jinja2 # moto +marshmallow==3.17.0 + # via + # -c requirements.txt + # -r requirements.txt mccabe==0.6.1 # via # -c requirements.txt + # -r requirements.txt # flake8 -mock==3.0.5 + # pylint +mock==4.0.3 # via -r requirements-test.in mockredispy==2.9.3 # via -r requirements-test.in -more-itertools==8.9.0 - # via moto -moto==2.2.6 +moto==3.1.16 + # via -r requirements-test.in +multidict==6.0.2 + # via + # -c requirements.txt + # -r requirements.txt + # aiohttp + # yarl +mypy==0.961 # via -r requirements-test.in mypy-extensions==0.4.3 # via # -c requirements.txt + # -r requirements.txt # black # mypy -mypy==0.910 - # via -r requirements-test.in -nodeenv==1.6.0 +nodeenv==1.7.0 # via pre-commit -packaging==21.0 +numpy==1.23.1 # via # -c requirements.txt - # bleach + # -r requirements.txt + # pandas +oauthlib==3.2.0 + # via + # -c requirements.txt + # -r requirements.txt + # atlassian-python-api + # requests-oauthlib +okta-jwt==1.3.5 + # via + # -c requirements.txt + # -r requirements.txt +openapi-schema-validator==0.1.6 + # via + # -c requirements.txt + # -r requirements.txt + # openapi-spec-validator +openapi-spec-validator==0.3.3 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator +ordered-set==4.1.0 + # via + # -c requirements.txt + # -r requirements.txt + # deepdiff +orderedmultidict==1.0.1 + # via + # -c requirements.txt + # -r requirements.txt + # furl +packaging==21.3 + # via + # -c requirements.txt + # -r requirements.txt + # marshmallow # pytest + # redis # tox +pandas==1.4.3 + # via + # -c requirements.txt + # -r requirements.txt +parliament==1.5.2 + # via + # -c requirements.txt + # -r requirements.txt +password-strength==0.0.3.post2 + # via + # -c requirements.txt + # -r requirements.txt pathspec==0.9.0 # via # -c requirements.txt + # -r requirements.txt # black -pbr==5.6.0 +pbr==5.9.0 # via stevedore -platformdirs==2.3.0 +pkgconfig==1.5.5 # via # -c requirements.txt + # -r requirements.txt +platformdirs==2.5.2 + # via + # -c requirements.txt + # -r requirements.txt # black + # pylint # virtualenv pluggy==1.0.0 # via # pytest # tox -pre-commit==2.15.0 +policy-sentry==0.12.3 + # via + # -c requirements.txt + # -r requirements.txt +policyuniverse==1.5.0.20220613 + # via + # -c requirements.txt + # -r requirements.txt +prance==0.21.8.0 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator +pre-commit==2.20.0 # via -r requirements-test.in -psutil==5.8.0 +presto-python-client==0.8.2 # via # -c requirements.txt - # redislite -py==1.10.0 + # -r requirements.txt +prompt-toolkit==3.0.30 # via # -c requirements.txt + # -r requirements.txt + # click-repl + # questionary +protobuf==4.21.2 + # via + # -c requirements.txt + # -r requirements.txt + # google-api-core + # googleapis-common-protos +py==1.11.0 + # via + # -c requirements.txt + # -r requirements.txt # pytest # pytest-forked + # retry # tox -pycodestyle==2.7.0 +pyasn1==0.4.8 + # via + # -c requirements.txt + # -r requirements.txt + # pyasn1-modules + # python-jose + # rsa +pyasn1-modules==0.2.8 + # via + # -c requirements.txt + # -r requirements.txt + # google-auth +pycodestyle==2.8.0 # via # flake8 # flake8-import-order -pycparser==2.20 +pycparser==2.21 # via # -c requirements.txt + # -r requirements.txt # cffi +pycurl==7.45.1 + # via + # -c requirements.txt + # -r requirements.txt +pydantic[email]==1.9.1 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator pydocstyle==6.1.1 # via flake8-docstrings -pyflakes==2.3.1 +pyflakes==2.4.0 # via flake8 -pygments==2.10.0 +pygments==2.12.0 # via readme-renderer -pyparsing==2.4.7 +pyjwt==2.4.0 + # via + # -c requirements.txt + # -r requirements.txt +pylint==2.14.4 + # via + # -c requirements.txt + # -r requirements.txt +pynacl==1.5.0 + # via + # -c requirements.txt + # -r requirements.txt +pyparsing==3.0.9 # via # -c requirements.txt + # -r requirements.txt + # httplib2 # packaging -pytest-asyncio==0.15.1 - # via -r requirements-test.in -pytest-cov==2.12.1 - # via -r requirements-test.in -pytest-forked==1.3.0 - # via pytest-xdist -pytest-html==3.1.1 - # via -r requirements-test.in -pytest-metadata==1.11.0 - # via pytest-html -pytest-mock==3.6.1 - # via -r requirements-test.in -pytest-timeout==1.4.2 - # via -r requirements-test.in -pytest-tornado==0.8.1 - # via -r requirements-test.in -pytest-xdist==2.3.0 - # via -r requirements-test.in -pytest==6.2.5 +pyrsistent==0.16.1 + # via + # -c requirements.txt + # -r requirements.txt + # jsonschema + # openapi-spec-validator +pysnooper==1.1.1 + # via + # -c requirements.txt + # -r requirements.txt + # datamodel-code-generator +pytest==7.1.2 # via # -r requirements-test.in # pytest-asyncio @@ -210,109 +673,299 @@ pytest==6.2.5 # pytest-timeout # pytest-tornado # pytest-xdist +pytest-asyncio==0.18.3 + # via -r requirements-test.in +pytest-cov==3.0.0 + # via -r requirements-test.in +pytest-forked==1.4.0 + # via pytest-xdist +pytest-html==3.1.1 + # via -r requirements-test.in +pytest-metadata==2.0.1 + # via pytest-html +pytest-mock==3.8.2 + # via -r requirements-test.in +pytest-timeout==2.1.0 + # via -r requirements-test.in +pytest-tornado==0.8.1 + # via -r requirements-test.in +pytest-xdist==2.5.0 + # via -r requirements-test.in python-dateutil==2.8.2 # via # -c requirements.txt + # -r requirements.txt # botocore + # elasticsearch-dsl # moto -pytz==2021.3 + # pandas +python-jose==3.3.0 + # via + # -c requirements.txt + # -r requirements.txt + # okta-jwt +python-json-logger==2.0.4 + # via + # -c requirements.txt + # -r requirements.txt + # logmatic-python +python3-saml==1.14.0 # via # -c requirements.txt + # -r requirements.txt +pytz==2022.1 + # via + # -c requirements.txt + # -r requirements.txt + # celery # moto -pyyaml==5.4.1 + # pandas +pyyaml==6.0 # via # -c requirements.txt + # -r requirements.txt # bandit + # openapi-spec-validator + # parliament + # policy-sentry # pre-commit -readme-renderer==29.0 - # via -r requirements-test.in -redis==3.5.3 +questionary==1.10.0 # via # -c requirements.txt - # redislite -redislite==6.0.674960 - # via - # -c requirements.txt - # -r requirements-test.in -regex==2021.8.28 + # -r requirements.txt +readme-renderer==35.0 + # via -r requirements-test.in +redis==4.3.4 # via # -c requirements.txt - # black -requests==2.26.0 + # -r requirements.txt + # fakeredis +requests==2.28.1 # via # -c requirements.txt + # -r requirements.txt + # atlassian-python-api # docker + # google-api-core + # google-cloud-storage # moto + # okta-jwt + # policy-sentry + # prance + # presto-python-client + # requests-oauthlib # responses -responses==0.13.4 +requests-oauthlib==1.3.1 + # via + # -c requirements.txt + # -r requirements.txt + # atlassian-python-api +responses==0.21.0 # via moto -s3transfer==0.5.0 +retry==0.9.2 + # via + # -c requirements.txt + # -r requirements.txt +retrying==1.3.3 # via # -c requirements.txt + # -r requirements.txt +rsa==4.8 + # via + # -c requirements.txt + # -r requirements.txt + # google-auth + # python-jose +ruamel-yaml==0.17.21 + # via + # -c requirements.txt + # -r requirements.txt + # prance +ruamel-yaml-clib==0.2.6 + # via + # -c requirements.txt + # -r requirements.txt + # ruamel-yaml +s3transfer==0.6.0 + # via + # -c requirements.txt + # -r requirements.txt # boto3 +schema==0.7.5 + # via + # -c requirements.txt + # -r requirements.txt + # policy-sentry +semver==2.13.0 + # via + # -c requirements.txt + # -r requirements.txt + # prance +sentry-sdk==1.7.1 + # via + # -c requirements.txt + # -r requirements.txt +simplejson==3.17.6 + # via + # -c requirements.txt + # -r requirements.txt six==1.16.0 # via # -c requirements.txt - # bandit + # -r requirements.txt + # atlassian-python-api # bleach - # mock + # click-repl + # cloudaux + # ecdsa + # elasticsearch-dsl + # fakeredis + # furl + # google-auth + # google-auth-httplib2 + # isodate + # jsonschema + # okta-jwt + # openapi-schema-validator + # openapi-spec-validator + # orderedmultidict + # password-strength + # prance + # presto-python-client + # pyrsistent # python-dateutil - # readme-renderer - # responses + # retrying # tox # virtualenv -smmap==4.0.0 +smmap==5.0.0 # via # -c requirements.txt + # -r requirements.txt # gitdb -snowballstemmer==2.1.0 +snowballstemmer==2.2.0 # via pydocstyle -stevedore==3.4.0 +sortedcontainers==2.4.0 + # via fakeredis +soupsieve==2.3.2.post1 + # via + # -c requirements.txt + # -r requirements.txt + # beautifulsoup4 +stevedore==4.0.0 # via bandit +tenacity==8.0.1 + # via + # -c requirements.txt + # -r requirements.txt toml==0.10.2 # via # -c requirements.txt - # mypy + # -r requirements.txt + # datamodel-code-generator # pre-commit - # pytest - # pytest-cov # tox -tomli==1.2.1 +tomli==2.0.1 # via # -c requirements.txt + # -r requirements.txt # black -tornado==6.1 + # coverage + # mypy + # pylint + # pytest +tomlkit==0.11.1 + # via + # -c requirements.txt + # -r requirements.txt + # pylint +tornado==6.2 # via # -c requirements.txt # -r requirements-test.in + # -r requirements.txt # pytest-tornado -tox==3.24.3 +tox==3.25.1 # via -r requirements-test.in -typing-extensions==3.10.0.2 +typed-ast==1.5.4 # via # -c requirements.txt - # black + # -r requirements.txt + # datamodel-code-generator +typing-extensions==4.3.0 + # via + # -c requirements.txt + # -r requirements.txt # mypy -urllib3==1.26.6 + # pydantic +ujson==5.4.0 + # via + # -c requirements.txt + # -r requirements.txt +uritemplate==4.1.1 + # via + # -c requirements.txt + # -r requirements.txt + # google-api-python-client +urllib3==1.26.10 # via # -c requirements.txt + # -r requirements.txt # botocore + # elasticsearch # requests # responses -virtualenv==20.7.2 + # sentry-sdk +uvloop==0.16.0 + # via + # -c requirements.txt + # -r requirements.txt +validate-email==1.3 + # via + # -c requirements.txt + # -r requirements.txt +vine==5.0.0 + # via + # -c requirements.txt + # -r requirements.txt + # amqp + # celery + # kombu +virtualenv==20.15.1 # via # pre-commit # tox +wcwidth==0.2.5 + # via + # -c requirements.txt + # -r requirements.txt + # prompt-toolkit webencodings==0.5.1 # via # -c requirements.txt + # -r requirements.txt # bleach -websocket-client==1.2.1 +websocket-client==1.3.3 # via docker -werkzeug==2.0.1 +werkzeug==2.1.2 # via moto -xmltodict==0.12.0 +wrapt==1.14.1 + # via + # -c requirements.txt + # -r requirements.txt + # astroid + # deprecated +xmlsec==1.3.12 + # via + # -c requirements.txt + # -r requirements.txt + # python3-saml +xmltodict==0.13.0 # via moto +yarl==1.7.2 + # via + # -c requirements.txt + # -r requirements.txt + # aiohttp # The following packages are considered to be unsafe in a requirements file: # setuptools diff --git a/requirements.in b/requirements.in index e1472f772..1e2c8b724 100644 --- a/requirements.in +++ b/requirements.in @@ -5,11 +5,11 @@ bcrypt # Used for password hash/verification bleach boto3 cchardet -celery[redis] +celery cloudaux cryptography datamodel-code-generator -decorator<5 # Internal requirement has decorator pinned to <5. +decorator deepdiff defusedxml elasticsearch @@ -21,12 +21,13 @@ google-auth-httplib2 google-cloud-storage gunicorn hiredis -idna<3 # Required because moto has it pinned +idna isodate jmespath jsonschema kombu marshmallow +mccabe==0.6.1 # pylint==2.14.4 and flake8==4.0.1 require differing versions numpy logmatic-python lxml @@ -44,12 +45,11 @@ pyjwt pylint PyNaCl python-dateutil -python-json-logger==0.1.11 # Needed until this is merged and new version created: https://github.com/madzak/python-json-logger/pull/113 +python-json-logger python3-saml pytz questionary redis -redislite requests retry retrying diff --git a/requirements.txt b/requirements.txt index 72ac97fe9..e0a4882a8 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile +# This file is autogenerated by pip-compile with python 3.10 # To update, run: # # pip-compile --no-emit-index-url --output-file=requirements.txt requirements.in @@ -8,76 +8,71 @@ aiohttp==3.8.1 # via aiozipkin aiosignal==1.2.0 # via aiohttp -aiozipkin==1.1.0 +aiozipkin==1.1.1 # via -r requirements.in -amqp==5.0.9 +amqp==5.1.1 # via kombu -argcomplete==1.12.3 +argcomplete==2.0.0 # via datamodel-code-generator -asgiref==3.4.1 +asgiref==3.5.2 # via -r requirements.in -astroid==2.7.3 +astroid==2.11.7 # via pylint async-timeout==4.0.2 - # via aiohttp -atlassian-python-api==3.13.2 + # via + # aiohttp + # redis +atlassian-python-api==3.25.0 # via -r requirements.in -attrs==21.2.0 +attrs==21.4.0 # via # aiohttp # jsonschema -bcrypt==3.2.0 +bcrypt==3.2.2 # via -r requirements.in -beautifulsoup4==4.10.0 +beautifulsoup4==4.11.1 # via policy-sentry billiard==3.6.4.0 # via celery -black==21.8b0 +black==22.6.0 # via datamodel-code-generator -bleach==4.1.0 +bleach==5.0.1 # via -r requirements.in -boto3==1.18.38 +boto==2.49.0 + # via cloudaux +boto3==1.24.30 # via # -r requirements.in # cloudaux # parliament -boto==2.49.0 - # via cloudaux -botocore==1.21.38 +botocore==1.27.30 # via # boto3 # cloudaux # s3transfer -cachetools==4.2.2 +cachetools==5.2.0 # via google-auth cchardet==2.1.7 # via -r requirements.in -celery[redis]==5.2.3 +celery==5.2.7 # via -r requirements.in -certifi==2021.5.30 +certifi==2022.6.15 # via # elasticsearch # requests # sentry-sdk -cffi==1.14.6 +cffi==1.15.1 # via # bcrypt # cryptography - # google-crc32c # pynacl chardet==4.0.0 # via prance -charset-normalizer==2.0.4 +charset-normalizer==2.1.0 # via # aiohttp # requests -click-didyoumean==0.0.3 - # via celery -click-plugins==1.1.1 - # via celery -click-repl==0.2.0 - # via celery -click==8.0.3 +click==8.1.3 # via # black # celery @@ -86,37 +81,47 @@ click==8.0.3 # click-repl # policy-sentry # presto-python-client +click-didyoumean==0.3.0 + # via celery +click-plugins==1.1.1 + # via celery +click-repl==0.2.0 + # via celery cloudaux==1.9.6 # via -r requirements.in contextlib2==21.6.0 # via schema -cryptography==36.0.1 +cryptography==37.0.4 # via -r requirements.in -datamodel-code-generator==0.11.12 +datamodel-code-generator==0.13.0 # via -r requirements.in -decorator==4.4.2 +decorator==5.1.1 # via # -r requirements.in # retry -deepdiff==5.5.0 +deepdiff==5.8.1 # via -r requirements.in defusedxml==0.7.1 # via # -r requirements.in # cloudaux deprecated==1.2.13 - # via atlassian-python-api -dnspython==2.1.0 + # via + # atlassian-python-api + # redis +dill==0.3.5.1 + # via pylint +dnspython==2.2.1 # via email-validator -ecdsa==0.17.0 +ecdsa==0.18.0 # via python-jose -elasticsearch-dsl==7.4.0 - # via -r requirements.in -elasticsearch==7.14.1 +elasticsearch==7.17.4 # via # -r requirements.in # elasticsearch-dsl -email-validator==1.1.3 +elasticsearch-dsl==7.4.0 + # via -r requirements.in +email-validator==1.2.1 # via pydantic flagpole==1.1.1 # via cloudaux @@ -124,78 +129,78 @@ frozenlist==1.3.0 # via # aiohttp # aiosignal -furl==2.1.2 +furl==2.1.3 # via -r requirements.in genson==1.2.2 # via datamodel-code-generator -gitdb==4.0.7 +gitdb==4.0.9 # via gitpython -gitpython==3.1.18 +gitpython==3.1.27 # via -r requirements.in -google-api-core==2.0.1 +google-api-core==2.8.2 # via # google-api-python-client # google-cloud-core # google-cloud-storage -google-api-python-client==2.20.0 +google-api-python-client==2.53.0 # via -r requirements.in -google-auth-httplib2==0.1.0 - # via - # -r requirements.in - # google-api-python-client -google-auth==2.0.2 +google-auth==2.9.1 # via # google-api-core # google-api-python-client # google-auth-httplib2 # google-cloud-core # google-cloud-storage -google-cloud-core==2.0.0 +google-auth-httplib2==0.1.0 + # via + # -r requirements.in + # google-api-python-client +google-cloud-core==2.3.1 # via google-cloud-storage -google-cloud-storage==1.42.1 +google-cloud-storage==2.4.0 # via -r requirements.in -google-crc32c==1.1.2 +google-crc32c==1.3.0 # via google-resumable-media -google-resumable-media==2.0.2 +google-resumable-media==2.3.3 # via google-cloud-storage -googleapis-common-protos==1.53.0 +googleapis-common-protos==1.56.4 # via google-api-core gunicorn==20.1.0 # via -r requirements.in hiredis==2.0.0 # via -r requirements.in -httplib2==0.19.1 +httplib2==0.20.4 # via # google-api-python-client # google-auth-httplib2 -idna==2.10 +idna==3.3 # via # -r requirements.in # email-validator # requests # yarl -inflect==5.3.0 +inflect==5.6.1 # via datamodel-code-generator inflection==0.5.1 # via cloudaux -isodate==0.6.0 +isodate==0.6.1 # via # -r requirements.in # openapi-schema-validator # python3-saml -isort==5.9.3 +isort==5.10.1 # via # datamodel-code-generator # pylint -jinja2==3.0.1 +jinja2==3.1.2 # via datamodel-code-generator -jmespath==0.10.0 +jmespath==1.0.1 # via # -r requirements.in # boto3 # botocore # parliament -joblib==1.0.1 +joblib==1.1.0 # via cloudaux json-cfg==0.4.2 # via parliament @@ -204,56 +209,60 @@ jsonschema==3.2.0 # -r requirements.in # openapi-schema-validator # openapi-spec-validator -kombu==5.2.3 +kombu==5.2.4 # via # -r requirements.in # celery kwonly-args==1.0.10 # via json-cfg -lazy-object-proxy==1.6.0 +lazy-object-proxy==1.7.1 # via astroid logmatic-python==0.1.7 # via -r requirements.in -lxml==4.7.1 +lxml==4.6.5 # via # -r requirements.in # python3-saml # xmlsec -markupsafe==2.0.1 +markupsafe==2.1.1 # via jinja2 -marshmallow==3.13.0 +marshmallow==3.17.0 # via -r requirements.in mccabe==0.6.1 - # via pylint -multidict==5.1.0 + # via + # -r requirements.in + # pylint +multidict==6.0.2 # via # aiohttp # yarl mypy-extensions==0.4.3 # via black -numpy==1.22.2 +numpy==1.23.1 # via # -r requirements.in # pandas -oauthlib==3.1.1 +oauthlib==3.2.0 # via # atlassian-python-api # requests-oauthlib okta-jwt==1.3.5 # via -r requirements.in -openapi-schema-validator==0.1.5 +openapi-schema-validator==0.1.6 # via openapi-spec-validator -openapi-spec-validator==0.3.1 +openapi-spec-validator==0.3.3 # via datamodel-code-generator -ordered-set==4.0.2 +ordered-set==4.1.0 # via deepdiff orderedmultidict==1.0.1 # via furl -packaging==21.0 - # via bleach -pandas==1.3.2 +packaging==21.3 + # via + # marshmallow + # redis +pandas==1.4.3 # via -r requirements.in -parliament==1.4.0 +parliament==1.5.2 # via -r requirements.in password-strength==0.0.3.post2 # via -r requirements.in @@ -261,58 +270,58 @@ pathspec==0.9.0 # via black pkgconfig==1.5.5 # via -r requirements.in -platformdirs==2.3.0 +platformdirs==2.5.2 # via # black # pylint -policy-sentry==0.11.16 +policy-sentry==0.12.3 # via -r requirements.in -policyuniverse==1.4.0.20210819 +policyuniverse==1.5.0.20220613 # via -r requirements.in prance==0.21.8.0 # via datamodel-code-generator presto-python-client==0.8.2 # via -r requirements.in -prompt-toolkit==3.0.20 +prompt-toolkit==3.0.30 # via # click-repl # questionary -protobuf==3.17.3 +protobuf==4.21.2 # via # google-api-core # googleapis-common-protos -psutil==5.8.0 - # via redislite -py==1.10.0 +py==1.11.0 # via retry -pyasn1-modules==0.2.8 - # via google-auth pyasn1==0.4.8 # via # pyasn1-modules # python-jose # rsa -pycparser==2.20 +pyasn1-modules==0.2.8 + # via google-auth +pycparser==2.21 # via cffi -pycurl==7.44.1 +pycurl==7.45.1 # via -r requirements.in -pydantic[email]==1.8.2 +pydantic[email]==1.9.1 # via # -r requirements.in # datamodel-code-generator -pyjwt==2.1.0 +pyjwt==2.4.0 # via -r requirements.in -pylint==2.10.2 +pylint==2.14.4 # via -r requirements.in pynacl==1.5.0 # via -r requirements.in -pyparsing==2.4.7 +pyparsing==3.0.9 # via # httplib2 # packaging -pyrsistent==0.18.0 - # via jsonschema -pysnooper==0.5.0 +pyrsistent==0.16.1 + # via + # jsonschema + # openapi-spec-validator +pysnooper==1.1.1 # via datamodel-code-generator python-dateutil==2.8.2 # via @@ -322,38 +331,27 @@ python-dateutil==2.8.2 # pandas python-jose==3.3.0 # via okta-jwt -python-json-logger==0.1.11 +python-json-logger==2.0.4 # via # -r requirements.in # logmatic-python -python3-saml==1.12.0 +python3-saml==1.14.0 # via -r requirements.in -pytz==2021.3 +pytz==2022.1 # via # -r requirements.in # celery # pandas -pyyaml==5.4.1 +pyyaml==6.0 # via # openapi-spec-validator # parliament # policy-sentry questionary==1.10.0 # via -r requirements.in -redis==3.5.3 - # via - # -r requirements.in - # celery - # redislite -redislite==6.0.674960 +redis==4.3.4 # via -r requirements.in -regex==2021.8.28 - # via - # black - # datamodel-code-generator -requests-oauthlib==1.3.0 - # via atlassian-python-api -requests==2.26.0 +requests==2.28.1 # via # -r requirements.in # atlassian-python-api @@ -364,41 +362,43 @@ requests==2.26.0 # prance # presto-python-client # requests-oauthlib +requests-oauthlib==1.3.1 + # via atlassian-python-api retry==0.9.2 # via -r requirements.in retrying==1.3.3 # via -r requirements.in -rsa==4.7.2 +rsa==4.8 # via # google-auth # python-jose -ruamel.yaml.clib==0.2.6 - # via ruamel.yaml -ruamel.yaml==0.17.16 +ruamel-yaml==0.17.21 # via # -r requirements.in # prance -s3transfer==0.5.0 +ruamel-yaml-clib==0.2.6 + # via ruamel-yaml +s3transfer==0.6.0 # via boto3 -schema==0.7.4 +schema==0.7.5 # via policy-sentry semver==2.13.0 # via prance -sentry-sdk==1.3.1 +sentry-sdk==1.7.1 # via -r requirements.in -simplejson==3.17.5 +simplejson==3.17.6 # via -r requirements.in six==1.16.0 # via # -r requirements.in # atlassian-python-api - # bcrypt # bleach # click-repl # cloudaux # ecdsa # elasticsearch-dsl # furl + # google-auth # google-auth-httplib2 # isodate # jsonschema @@ -409,32 +409,34 @@ six==1.16.0 # password-strength # prance # presto-python-client - # protobuf + # pyrsistent # python-dateutil # retrying -smmap==4.0.0 +smmap==5.0.0 # via gitdb -soupsieve==2.2.1 +soupsieve==2.3.2.post1 # via beautifulsoup4 tenacity==8.0.1 # via -r requirements.in toml==0.10.2 + # via datamodel-code-generator +tomli==2.0.1 # via - # datamodel-code-generator + # black # pylint -tomli==1.2.1 - # via black -tornado==6.1 +tomlkit==0.11.1 + # via pylint +tornado==6.2 # via -r requirements.in -typing-extensions==3.10.0.2 - # via - # black - # pydantic -ujson==5.1.0 +typed-ast==1.5.4 + # via datamodel-code-generator +typing-extensions==4.3.0 + # via pydantic +ujson==5.4.0 # via -r requirements.in -uritemplate==3.0.1 +uritemplate==4.1.1 # via google-api-python-client -urllib3==1.26.6 +urllib3==1.26.10 # via # botocore # elasticsearch @@ -453,7 +455,7 @@ wcwidth==0.2.5 # via prompt-toolkit webencodings==0.5.1 # via bleach -wrapt==1.12.1 +wrapt==1.14.1 # via # astroid # deprecated @@ -461,7 +463,7 @@ xmlsec==1.3.12 # via # -r requirements.in # python3-saml -yarl==1.6.3 +yarl==1.7.2 # via aiohttp # The following packages are considered to be unsafe in a requirements file: diff --git a/terraform/central-account/.terraform.lock.hcl b/terraform/central-account/.terraform.lock.hcl index 16ab87750..8d894ffcd 100644 --- a/terraform/central-account/.terraform.lock.hcl +++ b/terraform/central-account/.terraform.lock.hcl @@ -6,6 +6,7 @@ provider "registry.terraform.io/hashicorp/aws" { constraints = ">= 2.65.0, >= 2.70.0, >= 3.0.0" hashes = [ "h1:1ud3VckbhSQ250tv58JCM9i1HKP05eijG4PEnU5PH7s=", + "h1:DFUb87/IK9l6anGAagwkDZ3x62p18JCljU8he5SfLrM=", "zh:0cedd84ba908ba7190052b16cd7f70c41b0e2c2e914e54eecf2e3dae193f47fa", "zh:14b89bac6412e20d415fe67d5f2eaa1414d9bbf75a5bd8fc963f6ab8e3b8b1a0", "zh:159131129edab7ea118dee7d6daf1bfe4615f200a2d5120deb8369cbd2c4b598", @@ -25,6 +26,7 @@ provider "registry.terraform.io/hashicorp/local" { constraints = ">= 1.3.0" hashes = [ "h1:EYZdckuGU3n6APs97nS2LxZm3dDtGqyM4qaIvsmac8o=", + "h1:PaQTpxHMbZB9XV+c1od1eaUvndQle3ZZHx79hrI6C3k=", "zh:0f1ec65101fa35050978d483d6e8916664b7556800348456ff3d09454ac1eae2", "zh:36e42ac19f5d68467aacf07e6adcf83c7486f2e5b5f4339e9671f68525fc87ab", "zh:6db9db2a1819e77b1642ec3b5e95042b202aee8151a0256d289f2e141bf3ceb3", @@ -43,6 +45,7 @@ provider "registry.terraform.io/hashicorp/null" { version = "3.1.0" constraints = ">= 2.0.0" hashes = [ + "h1:grYDj8/Lvp1OwME+g1AsECPN1czO5ssSf+8fCluCHQY=", "h1:vpC6bgUQoJ0znqIKVFevOdq+YQw42bRq0u+H3nto8nA=", "zh:02a1675fd8de126a00460942aaae242e65ca3380b5bb192e8773ef3da9073fd2", "zh:53e30545ff8926a8e30ad30648991ca8b93b6fa496272cd23b26763c8ee84515", @@ -61,6 +64,7 @@ provider "registry.terraform.io/hashicorp/null" { provider "registry.terraform.io/hashicorp/random" { version = "3.1.0" hashes = [ + "h1:9cCiLO/Cqr6IUvMDSApCkQItooiYNatZpEXmcu0nnng=", "h1:BZMEPucF+pbu9gsPk0G0BHx7YP04+tKdq2MrRDF1EDM=", "zh:2bbb3339f0643b5daa07480ef4397bd23a79963cc364cdfbb4e86354cb7725bc", "zh:3cd456047805bf639fbf2c761b1848880ea703a054f76db51852008b11008626", @@ -79,6 +83,7 @@ provider "registry.terraform.io/hashicorp/random" { provider "registry.terraform.io/hashicorp/tls" { version = "3.1.0" hashes = [ + "h1:U+kgPLboCrcs4eZV87esP7iydF8mjMyHKE/mDsrwfkQ=", "h1:fUJX8Zxx38e2kBln+zWr1Tl41X+OuiE++REjrEyiOM4=", "zh:3d46616b41fea215566f4a957b6d3a1aa43f1f75c26776d72a98bdba79439db6", "zh:623a203817a6dafa86f1b4141b645159e07ec418c82fe40acd4d2a27543cbaa2", diff --git a/terraform/central-account/main.tf b/terraform/central-account/main.tf index 4dfb428a9..2e69669af 100644 --- a/terraform/central-account/main.tf +++ b/terraform/central-account/main.tf @@ -1,13 +1,14 @@ module "server" { source = "git::https://github.com/terraform-aws-modules/terraform-aws-ec2-instance?ref=v2.16.0" - name = module.compute_label.id - instance_count = 1 - ami = data.aws_ami.amazon_linux.id - instance_type = var.instance_type - key_name = var.key_name - iam_instance_profile = aws_iam_instance_profile.ConsoleMeInstanceProfile.name - subnet_id = module.network.private_subnets[0] + name = module.compute_label.id + instance_count = 1 + ami = data.aws_ami.amazon_linux.id + instance_type = var.instance_type + key_name = var.key_name + iam_instance_profile = aws_iam_instance_profile.ConsoleMeInstanceProfile.name + subnet_id = var.associate_public_ip_address_to_ec2 ? module.network.public_subnets[0] : module.network.private_subnets[0] + associate_public_ip_address = var.associate_public_ip_address_to_ec2 user_data = templatefile("${path.module}/templates/userdata.sh", tomap({ bucket = aws_s3_bucket.consoleme_files_bucket.bucket current_account_id = data.aws_caller_identity.current.account_id diff --git a/terraform/central-account/security_group.tf b/terraform/central-account/security_group.tf index 043abd198..1640e0054 100644 --- a/terraform/central-account/security_group.tf +++ b/terraform/central-account/security_group.tf @@ -24,6 +24,17 @@ resource "aws_security_group_rule" "external_ingress_8081" { cidr_blocks = var.allowed_inbound_cidr_blocks } +# SSH +resource "aws_security_group_rule" "external_ingress_ssh" { + count = var.associate_public_ip_address_to_ec2 ? 1 : 0 + from_port = 22 + protocol = "tcp" + security_group_id = aws_security_group.server.id + to_port = 22 + type = "ingress" + cidr_blocks = var.allowed_inbound_cidr_blocks +} + resource "aws_security_group_rule" "external_egress_allow_all" { type = "egress" from_port = 0 diff --git a/terraform/central-account/templates/userdata.sh b/terraform/central-account/templates/userdata.sh index 2c38eb805..a9983ce69 100644 --- a/terraform/central-account/templates/userdata.sh +++ b/terraform/central-account/templates/userdata.sh @@ -25,9 +25,7 @@ systemctl restart rsyslog # --------------------------------------------------------------------------------------------------------------------- sudo yum update -y -yum -y erase python3 -sudo amazon-linux-extras enable python3.8 # consoleme requires 3.8 -yum -y install git python3.8 python38-pip python38-devel +yum -y install git python3.9 python3.9-pip python3.9-devel yum -y install libcurl-devel yum -y install libxml2-devel xmlsec1-devel xmlsec1-openssl-devel libtool-ltdl-devel sudo yum install -y gcc-c++ @@ -49,22 +47,22 @@ useradd -r -s /bin/false flower usermod -aG flower flower mkdir -p /apps/flower chown -R flower:flower /apps/flower -python3.8 -m venv /apps/flower/env --copies +python3.9 -m venv /apps/flower/env --copies source /apps/flower/env/bin/activate -pip3.8 install flower redis +pip3.9 install flower redis # Set up a new Virtualenv in the Consoleme directory -python3.8 -m venv /apps/consoleme/env +python3.9 -m venv /apps/consoleme/env source /apps/consoleme/env/bin/activate chown -R consoleme:consoleme /apps/consoleme chown -R consoleme:consoleme /logs # Install it cd /apps/consoleme -pip3.8 install xmlsec +pip3.9 install xmlsec -# Make uses "pip" and "python", assuming they are 3.8, but they actually point to python2 (because yum uses it) -alias python=python3.8 -alias pip=pip3.8 +# Make uses "pip" and "python", assuming they are 3.9, but they actually point to python2 (because yum uses it) +alias python=python3.9 +alias pip=pip3.9 make env_install make dynamo @@ -81,7 +79,7 @@ systemctl start redis cd /apps/consoleme # Install nvm -curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh > /tmp/nvm-install.sh +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh > /tmp/nvm-install.sh chmod +x /tmp/nvm-install.sh bash /tmp/nvm-install.sh echo 'export NVM_DIR="/root/.nvm"' >> /root/.bashrc @@ -89,8 +87,8 @@ echo '[ -s "\$NVM_DIR/nvm.sh" ] && . "\$NVM_DIR/nvm.sh" # This loads nvm' >> /r . ~/.nvm/nvm.sh . ~/.bashrc cd /apps/consoleme -nvm install 12.18.2 -nvm use 12.18.2 +nvm install 16.16.0 +nvm use 16.16.0 node -e "console.log('Running Node.js ' + process.version)" npm install yarn -g yarn --cwd ui @@ -123,7 +121,7 @@ Restart=always RestartSec=1 User=consoleme Group=consoleme -ExecStart=/usr/bin/env /apps/consoleme/env/bin/python3.8 /apps/consoleme/consoleme/__main__.py +ExecStart=/usr/bin/env /apps/consoleme/env/bin/python /apps/consoleme/consoleme/__main__.py [Install] WantedBy=multi-user.target @@ -144,7 +142,7 @@ RestartSec=1 WorkingDirectory=/apps/consoleme Environment=CONFIG_LOCATION=${CONFIG_LOCATION} Environment=EC2_REGION=${region} -ExecStart=/usr/bin/env /apps/consoleme/env/bin/python3.8 /apps/consoleme/env/bin/celery -A consoleme.celery_tasks.celery_tasks worker -l DEBUG -B -E --concurrency=15 +ExecStart=/usr/bin/env /apps/consoleme/env/bin/python /apps/consoleme/env/bin/celery -A consoleme.celery_tasks.celery_tasks worker -l DEBUG -B -E --concurrency=15 [Install] WantedBy=multi-user.target @@ -175,7 +173,7 @@ export EC2_REGION=${region} EOF # Run script to decode and write a custom ConsoleMe configuration. This won't do anything unless CONSOLEME_CONFIG_S3 is defined. -sudo -u consoleme bash -c '. /home/consoleme/.bashrc ; /apps/consoleme/env/bin/python3.8 /apps/consoleme/scripts/retrieve_or_decode_configuration.py' +sudo -u consoleme bash -c '. /home/consoleme/.bashrc ; /apps/consoleme/env/bin/python /apps/consoleme/scripts/retrieve_or_decode_configuration.py' # Make sure it is listed systemctl list-unit-files | grep celery.service systemctl list-unit-files | grep consoleme.service @@ -185,7 +183,7 @@ systemctl enable celery systemctl enable consoleme systemctl start consoleme -sudo -u consoleme bash -c '. /home/consoleme/.bashrc ; /apps/consoleme/env/bin/python3.8 /apps/consoleme/scripts/initialize_redis_oss.py' +sudo -u consoleme bash -c '. /home/consoleme/.bashrc ; /apps/consoleme/env/bin/python /apps/consoleme/scripts/initialize_redis_oss.py' echo "Running custom userdata script" ${custom_user_data_script} \ No newline at end of file diff --git a/terraform/central-account/terraform.tfvars.example b/terraform/central-account/terraform.tfvars.example index 01645e178..05e961119 100644 --- a/terraform/central-account/terraform.tfvars.example +++ b/terraform/central-account/terraform.tfvars.example @@ -11,6 +11,7 @@ subnet_azs = ["us-east-1a", "us-east-1b"] application_admin = "teamemail@example.com" allowed_inbound_cidr_blocks = [] // NOTE: Do not open this up to 0.0.0.0/0. Restrict access to your IP address for the demo. +associate_public_ip_address_to_ec2 = false // Set this to true if you want to provide a public IP to the EC2 instance allow_internet_access = false // Set this to true if you want to be able to access the server from the Internet. bucket_name_prefix = "your-name-prefix" diff --git a/terraform/central-account/variables.tf b/terraform/central-account/variables.tf index 3b6b98cfd..e28ed47bc 100644 --- a/terraform/central-account/variables.tf +++ b/terraform/central-account/variables.tf @@ -80,9 +80,15 @@ variable "lb_port" { } # Compute +variable "associate_public_ip_address_to_ec2" { + description = "Whether to provide a public IP to the ConsoleMe EC2 instance" + default = false + type = bool +} + variable "instance_type" { - description = "The size of the Ec2 instance. Defaults to t2.medium" - default = "t2.medium" + description = "The size of the EC2 instance. Defaults to t4g.medium" + default = "t4g.medium" } variable "volume_size" { @@ -106,8 +112,8 @@ variable "ec2_ami_owner_filter" { } variable "ec2_ami_name_filter" { - description = "The name of the AMI to search for. Defaults to amzn2-ami-hvm-2.0.2020*-x86_64-ebs" - default = "amzn2-ami-hvm-2.0.2020*-x86_64-ebs" # Need a release post Jan 2020 to support IMDSv2 + description = "The name of the AMI to search for. Defaults to al2022-ami*-arm64" + default = "al2022-ami*-arm64" # Need a release post Jan 2020 to support IMDSv2 type = string } diff --git a/tests/conftest.py b/tests/conftest.py index 69749785c..8f149b8e4 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -6,13 +6,13 @@ from datetime import datetime, timedelta import boto3 +import fakeredis import pytest -import redislite from mock import MagicMock, Mock, patch from mockredis import mock_strict_redis_client from moto import ( mock_config, - mock_dynamodb2, + mock_dynamodb, mock_iam, mock_s3, mock_ses, @@ -363,7 +363,7 @@ def create_default_resources(s3, iam, redis, iam_sync_principals, iamrole_table) @pytest.fixture(autouse=True, scope="session") def dynamodb(aws_credentials): """Mocked DynamoDB Fixture.""" - with mock_dynamodb2(): + with mock_dynamodb(): # Remove the config value for the DynamoDB Server from consoleme.config.config import CONFIG @@ -933,26 +933,33 @@ def www_user(): ) -class FakeRedis(redislite.StrictRedis): - def __init__(self, *args, **kwargs): - if kwargs.get("connection_pool"): - del kwargs["connection_pool"] - super(FakeRedis, self).__init__( - MOCK_REDIS_DB_PATH, *args, **kwargs, decode_responses=True - ) +fakeredis_server = fakeredis.FakeServer() + +fake_redis = fakeredis.FakeRedis(server=fakeredis_server, decode_responses=True) + +fake_strict_redis = fakeredis.FakeStrictRedis( + server=fakeredis_server, decode_responses=True +) @pytest.fixture(autouse=True, scope="session") def redis(session_mocker): - session_mocker.patch("redis.Redis", FakeRedis) - session_mocker.patch("redis.StrictRedis", FakeRedis) - session_mocker.patch("consoleme.lib.redis.redis.StrictRedis", FakeRedis) - session_mocker.patch("consoleme.lib.redis.redis.Redis", FakeRedis) + from consoleme.config import config + + if folder_configuration := config.get("celery.broker_transport_options"): + for v in folder_configuration.values(): + os.makedirs(v, exist_ok=True) + session_mocker.patch("redis.Redis", return_value=fake_redis) + session_mocker.patch("redis.StrictRedis", return_value=fake_strict_redis) + session_mocker.patch( + "consoleme.lib.redis.redis.StrictRedis", return_value=fake_strict_redis + ) + session_mocker.patch("consoleme.lib.redis.redis.Redis", return_value=fake_redis) session_mocker.patch( - "consoleme.lib.redis.RedisHandler.redis_sync", return_value=FakeRedis() + "consoleme.lib.redis.RedisHandler.redis_sync", return_value=fake_redis ) session_mocker.patch( - "consoleme.lib.redis.RedisHandler.redis", return_value=FakeRedis() + "consoleme.lib.redis.RedisHandler.redis", return_value=fake_redis ) return True @@ -1063,7 +1070,7 @@ def mock_async_http_client(): p_return_value.body = "{}" p = patch("tornado.httpclient.AsyncHTTPClient") - p.return_value.fetch.return_value = create_future(p_return_value) + p.return_value.fetch.return_value = p_return_value yield p.start() diff --git a/tests/handlers/test_policies.py b/tests/handlers/test_policies.py index be3204418..bb4eb7c4b 100644 --- a/tests/handlers/test_policies.py +++ b/tests/handlers/test_policies.py @@ -68,7 +68,7 @@ def test_resource_typeahead( method="GET", ) self.assertEqual(response.code, 400) - result = create_future({"123456789012": '["abucket1", "abucket2"]'}) + result = {"123456789012": '["abucket1", "abucket2"]'} mock_retrieve_json_data_from_redis_or_s3.return_value = result account_id = "123456789012" resource = "s3" diff --git a/tests/handlers/v2/test_requests.py b/tests/handlers/v2/test_requests.py index 52806ad56..26a3b4450 100644 --- a/tests/handlers/v2/test_requests.py +++ b/tests/handlers/v2/test_requests.py @@ -486,9 +486,9 @@ def test_post_new_managed_policy_resource_request_autoapprove(self): "change_type": "managed_policy_resource", "resources": [], "version": "3.0", - "status": "applied", + "status": "not_applied", "autogenerated": False, - "updated_by": "consoleme_admins@example.com", + "updated_by": None, "expiration_date": None, "new": True, "policy": { diff --git a/tests/handlers/v2/test_user.py b/tests/handlers/v2/test_user.py index de4e9028a..3a43d5e86 100644 --- a/tests/handlers/v2/test_user.py +++ b/tests/handlers/v2/test_user.py @@ -43,7 +43,7 @@ def test_register_user(self): body = json.dumps( { - "username": "testuser5@example.com", + "username": "testuser5@example2.com", "password": "testuser5password", } ) @@ -54,7 +54,7 @@ def test_register_user(self): { "status": "success", "status_code": 200, - "message": "Successfully created user testuser5@example.com.", + "message": "Successfully created user testuser5@example2.com.", }, ) diff --git a/tests/lib/test_aws.py b/tests/lib/test_aws.py index 4b769633b..172e32198 100644 --- a/tests/lib/test_aws.py +++ b/tests/lib/test_aws.py @@ -10,8 +10,6 @@ import ujson as json from mock import patch -from tests.conftest import create_future - ROLE = { "Arn": "arn:aws:iam::123456789012:role/TestInstanceProfile", "RoleName": "TestInstanceProfile", @@ -75,7 +73,7 @@ def test_apply_managed_policy_to_role(self): def test_get_resource_account(self, mock_aws_config_resources_redis): from consoleme.lib.aws import get_resource_account - mock_aws_config_resources_redis.return_value = create_future(None) + mock_aws_config_resources_redis.return_value = None test_cases = [ { "arn": "arn:aws:s3:::nope", @@ -106,9 +104,10 @@ def test_get_resource_account(self, mock_aws_config_resources_redis): "description": "internal S3 bucket", } aws_config_resources_test_case_redis_result = {"accountId": "123456789012"} - mock_aws_config_resources_redis.return_value = create_future( - json.dumps(aws_config_resources_test_case_redis_result) + mock_aws_config_resources_redis.return_value = json.dumps( + aws_config_resources_test_case_redis_result ) + result = loop.run_until_complete( get_resource_account(aws_config_resources_test_case["arn"]) ) diff --git a/tests/lib/test_requests_v2.py b/tests/lib/test_requests_v2.py index 1c8c087e0..d4f2b9a18 100644 --- a/tests/lib/test_requests_v2.py +++ b/tests/lib/test_requests_v2.py @@ -26,7 +26,6 @@ Status, UserModel, ) -from tests.conftest import create_future existing_policy_name = "test_inline_policy_change5" existing_policy_document = { @@ -2156,8 +2155,8 @@ async def test_parse_and_apply_policy_request_modification_add_comment( input_body ) last_updated = extended_request.timestamp - mock_dynamo_write.return_value = create_future(None) - mock_send_comment.return_value = create_future(None) + mock_dynamo_write.return_value = None + mock_send_comment.return_value = None # Trying to set an empty comment with pytest.raises(ValidationError) as e: await parse_and_apply_policy_request_modification( @@ -2221,7 +2220,7 @@ async def test_parse_and_apply_policy_request_modification_update_change( input_body ) last_updated = extended_request.timestamp - mock_dynamo_write.return_value = create_future(None) + mock_dynamo_write.return_value = None # Trying to update while not being authorized from consoleme.exceptions.exceptions import Unauthorized @@ -2306,9 +2305,9 @@ async def test_parse_and_apply_policy_request_modification_apply_change( input_body ) last_updated = extended_request.timestamp - mock_dynamo_write.return_value = create_future(None) - mock_populate_old_policies.return_value = create_future(extended_request) - mock_fetch_iam_role.return_value = create_future(None) + mock_dynamo_write.return_value = None + mock_populate_old_policies.return_value = extended_request + mock_fetch_iam_role.return_value = None can_admin_policies.return_value = False client = boto3.client( "iam", region_name="us-east-1", **config.get("boto3.client_kwargs", {}) @@ -2391,8 +2390,8 @@ async def test_parse_and_apply_policy_request_modification_cancel_request( input_body ) last_updated = extended_request.timestamp - mock_dynamo_write.return_value = create_future(None) - mock_send_email.return_value = create_future(None) + mock_dynamo_write.return_value = None + mock_send_email.return_value = None # Trying to cancel while not being authorized with pytest.raises(Unauthorized) as e: await parse_and_apply_policy_request_modification( @@ -2462,8 +2461,8 @@ async def test_parse_and_apply_policy_request_modification_reject_and_move_back_ input_body ) last_updated = int(extended_request.timestamp.timestamp()) - mock_dynamo_write.return_value = create_future(None) - mock_send_email.return_value = create_future(None) + mock_dynamo_write.return_value = None + mock_send_email.return_value = None # Trying to reject while not being authorized with pytest.raises(Unauthorized) as e: await parse_and_apply_policy_request_modification( @@ -2516,7 +2515,7 @@ async def test_parse_and_apply_policy_request_modification_reject_and_move_back_ self.assertEqual(RequestStatus.rejected, extended_request.request_status) policy_request_model.modification_model.command = Command.move_back_to_pending - mock_move_back_to_pending.return_value = create_future(False) + mock_move_back_to_pending.return_value = False # Trying to move back to pending request - not authorized with pytest.raises(Unauthorized) as e: await parse_and_apply_policy_request_modification( @@ -2528,7 +2527,7 @@ async def test_parse_and_apply_policy_request_modification_reject_and_move_back_ ) self.assertIn("Cannot move this request back to pending", str(e)) - mock_move_back_to_pending.return_value = create_future(True) + mock_move_back_to_pending.return_value = True # Trying to move back to pending request - authorized response = await parse_and_apply_policy_request_modification( extended_request, @@ -2643,12 +2642,12 @@ async def test_parse_and_apply_policy_request_modification_approve_request( input_body ) last_updated = extended_request.timestamp - mock_dynamo_write.return_value = create_future(None) - mock_populate_old_policies.return_value = create_future(extended_request) - mock_fetch_iam_role.return_value = create_future(None) - mock_can_update_cancel_requests_v2.return_value = create_future(False) + mock_dynamo_write.return_value = None + mock_populate_old_policies.return_value = extended_request + mock_fetch_iam_role.return_value = None + mock_can_update_cancel_requests_v2.return_value = False can_admin_policies.return_value = False - mock_send_email.return_value = create_future(None) + mock_send_email.return_value = None client = boto3.client( "iam", region_name="us-east-1", **config.get("boto3.client_kwargs", {}) ) @@ -2666,7 +2665,7 @@ async def test_parse_and_apply_policy_request_modification_approve_request( self.assertIn("Unauthorized", str(e)) can_admin_policies.return_value = True - mock_can_update_cancel_requests_v2.return_value = create_future(True) + mock_can_update_cancel_requests_v2.return_value = True # Authorized person updating the change response = await parse_and_apply_policy_request_modification(