Techdebt: Unpin werkzeug (#5569)

This commit is contained in:
Bert Blommers 2022-10-17 19:06:59 +00:00 committed by GitHub
parent 43a3fecbd2
commit 3e60cdf3eb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 63 additions and 19 deletions

View File

@ -16,7 +16,7 @@ jobs:
python-version: [ "3.10" ] python-version: [ "3.10" ]
responses-version: ["0.13.0", "0.15.0", "0.17.0", "0.19.0", "0.20.0" ] responses-version: ["0.13.0", "0.15.0", "0.17.0", "0.19.0", "0.20.0" ]
mock-version: [ "3.0.5", "4.0.0", "4.0.3" ] mock-version: [ "3.0.5", "4.0.0", "4.0.3" ]
werkzeug-version: ["2.0.1", "2.1.1"] werkzeug-version: ["2.0.1", "2.1.1", "2.2.2"]
openapi-spec-validator-version: ["0.4.0", "0.5.0"] openapi-spec-validator-version: ["0.4.0", "0.5.0"]
steps: steps:
@ -37,9 +37,36 @@ jobs:
pip install -r requirements-dev.txt pip install -r requirements-dev.txt
pip install responses==${{ matrix.responses-version }} pip install responses==${{ matrix.responses-version }}
pip install mock==${{ matrix.mock-version }} pip install mock==${{ matrix.mock-version }}
pip install flask==${{ matrix.werkzeug-version }}
pip install werkzeug==${{ matrix.werkzeug-version }} pip install werkzeug==${{ matrix.werkzeug-version }}
pip install openapi-spec-validator==${{ matrix.openapi-spec-validator-version }} pip install openapi-spec-validator==${{ matrix.openapi-spec-validator-version }}
- name: Run tests - name: Run tests
run: | run: |
pytest -sv tests/test_core ./tests/test_apigateway/test_apigateway_integration.py ./tests/test_s3/test_server.py pytest -sv tests/test_core ./tests/test_apigateway/test_apigateway_integration.py ./tests/test_s3/test_server.py
- name: Start MotoServer
run: |
python setup.py sdist
docker run --rm -t --name motoserver -e TEST_SERVER_MODE=true -e AWS_SECRET_ACCESS_KEY=server_secret -e AWS_ACCESS_KEY_ID=server_key -v `pwd`:/moto -p 5000:5000 -v /var/run/docker.sock:/var/run/docker.sock python:3.7-buster /moto/scripts/ci_moto_server.sh &
python scripts/ci_wait_for_server.py
- name: Test ServerMode/Coverage
env:
TEST_SERVER_MODE: ${{ true }}
run: |
pytest -sv tests/test_core tests/test_awslambda tests/test_cloudformation
- name: "Stop MotoServer"
if: always()
run: |
mkdir serverlogs
pwd
ls -la
cp server_output.log serverlogs/server_output.log
docker stop motoserver
- name: Archive TF logs
if: always()
uses: actions/upload-artifact@v3
with:
name: motoserver
path: |
serverlogs/*

View File

@ -19,8 +19,9 @@ url_paths = {
"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/?$": response.resource_individual, "{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/?$": response.resource_individual,
"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/?$": response.resource_methods, "{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/?$": response.resource_methods,
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/responses/(?P<status_code>\d+)$": response.resource_method_responses, r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/responses/(?P<status_code>\d+)$": response.resource_method_responses,
"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/?$": response.integrations, r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration$": response.integrations,
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)/?$": response.integration_responses, r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)$": response.integration_responses,
r"{0}/restapis/(?P<function_id>[^/]+)/resources/(?P<resource_id>[^/]+)/methods/(?P<method_name>[^/]+)/integration/responses/(?P<status_code>\d+)/$": response.integration_responses,
"{0}/apikeys$": response.apikeys, "{0}/apikeys$": response.apikeys,
"{0}/apikeys/(?P<apikey>[^/]+)": response.apikey_individual, "{0}/apikeys/(?P<apikey>[^/]+)": response.apikey_individual,
"{0}/usageplans$": response.usage_plans, "{0}/usageplans$": response.usage_plans,

View File

@ -26,7 +26,9 @@ url_paths = {
"{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses$": response_v2.route_responses, "{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses$": response_v2.route_responses,
"{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses/(?P<route_response_id>[^/]+)$": response_v2.route_response, "{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/routeresponses/(?P<route_response_id>[^/]+)$": response_v2.route_response,
"{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/requestparameters/(?P<request_parameter>[^/]+)$": response_v2.route_request_parameter, "{0}/v2/apis/(?P<api_id>[^/]+)/routes/(?P<route_id>[^/]+)/requestparameters/(?P<request_parameter>[^/]+)$": response_v2.route_request_parameter,
"{0}/v2/tags/(?P<resource_arn>.+)$": response_v2.tags, "{0}/v2/tags/(?P<resource_arn>[^/]+)$": response_v2.tags,
"{0}/v2/tags/(?P<resource_arn_pt1>[^/]+)/apis/(?P<resource_arn_pt2>[^/]+)$": response_v2.tags,
"{0}/v2/tags/(?P<resource_arn_pt1>[^/]+)/vpclinks/(?P<resource_arn_pt2>[^/]+)$": response_v2.tags,
"{0}/v2/vpclinks$": response_v2.vpc_links, "{0}/v2/vpclinks$": response_v2.vpc_links,
"{0}/v2/vpclinks/(?P<vpc_link_id>[^/]+)$": response_v2.vpc_link, "{0}/v2/vpclinks/(?P<vpc_link_id>[^/]+)$": response_v2.vpc_link,
} }

View File

@ -16,5 +16,6 @@ url_paths = {
"{0}/v1/apis/(?P<api_id>[^/]+)/apikeys/(?P<api_key_id>[^/]+)$": response.api_key_individual, "{0}/v1/apis/(?P<api_id>[^/]+)/apikeys/(?P<api_key_id>[^/]+)$": response.api_key_individual,
"{0}/v1/apis/(?P<api_id>[^/]+)/schemacreation$": response.schemacreation, "{0}/v1/apis/(?P<api_id>[^/]+)/schemacreation$": response.schemacreation,
"{0}/v1/tags/(?P<resource_arn>.+)$": response.tags, "{0}/v1/tags/(?P<resource_arn>.+)$": response.tags,
"{0}/v1/tags/(?P<resource_arn_pt1>.+)/(?P<resource_arn_pt2>.+)$": response.tags,
"{0}/v1/apis/(?P<api_id>[^/]+)/types/(?P<type_name>.+)$": response.types, "{0}/v1/apis/(?P<api_id>[^/]+)/types/(?P<type_name>.+)$": response.types,
} }

View File

@ -5,16 +5,18 @@ url_bases = [r"https?://lambda\.(.+)\.amazonaws\.com"]
response = LambdaResponse() response = LambdaResponse()
url_paths = { url_paths = {
r"{0}/(?P<api_version>[^/]+)/functions/?$": response.root, r"{0}/(?P<api_version>[^/]+)/functions$": response.root,
r"{0}/(?P<api_version>[^/]+)/functions/$": response.root,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/?$": response.function, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/?$": response.function,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases$": response.aliases, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases$": response.aliases,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases/(?P<alias_name>[\w_-]+)$": response.alias, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/aliases/(?P<alias_name>[\w_-]+)$": response.alias,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/versions/?$": response.versions, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/versions/?$": response.versions,
r"{0}/(?P<api_version>[^/]+)/event-source-mappings/?$": response.event_source_mappings, r"{0}/(?P<api_version>[^/]+)/event-source-mappings/$": response.event_source_mappings,
r"{0}/(?P<api_version>[^/]+)/event-source-mappings/(?P<UUID>[\w_-]+)/?$": response.event_source_mapping, r"{0}/(?P<api_version>[^/]+)/event-source-mappings/(?P<UUID>[\w_-]+)/?$": response.event_source_mapping,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_-]+)/invocations/?$": response.invoke, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_-]+)/invocations/?$": response.invoke,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<resource_arn>.+)/invocations/?$": response.invoke, r"{0}/(?P<api_version>[^/]+)/functions/(?P<resource_arn>.+)/invocations/?$": response.invoke,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/invoke-async/?$": response.invoke_async, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/invoke-async$": response.invoke_async,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/invoke-async/$": response.invoke_async,
r"{0}/(?P<api_version>[^/]+)/tags/(?P<resource_arn>.+)": response.tag, r"{0}/(?P<api_version>[^/]+)/tags/(?P<resource_arn>.+)": response.tag,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/(?P<statement_id>[\w_-]+)$": response.policy, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/(?P<statement_id>[\w_-]+)$": response.policy,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/?$": response.policy, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/policy/?$": response.policy,
@ -23,7 +25,9 @@ url_paths = {
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/code-signing-config$": response.code_signing_config, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/code-signing-config$": response.code_signing_config,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/concurrency/?$": response.function_concurrency, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/concurrency/?$": response.function_concurrency,
r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/url/?$": response.function_url_config, r"{0}/(?P<api_version>[^/]+)/functions/(?P<function_name>[\w_:%-]+)/url/?$": response.function_url_config,
r"{0}/(?P<api_version>[^/]+)/layers/?$": response.list_layers, r"{0}/(?P<api_version>[^/]+)/layers$": response.list_layers,
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/?$": response.layers_versions, r"{0}/(?P<api_version>[^/]+)/layers/$": response.list_layers,
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions$": response.layers_versions,
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/$": response.layers_versions,
r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/(?P<layer_version>[\w_-]+)$": response.layers_version, r"{0}/(?P<api_version>[^/]+)/layers/(?P<layer_name>[\w_-]+)/versions/(?P<layer_version>[\w_-]+)$": response.layers_version,
} }

View File

@ -8,6 +8,8 @@ from werkzeug.routing import BaseConverter
class RegexConverter(BaseConverter): class RegexConverter(BaseConverter):
# http://werkzeug.pocoo.org/docs/routing/#custom-converters # http://werkzeug.pocoo.org/docs/routing/#custom-converters
part_isolating = False
def __init__(self, url_map, *items): def __init__(self, url_map, *items):
super().__init__(url_map) super().__init__(url_map)
self.regex = items[0] self.regex = items[0]

View File

@ -14,5 +14,6 @@ url_paths = {
"{0}/v1/apps/(?P<app_id>[^/]+)$": response.app, "{0}/v1/apps/(?P<app_id>[^/]+)$": response.app,
"{0}/v1/apps/(?P<app_id>[^/]+)/eventstream": response.eventstream, "{0}/v1/apps/(?P<app_id>[^/]+)/eventstream": response.eventstream,
"{0}/v1/apps/(?P<app_id>[^/]+)/settings$": response.app_settings, "{0}/v1/apps/(?P<app_id>[^/]+)/settings$": response.app_settings,
"{0}/v1/tags/(?P<app_arn>.+)$": response.tags, "{0}/v1/tags/(?P<app_arn>[^/]+)$": response.tags,
"{0}/v1/tags/(?P<app_arn_pt_1>[^/]+)/(?P<app_arn_pt_2>[^/]+)$": response.tags,
} }

View File

@ -15,8 +15,10 @@ def tag_response2(*args, **kwargs):
url_paths = { url_paths = {
r"{0}/(?P<api_version>[\d_-]+)/hostedzone$": Route53().list_or_create_hostzone_response, r"{0}/(?P<api_version>[\d_-]+)/hostedzone$": Route53().list_or_create_hostzone_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)$": Route53().get_or_delete_hostzone_response, r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)$": Route53().get_or_delete_hostzone_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/?$": Route53().rrset_response, r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset$": Route53().rrset_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/dnssec/?$": Route53().get_dnssec_response, r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/rrset/$": Route53().rrset_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/dnssec$": Route53().get_dnssec_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/dnssec/$": Route53().get_dnssec_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/associatevpc/?$": Route53().associate_vpc_response, r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/associatevpc/?$": Route53().associate_vpc_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/disassociatevpc/?$": Route53().disassociate_vpc_response, r"{0}/(?P<api_version>[\d_-]+)/hostedzone/(?P<zone_id>[^/]+)/disassociatevpc/?$": Route53().disassociate_vpc_response,
r"{0}/(?P<api_version>[\d_-]+)/hostedzonesbyname": Route53().list_hosted_zones_by_name_response, r"{0}/(?P<api_version>[\d_-]+)/hostedzonesbyname": Route53().list_hosted_zones_by_name_response,

View File

@ -14,7 +14,8 @@ url_paths = {
# subdomain bucket # subdomain bucket
"{0}/$": S3ResponseInstance.bucket_response, "{0}/$": S3ResponseInstance.bucket_response,
# subdomain key of path-based bucket # subdomain key of path-based bucket
"{0}/(?P<key_or_bucket_name>[^/]+)/?$": S3ResponseInstance.ambiguous_response, "{0}/(?P<key_or_bucket_name>[^/]+)$": S3ResponseInstance.ambiguous_response,
"{0}/(?P<key_or_bucket_name>[^/]+)/$": S3ResponseInstance.ambiguous_response,
# path-based bucket + key # path-based bucket + key
"{0}/(?P<bucket_name_path>[^/]+)/(?P<key_name>.+)": S3ResponseInstance.key_response, "{0}/(?P<bucket_name_path>[^/]+)/(?P<key_name>.+)": S3ResponseInstance.key_response,
# subdomain bucket + key with empty first part of path # subdomain bucket + key with empty first part of path

View File

@ -32,7 +32,7 @@ install_requires = [
"cryptography>=3.3.1", "cryptography>=3.3.1",
"requests>=2.5", "requests>=2.5",
"xmltodict", "xmltodict",
"werkzeug>=0.5,<2.2.0", "werkzeug>=0.5,!=2.2.0,!=2.2.1",
"pytz", "pytz",
"python-dateutil<3.0.0,>=2.1", "python-dateutil<3.0.0,>=2.1",
"responses>=0.13.0", "responses>=0.13.0",
@ -73,7 +73,7 @@ all_extra_deps = [
_dep_openapi, _dep_openapi,
_setuptools, _setuptools,
] ]
all_server_deps = all_extra_deps + ["flask<2.2.0", "flask-cors"] all_server_deps = all_extra_deps + ["flask!=2.2.0,!=2.2.1", "flask-cors"]
extras_per_service = {} extras_per_service = {}
for service_name in [ for service_name in [

View File

@ -65,8 +65,8 @@ def test_create_custom_lambda_resource():
success, logs = wait_for_log_msg( success, logs = wait_for_log_msg(
expected_msg="Status code: 200", log_group=log_group_name expected_msg="Status code: 200", log_group=log_group_name
) )
with sure.ensure(f"Logs should indicate success: \n{logs}"): assert success, f"Logs should indicate success: \n{logs}"
success.should.equal(True)
# Verify the correct Output was returned # Verify the correct Output was returned
outputs = get_outputs(cf, stack_name) outputs = get_outputs(cf, stack_name)
outputs.should.have.length_of(1) outputs.should.have.length_of(1)

View File

@ -1,9 +1,10 @@
import gc import gc
import warnings import warnings
import unittest
from functools import wraps from functools import wraps
from moto import settings
from moto.s3 import models as s3model from moto.s3 import models as s3model
from moto.s3.responses import S3ResponseInstance from moto.s3.responses import S3ResponseInstance
from unittest import SkipTest, TestCase
def verify_zero_warnings(f): def verify_zero_warnings(f):
@ -24,13 +25,15 @@ def verify_zero_warnings(f):
return wrapped return wrapped
class TestS3FileHandleClosures(unittest.TestCase): class TestS3FileHandleClosures(TestCase):
""" """
Large Uploads are written to disk for performance reasons Large Uploads are written to disk for performance reasons
These tests verifies that the filehandles are properly closed after specific actions These tests verifies that the filehandles are properly closed after specific actions
""" """
def setUp(self) -> None: def setUp(self) -> None:
if settings.TEST_SERVER_MODE:
raise SkipTest("No point in testing ServerMode, we're not using boto3")
self.s3 = s3model.S3Backend("us-west-1", "1234") self.s3 = s3model.S3Backend("us-west-1", "1234")
self.s3.create_bucket("my-bucket", "us-west-1") self.s3.create_bucket("my-bucket", "us-west-1")
self.s3.create_bucket("versioned-bucket", "us-west-1") self.s3.create_bucket("versioned-bucket", "us-west-1")