Created
March 19, 2021 20:23
-
-
Save amarjandu/77a7d8e33623bae1e4e5ba40dc043cb9 to your computer and use it in GitHub Desktop.
A reprodiuction for the presigned url issue w/ moto
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import moto | |
import boto3 | |
import requests | |
import tempfile | |
from botocore.config import Config | |
region = 'us-gov-west-1' | |
bucket_name = 'banana-slugs' | |
test_config = Config(region_name=region) | |
def method_wrapper(func): | |
@moto.mock_sts | |
@moto.mock_s3 | |
def wrapper(self, *args, **kwargs): | |
client = boto3.client('s3', config=test_config) | |
client.create_bucket(Bucket=bucket_name, | |
CreateBucketConfiguration={ | |
'LocationConstraint': region | |
}) | |
return func(self, *args, **kwargs) | |
return wrapper | |
class Foo: | |
@method_wrapper | |
def bar(self): | |
client = boto3.client('s3', config=test_config) | |
file = tempfile.NamedTemporaryFile() | |
file.write(bytes('foobar', 'UTF-8')) | |
client.upload_file(file.name, bucket_name, 'trash-file') | |
presigned_url = client.generate_presigned_url( | |
ClientMethod=client.get_object.__name__, | |
Params={ | |
'Bucket': bucket_name, | |
'Key': 'trash-file', | |
**({'ResponseContentDisposition': f'attachment;filename=bar'}) | |
}) | |
resp = requests.get(presigned_url) | |
print(resp.text) | |
assert resp.status_code == 200 | |
a = Foo() | |
a.bar() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(.venv) CBSEspecter:azul amar$ de | |
CBSEspecter:azul amar$ make virtualenv | |
if test -e .venv; then rm -rf .venv/; fi | |
python3.8 -m venv .venv | |
Run 'source .venv/bin/activate' now! | |
CBSEspecter:azul amar$ ae | |
(.venv) CBSEspecter:azul amar$ pip install moto[all]==2.0.2 | |
Collecting moto[all]==2.0.2 | |
Using cached https://files.pythonhosted.org/packages/ea/34/5d837227ac7e035a8f804d220757d28ef05c11c1b1368b219e6ca8f3292a/moto-2.0.2-py2.py3-none-any.whl | |
Collecting boto3>=1.9.201 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/30/6d/1c43d87bfff9e7afb5130629dfb7d57617245eeb4a474bf77f45d637c3a6/boto3-1.17.33-py2.py3-none-any.whl | |
Collecting pytz (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/70/94/784178ca5dd892a98f113cdd923372024dc04b8d40abe77ca76b5fb90ca6/pytz-2021.1-py2.py3-none-any.whl | |
Collecting Jinja2>=2.10.1 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/7e/c2/1eece8c95ddbc9b1aeb64f5783a9e07a286de42191b7204d67b7496ddf35/Jinja2-2.11.3-py2.py3-none-any.whl | |
Collecting more-itertools (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/05/47/514062a0798c2e9bdfd4514bacf9971fc8961b715f01487e4cfda3cc45a7/more_itertools-8.7.0-py3-none-any.whl | |
Collecting requests>=2.5 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/29/c1/24814557f1d22c56d50280771a17307e6bf87b70727d975fd6b2ce6b014a/requests-2.25.1-py2.py3-none-any.whl | |
Collecting xmltodict (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/28/fd/30d5c1d3ac29ce229f6bdc40bbc20b28f716e8b363140c26eff19122d8a5/xmltodict-0.12.0-py2.py3-none-any.whl | |
Collecting six>1.9 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/ee/ff/48bde5c0f013094d729fe4b0316ba2a24774b3ff1c52d924a8a4cb04078a/six-1.15.0-py2.py3-none-any.whl | |
Collecting cryptography>=3.3.1 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/32/52/4ba2bdec39b51a072a968c2b425c3649777d4816d27832703e082e2c5534/cryptography-3.4.6-cp36-abi3-macosx_10_10_x86_64.whl | |
Collecting python-dateutil<3.0.0,>=2.1 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/d4/70/d60450c3dd48ef87586924207ae8907090de0b306af2bce5d134d78615cb/python_dateutil-2.8.1-py2.py3-none-any.whl | |
Collecting responses>=0.9.0 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/b1/a1/162c90162e0f4539534b6ce6d723c4c07be8ad38c1cb975d7c63128502e0/responses-0.13.1-py2.py3-none-any.whl | |
Requirement already satisfied: setuptools in ./.venv/lib/python3.8/site-packages (from moto[all]==2.0.2) (41.2.0) | |
Collecting zipp (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/0f/8c/715c54e9e34c0c4820f616a913a7de3337d0cd79074dd1bed4dd840f16ae/zipp-3.4.1-py3-none-any.whl | |
Collecting botocore>=1.12.201 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/dd/1c/f922d7fa47cdd6a18c7470252e86f7c4d24e85cb3cdff09486675df3769c/botocore-1.20.33-py2.py3-none-any.whl | |
Collecting MarkupSafe<2.0 (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/0c/12/37f68957526d1ec0883b521934b4e1b8ff3dd8e4fab858a5bf3e487bcee9/MarkupSafe-1.1.1-cp38-cp38-macosx_10_9_x86_64.whl | |
Collecting mock (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/5c/03/b7e605db4a57c0f6fba744b11ef3ddf4ddebcada35022927a2b5fc623fdf/mock-4.0.3-py3-none-any.whl | |
Collecting werkzeug (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/cc/94/5f7079a0e00bd6863ef8f1da638721e9da21e5bacee597595b318f71d62e/Werkzeug-1.0.1-py2.py3-none-any.whl | |
Collecting cfn-lint>=0.4.0; extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/31/54/f6712193a29803952e59320a45ca1da22a6e71de2a827e4df66642738c3c/cfn_lint-0.47.2-py3-none-any.whl | |
Collecting aws-xray-sdk!=0.96,>=0.93; extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/e1/cd/12f2bc3a7683e88abe60ee6e0c09248103052b7532a7cf7ce1fccefa1a71/aws_xray_sdk-2.6.0-py2.py3-none-any.whl | |
Collecting sshpubkeys>=3.1.0; python_version > "3" and extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/e3/76/bc71db2f6830196554e5a197331ad668c049a12fb331075f4f579ff73cb4/sshpubkeys-3.3.1-py2.py3-none-any.whl | |
Collecting python-jose[cryptography]<4.0.0,>=3.1.0; extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/2b/55/bc3e9a4013a50287ec30e653c85cd10f077f8bca73bcda869847bf18cf37/python_jose-3.2.0-py2.py3-none-any.whl | |
Collecting ecdsa<0.15; extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/a2/25/3bb32da623b39a27a07d194cd58e4540224421d924661de2e694304ae4fa/ecdsa-0.14.1-py2.py3-none-any.whl | |
Collecting idna<3,>=2.5; extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/a2/38/928ddce2273eaa564f6f50de919327bf3a00f091b5baba8dfa9460f3a8a8/idna-2.10-py2.py3-none-any.whl | |
Collecting jsondiff>=1.1.2; extra == "all" (from moto[all]==2.0.2) | |
Collecting PyYAML>=5.1; extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/cb/3f/2f35751408c0b2a425aa48dd79301a48418858d3366f84c75d1aa42b6e2d/PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl | |
Collecting docker>=2.5.1; extra == "all" (from moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/c4/22/410313ad554477e87ec406d38d85f810e61ddb0d2fc44e64994857476de9/docker-4.4.4-py2.py3-none-any.whl | |
Collecting s3transfer<0.4.0,>=0.3.0 (from boto3>=1.9.201->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/98/14/0b4be62b65c52d6d1c442f24e02d2a9889a73d3c352002e14c70f84a679f/s3transfer-0.3.6-py2.py3-none-any.whl | |
Collecting jmespath<1.0.0,>=0.7.1 (from boto3>=1.9.201->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/07/cb/5f001272b6faeb23c1c9e0acc04d48eaaf5c862c17709d20e3469c6e0139/jmespath-0.10.0-py2.py3-none-any.whl | |
Collecting urllib3<1.27,>=1.21.1 (from requests>=2.5->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/09/c6/d3e3abe5b4f4f16cf0dfc9240ab7ce10c2baa0e268989a4e3ec19e90c84e/urllib3-1.26.4-py2.py3-none-any.whl | |
Collecting certifi>=2017.4.17 (from requests>=2.5->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/5e/a0/5f06e1e1d463903cf0c0eebeb751791119ed7a4b3737fdc9a77f1cdfb51f/certifi-2020.12.5-py2.py3-none-any.whl | |
Collecting chardet<5,>=3.0.2 (from requests>=2.5->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/19/c7/fa589626997dd07bd87d9269342ccb74b1720384a4d739a1872bd84fbe68/chardet-4.0.0-py2.py3-none-any.whl | |
Collecting cffi>=1.12 (from cryptography>=3.3.1->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/57/cc/4c80c4796ca182433502cd20119a2f4b2bab6caa097745ecaf23fc692ae1/cffi-1.14.5-cp38-cp38-macosx_10_9_x86_64.whl | |
Collecting jsonpatch; python_version != "3.4" (from cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/a3/55/f7c93bae36d869292aedfbcbae8b091386194874f16390d680136edd2b28/jsonpatch-1.32-py2.py3-none-any.whl | |
Collecting jsonschema~=3.0 (from cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/c5/8f/51e89ce52a085483359217bc72cdbf6e75ee595d5b1d4b5ade40c7e018b8/jsonschema-3.2.0-py2.py3-none-any.whl | |
Collecting junit-xml~=1.9 (from cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/2a/93/2d896b5fd3d79b4cadd8882c06650e66d003f465c9d12c488d92853dff78/junit_xml-1.9-py2.py3-none-any.whl | |
Collecting aws-sam-translator>=1.34.0 (from cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/99/76/0c14af2d6ee91022d69851a12454545e49791175c74025a2b9e3ccc2a7af/aws_sam_translator-1.35.0-py3-none-any.whl | |
Collecting networkx~=2.4; python_version >= "3.5" (from cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/9b/cd/dc52755d30ba41c60243235460961fc28022e5b6731f16c268667625baea/networkx-2.5-py3-none-any.whl | |
Collecting future (from aws-xray-sdk!=0.96,>=0.93; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/45/0b/38b06fd9b92dc2b68d58b75f900e97884c45bedd2ff83203d933cf5851c9/future-0.18.2.tar.gz | |
Collecting wrapt (from aws-xray-sdk!=0.96,>=0.93; extra == "all"->moto[all]==2.0.2) | |
Collecting jsonpickle (from aws-xray-sdk!=0.96,>=0.93; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/bb/1a/f2db026d4d682303793559f1c2bb425ba3ec0d6fd7ac63397790443f2461/jsonpickle-2.0.0-py2.py3-none-any.whl | |
Collecting rsa (from python-jose[cryptography]<4.0.0,>=3.1.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/e9/93/0c0f002031f18b53af7a6166103c02b9c0667be528944137cc954ec921b3/rsa-4.7.2-py3-none-any.whl | |
Collecting pyasn1 (from python-jose[cryptography]<4.0.0,>=3.1.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/62/1e/a94a8d635fa3ce4cfc7f506003548d0a2447ae76fd5ca53932970fe3053f/pyasn1-0.4.8-py2.py3-none-any.whl | |
Collecting websocket-client>=0.32.0 (from docker>=2.5.1; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/08/33/80e0d4f60e84a1ddd9a03f340be1065a2a363c47ce65c4bd3bae65ce9631/websocket_client-0.58.0-py2.py3-none-any.whl | |
Collecting pycparser (from cffi>=1.12->cryptography>=3.3.1->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/ae/e7/d9c3a176ca4b02024debf82342dab36efadfc5776f9c8db077e8f6e71821/pycparser-2.20-py2.py3-none-any.whl | |
Collecting jsonpointer>=1.9 (from jsonpatch; python_version != "3.4"->cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/23/52/05f67532aa922e494c351344e0d9624a01f74f5dd8402fe0d1b563a6e6fc/jsonpointer-2.1-py2.py3-none-any.whl | |
Collecting pyrsistent>=0.14.0 (from jsonschema~=3.0->cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Collecting attrs>=17.4.0 (from jsonschema~=3.0->cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/c3/aa/cb45262569fcc047bf070b5de61813724d6726db83259222cd7b4c79821a/attrs-20.3.0-py2.py3-none-any.whl | |
Collecting decorator>=4.3.0 (from networkx~=2.4; python_version >= "3.5"->cfn-lint>=0.4.0; extra == "all"->moto[all]==2.0.2) | |
Using cached https://files.pythonhosted.org/packages/ed/1b/72a1821152d07cf1d8b6fce298aeb06a7eb90f4d6d41acec9861e7cc6df0/decorator-4.4.2-py2.py3-none-any.whl | |
Installing collected packages: urllib3, six, python-dateutil, jmespath, botocore, s3transfer, boto3, pytz, MarkupSafe, Jinja2, more-itertools, idna, certifi, chardet, requests, xmltodict, pycparser, cffi, cryptography, responses, zipp, mock, werkzeug, jsonpointer, jsonpatch, pyrsistent, attrs, jsonschema, junit-xml, PyYAML, aws-sam-translator, decorator, networkx, cfn-lint, future, wrapt, jsonpickle, aws-xray-sdk, ecdsa, sshpubkeys, pyasn1, rsa, python-jose, jsondiff, websocket-client, docker, moto | |
Running setup.py install for future ... done | |
Successfully installed Jinja2-2.11.3 MarkupSafe-1.1.1 PyYAML-5.4.1 attrs-20.3.0 aws-sam-translator-1.35.0 aws-xray-sdk-2.6.0 boto3-1.17.33 botocore-1.20.33 certifi-2020.12.5 cffi-1.14.5 cfn-lint-0.47.2 chardet-4.0.0 cryptography-3.4.6 decorator-4.4.2 docker-4.4.4 ecdsa-0.14.1 future-0.18.2 idna-2.10 jmespath-0.10.0 jsondiff-1.2.0 jsonpatch-1.32 jsonpickle-2.0.0 jsonpointer-2.1 jsonschema-3.2.0 junit-xml-1.9 mock-4.0.3 more-itertools-8.7.0 moto-2.0.2 networkx-2.5 pyasn1-0.4.8 pycparser-2.20 pyrsistent-0.17.3 python-dateutil-2.8.1 python-jose-3.2.0 pytz-2021.1 requests-2.25.1 responses-0.13.1 rsa-4.7.2 s3transfer-0.3.6 six-1.15.0 sshpubkeys-3.3.1 urllib3-1.26.4 websocket-client-0.58.0 werkzeug-1.0.1 wrapt-1.12.1 xmltodict-0.12.0 zipp-3.4.1 | |
WARNING: You are using pip version 19.2.3, however version 21.0.1 is available. | |
You should consider upgrading via the 'pip install --upgrade pip' command. | |
(.venv) CBSEspecter:azul amar$ cat moto-method-not-implemented.py | |
import moto | |
import boto3 | |
import requests | |
import tempfile | |
from botocore.config import Config | |
region = 'us-gov-west-1' | |
bucket_name = 'banana-slugs' | |
test_config = Config(region_name=region) | |
def method_wrapper(func): | |
@moto.mock_sts | |
@moto.mock_s3 | |
def wrapper(self, *args, **kwargs): | |
client = boto3.client('s3', config=test_config) | |
client.create_bucket(Bucket=bucket_name, | |
CreateBucketConfiguration={ | |
'LocationConstraint': region | |
}) | |
return func(self, *args, **kwargs) | |
return wrapper | |
class Foo: | |
@method_wrapper | |
def bar(self): | |
client = boto3.client('s3', config=test_config) | |
file = tempfile.NamedTemporaryFile() | |
file.write(bytes('foobar', 'UTF-8')) | |
client.upload_file(file.name, bucket_name, 'trash-file') | |
presigned_url = client.generate_presigned_url( | |
ClientMethod=client.get_object.__name__, | |
Params={ | |
'Bucket': bucket_name, | |
'Key': 'trash-file', | |
**({'ResponseContentDisposition': f'attachment;filename=bar'}) | |
}) | |
resp = requests.get(presigned_url) | |
print(resp.text) | |
assert resp.status_code == 200 | |
a = Foo() | |
a.bar()(.venv) CBSEspecter:azul amar$ python moto-method-not-implemented.py | |
The method is not implemented | |
Traceback (most recent call last): | |
File "moto-method-not-implemented.py", line 45, in <module> | |
a.bar() | |
File "/Users/amar/dev/hca/azul/.venv/lib/python3.8/site-packages/moto/core/models.py", line 106, in wrapper | |
result = func(*args, **kwargs) | |
File "/Users/amar/dev/hca/azul/.venv/lib/python3.8/site-packages/moto/core/models.py", line 106, in wrapper | |
result = func(*args, **kwargs) | |
File "moto-method-not-implemented.py", line 21, in wrapper | |
return func(self, *args, **kwargs) | |
File "moto-method-not-implemented.py", line 43, in bar | |
assert resp.status_code == 200 | |
AssertionError |
@lucaghera i moved the discussion to getmoto/moto#3790 (comment)
Just want to make it visible for others.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Any luck in fixing this? I'm experiencing a similar issue with presigned post. In my unit tests it seems to depend on the order of execution of some fixtures. Thanks!