Techdebt: Verify minimum boto3-version, up minimum responses version (#7218)
This commit is contained in:
		
							parent
							
								
									f834d98314
								
							
						
					
					
						commit
						16ba3de855
					
				
							
								
								
									
										6
									
								
								.github/workflows/test_outdated_versions.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										6
									
								
								.github/workflows/test_outdated_versions.yml
									
									
									
									
										vendored
									
									
								
							@ -13,8 +13,9 @@ jobs:
 | 
			
		||||
    strategy:
 | 
			
		||||
      fail-fast: false
 | 
			
		||||
      matrix:
 | 
			
		||||
        botocore: ["--upgrade boto3 botocore", "boto3==1.11.0 botocore==1.14.0"]
 | 
			
		||||
        python-version: [ "3.11" ]
 | 
			
		||||
        responses-version: ["0.13.0", "0.15.0", "0.17.0", "0.19.0", "0.20.0" ]
 | 
			
		||||
        responses-version: ["0.15.0", "0.17.0", "0.19.0", "0.20.0" ]
 | 
			
		||||
        werkzeug-version: ["2.0.1", "2.1.1", "2.2.2"]
 | 
			
		||||
        openapi-spec-validator-version: ["0.5.0"]
 | 
			
		||||
 | 
			
		||||
@ -38,6 +39,7 @@ jobs:
 | 
			
		||||
        pip install flask==${{ matrix.werkzeug-version }}
 | 
			
		||||
        pip install werkzeug==${{ matrix.werkzeug-version }}
 | 
			
		||||
        pip install openapi-spec-validator==${{ matrix.openapi-spec-validator-version }}
 | 
			
		||||
        pip install ${{ matrix.botocore }}
 | 
			
		||||
 | 
			
		||||
    - name: Run tests
 | 
			
		||||
      run: |
 | 
			
		||||
@ -65,6 +67,6 @@ jobs:
 | 
			
		||||
      if: always()
 | 
			
		||||
      uses: actions/upload-artifact@v4
 | 
			
		||||
      with:
 | 
			
		||||
        name: test-${{ matrix.responses-version }}-${{ matrix.werkzeug-version }}-${{ matrix.werkzeug-version }}-${{ matrix.openapi-spec-validator-version }}
 | 
			
		||||
        name: test-${{ matrix.responses-version }}-${{ matrix.werkzeug-version }}-${{ matrix.werkzeug-version }}-${{ matrix.openapi-spec-validator-version }}-${{ matrix.botocore }}
 | 
			
		||||
        path: |
 | 
			
		||||
          serverlogs/*
 | 
			
		||||
 | 
			
		||||
@ -2,18 +2,3 @@ from moto.core.decorator import mock_aws  # noqa  # pylint: disable=unused-impor
 | 
			
		||||
 | 
			
		||||
__title__ = "moto"
 | 
			
		||||
__version__ = "4.2.15.dev"
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
try:
 | 
			
		||||
    # Need to monkey-patch botocore requests back to underlying urllib3 classes
 | 
			
		||||
    from botocore.awsrequest import (  # type: ignore[attr-defined]
 | 
			
		||||
        HTTPConnection,
 | 
			
		||||
        HTTPConnectionPool,
 | 
			
		||||
        HTTPSConnectionPool,
 | 
			
		||||
        VerifiedHTTPSConnection,
 | 
			
		||||
    )
 | 
			
		||||
except ImportError:
 | 
			
		||||
    pass
 | 
			
		||||
else:
 | 
			
		||||
    HTTPSConnectionPool.ConnectionCls = VerifiedHTTPSConnection
 | 
			
		||||
    HTTPConnectionPool.ConnectionCls = HTTPConnection
 | 
			
		||||
 | 
			
		||||
@ -13,5 +13,9 @@ def is_responses_0_17_x() -> bool:
 | 
			
		||||
    return LooseVersion(RESPONSES_VERSION) >= LooseVersion("0.17.0")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def is_werkzeug_2_0_x_or_older() -> bool:
 | 
			
		||||
    return LooseVersion(WERKZEUG_VERSION) < LooseVersion("2.1.0")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def is_werkzeug_2_3_x() -> bool:
 | 
			
		||||
    return LooseVersion(WERKZEUG_VERSION) >= LooseVersion("2.3.0")
 | 
			
		||||
 | 
			
		||||
@ -27,13 +27,13 @@ project_urls =
 | 
			
		||||
python_requires = >=3.8
 | 
			
		||||
install_requires =
 | 
			
		||||
    boto3>=1.9.201
 | 
			
		||||
    botocore>=1.13.46
 | 
			
		||||
    botocore>=1.14.0
 | 
			
		||||
    cryptography>=3.3.1
 | 
			
		||||
    requests>=2.5
 | 
			
		||||
    xmltodict
 | 
			
		||||
    werkzeug>=0.5,!=2.2.0,!=2.2.1
 | 
			
		||||
    python-dateutil<3.0.0,>=2.1
 | 
			
		||||
    responses>=0.13.0
 | 
			
		||||
    responses>=0.15.0
 | 
			
		||||
    Jinja2>=2.10.1
 | 
			
		||||
package_dir =
 | 
			
		||||
    moto = moto
 | 
			
		||||
 | 
			
		||||
@ -2,6 +2,7 @@ import base64
 | 
			
		||||
import hashlib
 | 
			
		||||
import json
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
from unittest import SkipTest, mock
 | 
			
		||||
from uuid import uuid4
 | 
			
		||||
 | 
			
		||||
@ -12,6 +13,7 @@ from freezegun import freeze_time
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws, settings
 | 
			
		||||
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
from tests.test_ecr.test_ecr_helpers import _create_image_manifest
 | 
			
		||||
 | 
			
		||||
from . import lambda_aws_verified
 | 
			
		||||
@ -28,6 +30,8 @@ PYTHON_VERSION = "python3.11"
 | 
			
		||||
LAMBDA_FUNC_NAME = "test"
 | 
			
		||||
_lambda_region = "us-west-2"
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock.patch.dict("os.environ", {"MOTO_ENABLE_ISO_REGIONS": "true"})
 | 
			
		||||
@pytest.mark.parametrize("region", ["us-west-2", "cn-northwest-1", "us-isob-east-1"])
 | 
			
		||||
@ -35,6 +39,8 @@ _lambda_region = "us-west-2"
 | 
			
		||||
def test_lambda_regions(region):
 | 
			
		||||
    if not settings.TEST_DECORATOR_MODE:
 | 
			
		||||
        raise SkipTest("Can only set EnvironVars in DecoratorMode")
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("ISO-region not available in older versions")
 | 
			
		||||
    client = boto3.client("lambda", region_name=region)
 | 
			
		||||
    resp = client.list_functions()
 | 
			
		||||
    assert resp["ResponseMetadata"]["HTTPStatusCode"] == 200
 | 
			
		||||
@ -43,6 +49,8 @@ def test_lambda_regions(region):
 | 
			
		||||
@pytest.mark.aws_verified
 | 
			
		||||
@lambda_aws_verified
 | 
			
		||||
def test_list_functions(iam_role_arn=None):
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    sts = boto3.client("sts", "eu-west-2")
 | 
			
		||||
    account_id = sts.get_caller_identity()["Account"]
 | 
			
		||||
 | 
			
		||||
@ -70,7 +78,9 @@ def test_list_functions(iam_role_arn=None):
 | 
			
		||||
    func_list = conn.list_functions()["Functions"]
 | 
			
		||||
    our_functions = [f for f in func_list if f["FunctionName"] == function_name]
 | 
			
		||||
    assert len(our_functions) == 1
 | 
			
		||||
    assert our_functions[0]["PackageType"] == "Zip"
 | 
			
		||||
    if LooseVersion(boto3_version) > LooseVersion("1.29.0"):
 | 
			
		||||
        # PackageType only available in new versions
 | 
			
		||||
        assert our_functions[0]["PackageType"] == "Zip"
 | 
			
		||||
 | 
			
		||||
    # FunctionVersion=ALL means we should get a list of all versions
 | 
			
		||||
    full_list = conn.list_functions(FunctionVersion="ALL")["Functions"]
 | 
			
		||||
@ -127,6 +137,8 @@ def test_create_based_on_s3_with_missing_bucket():
 | 
			
		||||
@mock_aws
 | 
			
		||||
@freeze_time("2015-01-01 00:00:00")
 | 
			
		||||
def test_create_function_from_aws_bucket():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    bucket_name = str(uuid4())
 | 
			
		||||
    s3_conn = boto3.client("s3", _lambda_region)
 | 
			
		||||
    s3_conn.create_bucket(
 | 
			
		||||
@ -169,6 +181,8 @@ def test_create_function_from_aws_bucket():
 | 
			
		||||
@mock_aws
 | 
			
		||||
@freeze_time("2015-01-01 00:00:00")
 | 
			
		||||
def test_create_function_from_zipfile():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    conn = boto3.client("lambda", _lambda_region)
 | 
			
		||||
    zip_content = get_test_zip_file1()
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
@ -218,6 +232,8 @@ def test_create_function_from_zipfile():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_function_from_image():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    conn = boto3.client("lambda", _lambda_region)
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    image_uri = f"{ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/testlambdaecr:prod"
 | 
			
		||||
@ -237,9 +253,6 @@ def test_create_function_from_image():
 | 
			
		||||
        Description="test lambda function",
 | 
			
		||||
        ImageConfig=image_config,
 | 
			
		||||
        PackageType="Image",
 | 
			
		||||
        Timeout=3,
 | 
			
		||||
        MemorySize=128,
 | 
			
		||||
        Publish=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    result = conn.get_function(FunctionName=function_name)
 | 
			
		||||
@ -250,6 +263,8 @@ def test_create_function_from_image():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_function_from_image_default_working_directory():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    conn = boto3.client("lambda", _lambda_region)
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    image_uri = f"{ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/testlambdaecr:prod"
 | 
			
		||||
@ -268,9 +283,6 @@ def test_create_function_from_image_default_working_directory():
 | 
			
		||||
        Description="test lambda function",
 | 
			
		||||
        ImageConfig=image_config,
 | 
			
		||||
        PackageType="Image",
 | 
			
		||||
        Timeout=3,
 | 
			
		||||
        MemorySize=128,
 | 
			
		||||
        Publish=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    result = conn.get_function(FunctionName=function_name)
 | 
			
		||||
@ -281,6 +293,8 @@ def test_create_function_from_image_default_working_directory():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_function_error_bad_architecture():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    conn = boto3.client("lambda", _lambda_region)
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    image_uri = f"{ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/testlambdaecr:prod"
 | 
			
		||||
@ -291,10 +305,6 @@ def test_create_function_error_bad_architecture():
 | 
			
		||||
            FunctionName=function_name,
 | 
			
		||||
            Role=get_role_name(),
 | 
			
		||||
            Code={"ImageUri": image_uri},
 | 
			
		||||
            Description="test lambda function",
 | 
			
		||||
            Timeout=3,
 | 
			
		||||
            MemorySize=128,
 | 
			
		||||
            Publish=True,
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
    err = exc.value.response
 | 
			
		||||
@ -310,6 +320,8 @@ def test_create_function_error_bad_architecture():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_function_error_ephemeral_too_big():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    conn = boto3.client("lambda", _lambda_region)
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    image_uri = f"{ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/testlambdaecr:prod"
 | 
			
		||||
@ -405,6 +417,8 @@ def ecr_repo_fixture():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_function_from_stubbed_ecr():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    lambda_client = boto3.client("lambda", "us-east-1")
 | 
			
		||||
    fn_name = str(uuid4())[0:6]
 | 
			
		||||
    image_uri = "111122223333.dkr.ecr.us-east-1.amazonaws.com/testlambda:latest"
 | 
			
		||||
@ -440,6 +454,8 @@ def test_create_function_from_stubbed_ecr():
 | 
			
		||||
def test_create_function_from_mocked_ecr_image_tag(
 | 
			
		||||
    with_ecr_mock,
 | 
			
		||||
):  # pylint: disable=unused-argument
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    if not settings.TEST_DECORATOR_MODE:
 | 
			
		||||
        raise SkipTest(
 | 
			
		||||
            "Envars not easily set in server mode, feature off by default, skipping..."
 | 
			
		||||
@ -482,6 +498,8 @@ def test_create_function_from_mocked_ecr_image_tag(
 | 
			
		||||
def test_create_function_from_mocked_ecr_image_digest(
 | 
			
		||||
    with_ecr_mock,
 | 
			
		||||
):  # pylint: disable=unused-argument
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    if not settings.TEST_DECORATOR_MODE:
 | 
			
		||||
        raise SkipTest(
 | 
			
		||||
            "Envars not easily set in server mode, feature off by default, skipping..."
 | 
			
		||||
@ -509,6 +527,8 @@ def test_create_function_from_mocked_ecr_image_digest(
 | 
			
		||||
def test_create_function_from_mocked_ecr_missing_image(
 | 
			
		||||
    with_ecr_mock,
 | 
			
		||||
):  # pylint: disable=unused-argument
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    if not settings.TEST_DECORATOR_MODE:
 | 
			
		||||
        raise SkipTest(
 | 
			
		||||
            "Envars not easily set in server mode, feature off by default, skipping..."
 | 
			
		||||
@ -696,6 +716,8 @@ def test_get_function_configuration(key):
 | 
			
		||||
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_get_function_code_signing_config(key):
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    bucket_name = str(uuid4())
 | 
			
		||||
    s3_conn = boto3.client("s3", _lambda_region)
 | 
			
		||||
    s3_conn.create_bucket(
 | 
			
		||||
@ -929,6 +951,8 @@ def test_list_create_list_get_delete_list():
 | 
			
		||||
    test `list -> create -> list -> get -> delete -> list` integration
 | 
			
		||||
 | 
			
		||||
    """
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    bucket_name = str(uuid4())
 | 
			
		||||
    s3_conn = boto3.client("s3", _lambda_region)
 | 
			
		||||
    s3_conn.create_bucket(
 | 
			
		||||
@ -1055,9 +1079,6 @@ def test_get_function_created_with_zipfile():
 | 
			
		||||
        Handler="lambda_function.handler",
 | 
			
		||||
        Code={"ZipFile": zip_content},
 | 
			
		||||
        Description="test lambda function",
 | 
			
		||||
        Timeout=3,
 | 
			
		||||
        MemorySize=128,
 | 
			
		||||
        Publish=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    response = conn.get_function(FunctionName=function_name)
 | 
			
		||||
@ -1503,6 +1524,8 @@ def test_update_function_s3():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_update_function_ecr():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    conn = boto3.client("lambda", _lambda_region)
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    image_uri = f"{ACCOUNT_ID}.dkr.ecr.us-east-1.amazonaws.com/testlambdaecr:prod"
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,5 @@
 | 
			
		||||
import sys
 | 
			
		||||
from unittest import SkipTest
 | 
			
		||||
from uuid import uuid4
 | 
			
		||||
 | 
			
		||||
import boto3
 | 
			
		||||
@ -5,15 +7,20 @@ import pytest
 | 
			
		||||
from botocore.exceptions import ClientError
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
 | 
			
		||||
from .utilities import get_role_name, get_test_zip_file1
 | 
			
		||||
 | 
			
		||||
PYTHON_VERSION = "python3.11"
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
 | 
			
		||||
def test_create_function_url_config(key):
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    client = boto3.client("lambda", "us-east-2")
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    fxn = client.create_function(
 | 
			
		||||
@ -40,6 +47,8 @@ def test_create_function_url_config(key):
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_function_url_config_with_cors():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    client = boto3.client("lambda", "us-east-2")
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    fxn = client.create_function(
 | 
			
		||||
@ -75,6 +84,8 @@ def test_create_function_url_config_with_cors():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_update_function_url_config_with_cors():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    client = boto3.client("lambda", "us-east-2")
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    fxn = client.create_function(
 | 
			
		||||
@ -108,6 +119,8 @@ def test_update_function_url_config_with_cors():
 | 
			
		||||
@mock_aws
 | 
			
		||||
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
 | 
			
		||||
def test_delete_function_url_config(key):
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    client = boto3.client("lambda", "us-east-2")
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
    fxn = client.create_function(
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,5 @@
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
from unittest import SkipTest, mock
 | 
			
		||||
from uuid import uuid4
 | 
			
		||||
 | 
			
		||||
@ -9,12 +10,15 @@ from freezegun import freeze_time
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws, settings
 | 
			
		||||
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
 | 
			
		||||
from .utilities import get_role_name, get_test_zip_file1
 | 
			
		||||
 | 
			
		||||
PYTHON_VERSION = "python3.11"
 | 
			
		||||
_lambda_region = "us-west-2"
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_publish_lambda_layers__without_content():
 | 
			
		||||
@ -50,6 +54,8 @@ def test_publish_layer_with_unknown_s3_file():
 | 
			
		||||
@mock_aws
 | 
			
		||||
@freeze_time("2015-01-01 00:00:00")
 | 
			
		||||
def test_get_lambda_layers():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    bucket_name = str(uuid4())
 | 
			
		||||
    s3_conn = boto3.client("s3", _lambda_region)
 | 
			
		||||
    s3_conn.create_bucket(
 | 
			
		||||
@ -152,6 +158,8 @@ def test_get_lambda_layers():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_get_layer_version():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    bucket_name = str(uuid4())
 | 
			
		||||
    s3_conn = boto3.client("s3", _lambda_region)
 | 
			
		||||
    s3_conn.create_bucket(
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,6 @@
 | 
			
		||||
import json
 | 
			
		||||
import sys
 | 
			
		||||
from unittest import SkipTest
 | 
			
		||||
from uuid import uuid4
 | 
			
		||||
 | 
			
		||||
import boto3
 | 
			
		||||
@ -7,12 +9,15 @@ from botocore.exceptions import ClientError
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws
 | 
			
		||||
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
 | 
			
		||||
from .utilities import get_role_name, get_test_zip_file1, get_test_zip_file2
 | 
			
		||||
 | 
			
		||||
PYTHON_VERSION = "python3.11"
 | 
			
		||||
_lambda_region = "us-west-2"
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.mark.parametrize("key", ["FunctionName", "FunctionArn"])
 | 
			
		||||
@mock_aws
 | 
			
		||||
@ -51,6 +56,8 @@ def test_add_function_permission(key):
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_add_permission_with_principalorgid():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    conn = boto3.client("lambda", _lambda_region)
 | 
			
		||||
    zip_content = get_test_zip_file1()
 | 
			
		||||
    function_name = str(uuid4())[0:6]
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,7 @@
 | 
			
		||||
import copy
 | 
			
		||||
import json
 | 
			
		||||
import os
 | 
			
		||||
import sys
 | 
			
		||||
from collections import OrderedDict
 | 
			
		||||
from datetime import datetime, timedelta, timezone
 | 
			
		||||
from unittest import SkipTest
 | 
			
		||||
@ -12,11 +13,14 @@ from botocore.exceptions import ClientError
 | 
			
		||||
from moto import mock_aws, settings
 | 
			
		||||
from moto.cloudformation import cloudformation_backends
 | 
			
		||||
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
from tests import EXAMPLE_AMI_ID
 | 
			
		||||
 | 
			
		||||
TEST_STACK_NAME = "test_stack"
 | 
			
		||||
REGION_NAME = "us-east-1"
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
dummy_template = {
 | 
			
		||||
    "AWSTemplateFormatVersion": "2010-09-09",
 | 
			
		||||
    "Description": "Stack 1",
 | 
			
		||||
@ -367,7 +371,9 @@ def test_describe_stack_instances():
 | 
			
		||||
    for instance in [use1_instance, usw2_instance]:
 | 
			
		||||
        assert instance["Account"] == ACCOUNT_ID
 | 
			
		||||
        assert instance["Status"] == "CURRENT"
 | 
			
		||||
        assert instance["StackInstanceStatus"] == {"DetailedStatus": "SUCCEEDED"}
 | 
			
		||||
        if LooseVersion(boto3_version) > LooseVersion("1.29.0"):
 | 
			
		||||
            # "Parameters only available in newer versions"
 | 
			
		||||
            assert instance["StackInstanceStatus"] == {"DetailedStatus": "SUCCEEDED"}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
@ -1615,6 +1621,8 @@ def test_delete_change_set():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_change_set_twice__no_changes():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    cf_client = boto3.client("cloudformation", region_name=REGION_NAME)
 | 
			
		||||
 | 
			
		||||
    # Execute once
 | 
			
		||||
@ -1646,6 +1654,8 @@ def test_create_change_set_twice__no_changes():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_change_set_twice__using_s3__no_changes():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameters only available in newer versions")
 | 
			
		||||
    cf_client = boto3.client("cloudformation", region_name=REGION_NAME)
 | 
			
		||||
    s3 = boto3.client("s3", region_name=REGION_NAME)
 | 
			
		||||
    s3_conn = boto3.resource("s3", region_name=REGION_NAME)
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,6 @@
 | 
			
		||||
import io
 | 
			
		||||
import json
 | 
			
		||||
import sys
 | 
			
		||||
import zipfile
 | 
			
		||||
from decimal import Decimal
 | 
			
		||||
from string import Template
 | 
			
		||||
@ -10,10 +11,13 @@ from botocore.exceptions import ClientError
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws
 | 
			
		||||
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
from tests import EXAMPLE_AMI_ID, EXAMPLE_AMI_ID2
 | 
			
		||||
from tests.markers import requires_docker
 | 
			
		||||
from tests.test_cloudformation.fixtures import fn_join, single_instance_with_ebs_volume
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_template_without_required_param_boto3():
 | 
			
		||||
@ -274,18 +278,19 @@ def lambda_handler(event, context):
 | 
			
		||||
    lambda_conn = boto3.client("lambda", region)
 | 
			
		||||
    result = lambda_conn.list_layers()
 | 
			
		||||
    layer_name = result["Layers"][0]["LayerName"]
 | 
			
		||||
    result = lambda_conn.list_layer_versions(LayerName=layer_name)
 | 
			
		||||
    result["LayerVersions"][0].pop("CreatedDate")
 | 
			
		||||
    assert result["LayerVersions"] == [
 | 
			
		||||
        {
 | 
			
		||||
            "Version": 1,
 | 
			
		||||
            "LayerVersionArn": f"arn:aws:lambda:{region}:{ACCOUNT_ID}:layer:{layer_name}:1",
 | 
			
		||||
            "CompatibleRuntimes": ["python2.7", "python3.6"],
 | 
			
		||||
            "Description": "Test Layer",
 | 
			
		||||
            "LicenseInfo": "MIT",
 | 
			
		||||
            "CompatibleArchitectures": [],
 | 
			
		||||
        }
 | 
			
		||||
    ]
 | 
			
		||||
    lv = lambda_conn.list_layer_versions(LayerName=layer_name)["LayerVersions"][0]
 | 
			
		||||
 | 
			
		||||
    assert lv["Version"] == 1
 | 
			
		||||
    assert (
 | 
			
		||||
        lv["LayerVersionArn"]
 | 
			
		||||
        == f"arn:aws:lambda:{region}:{ACCOUNT_ID}:layer:{layer_name}:1"
 | 
			
		||||
    )
 | 
			
		||||
    assert lv["CompatibleRuntimes"] == ["python2.7", "python3.6"]
 | 
			
		||||
    assert lv["Description"] == "Test Layer"
 | 
			
		||||
    assert lv["LicenseInfo"] == "MIT"
 | 
			
		||||
    if LooseVersion(boto3_version) > LooseVersion("1.29.0"):
 | 
			
		||||
        # "Parameters only available in newer versions"
 | 
			
		||||
        assert lv["CompatibleArchitectures"] == []
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,7 @@
 | 
			
		||||
import json
 | 
			
		||||
import sys
 | 
			
		||||
from typing import Any, Dict, Optional
 | 
			
		||||
from unittest import SkipTest
 | 
			
		||||
from uuid import uuid4
 | 
			
		||||
 | 
			
		||||
import boto3
 | 
			
		||||
@ -9,6 +11,9 @@ from botocore.exceptions import ClientError
 | 
			
		||||
from moto import mock_aws
 | 
			
		||||
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | 
			
		||||
from moto.core import set_initial_no_auth_action_count
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
@ -191,6 +196,8 @@ def test_invalid_client_token_id() -> None:
 | 
			
		||||
@set_initial_no_auth_action_count(0)
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_auth_failure() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    client = boto3.client(
 | 
			
		||||
        "ec2",
 | 
			
		||||
        region_name="us-east-1",
 | 
			
		||||
@ -230,6 +237,8 @@ def test_signature_does_not_match() -> None:
 | 
			
		||||
@set_initial_no_auth_action_count(2)
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_auth_failure_with_valid_access_key_id() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    access_key = create_user_with_access_key()
 | 
			
		||||
    client = boto3.client(
 | 
			
		||||
        "ec2",
 | 
			
		||||
@ -250,6 +259,8 @@ def test_auth_failure_with_valid_access_key_id() -> None:
 | 
			
		||||
@set_initial_no_auth_action_count(2)
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_access_denied_with_no_policy() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    user_name = "test-user"
 | 
			
		||||
    access_key = create_user_with_access_key(user_name)
 | 
			
		||||
    client = boto3.client(
 | 
			
		||||
@ -271,6 +282,8 @@ def test_access_denied_with_no_policy() -> None:
 | 
			
		||||
@set_initial_no_auth_action_count(3)
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_access_denied_with_not_allowing_policy() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    user_name = "test-user"
 | 
			
		||||
    inline_policy_document = {
 | 
			
		||||
        "Version": "2012-10-17",
 | 
			
		||||
@ -339,6 +352,8 @@ def test_access_denied_explicitly_on_specific_resource() -> None:
 | 
			
		||||
@set_initial_no_auth_action_count(3)
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_access_denied_for_run_instances() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    # https://github.com/getmoto/moto/issues/2774
 | 
			
		||||
    # The run-instances method was broken between botocore versions 1.15.8 and 1.15.12
 | 
			
		||||
    # This was due to the inclusion of '"idempotencyToken":true' in the response, somehow altering the signature and breaking the authentication
 | 
			
		||||
@ -372,6 +387,8 @@ def test_access_denied_for_run_instances() -> None:
 | 
			
		||||
@set_initial_no_auth_action_count(3)
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_access_denied_with_denying_policy() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    user_name = "test-user"
 | 
			
		||||
    inline_policy_document = {
 | 
			
		||||
        "Version": "2012-10-17",
 | 
			
		||||
@ -533,6 +550,8 @@ def test_s3_access_denied_with_denying_inline_group_policy() -> None:
 | 
			
		||||
@set_initial_no_auth_action_count(10)
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_access_denied_with_many_irrelevant_policies() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    user_name = "test-user"
 | 
			
		||||
    inline_policy_document = {
 | 
			
		||||
        "Version": "2012-10-17",
 | 
			
		||||
 | 
			
		||||
@ -3,11 +3,16 @@
 | 
			
		||||
#
 | 
			
		||||
# There are some issues with running these tests in parallel
 | 
			
		||||
# Running them as part of 'moto/core' avoids that problem
 | 
			
		||||
import sys
 | 
			
		||||
 | 
			
		||||
import boto3
 | 
			
		||||
import pytest
 | 
			
		||||
from botocore.exceptions import ClientError
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
@ -103,9 +108,11 @@ def test_describe_vpc_default_endpoint_services() -> None:
 | 
			
		||||
    assert details["ManagesVpcEndpoints"] is False
 | 
			
		||||
    assert details["Owner"] == "amazon"
 | 
			
		||||
    assert details["PrivateDnsName"] == "config.us-west-1.amazonaws.com"
 | 
			
		||||
    assert details["PrivateDnsNames"] == [
 | 
			
		||||
        {"PrivateDnsName": "config.us-west-1.amazonaws.com"}
 | 
			
		||||
    ]
 | 
			
		||||
    if LooseVersion(boto3_version) > LooseVersion("1.29.0"):
 | 
			
		||||
        # Attribute wasn't available in older botocore versions
 | 
			
		||||
        assert details["PrivateDnsNames"] == [
 | 
			
		||||
            {"PrivateDnsName": "config.us-west-1.amazonaws.com"}
 | 
			
		||||
        ]
 | 
			
		||||
    assert details["PrivateDnsNameVerificationState"] == "verified"
 | 
			
		||||
    assert details["ServiceName"] == "com.amazonaws.us-west-1.config"
 | 
			
		||||
    assert details["ServiceType"] == [{"ServiceType": "Interface"}]
 | 
			
		||||
 | 
			
		||||
@ -1,3 +1,4 @@
 | 
			
		||||
import sys
 | 
			
		||||
from typing import Any, List
 | 
			
		||||
from unittest import SkipTest
 | 
			
		||||
 | 
			
		||||
@ -5,6 +6,9 @@ import boto3
 | 
			
		||||
import pytest
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws, settings
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@pytest.fixture(scope="function", name="aws_credentials")
 | 
			
		||||
@ -70,6 +74,8 @@ def test_mock_works_with_resource_created_outside(
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_patch_can_be_called_on_a_mocked_client() -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    # start S3 after the mock, ensuring that the client contains our event-handler
 | 
			
		||||
    m = mock_aws()
 | 
			
		||||
    m.start()
 | 
			
		||||
@ -118,6 +124,8 @@ class ImportantBusinessLogic:
 | 
			
		||||
def test_mock_works_when_replacing_client(
 | 
			
		||||
    aws_credentials: Any,  # pylint: disable=unused-argument
 | 
			
		||||
) -> None:
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Error handling is different in newer versions")
 | 
			
		||||
    logic = ImportantBusinessLogic()
 | 
			
		||||
 | 
			
		||||
    m = mock_aws()
 | 
			
		||||
 | 
			
		||||
@ -8,11 +8,16 @@ import requests
 | 
			
		||||
from botocore.exceptions import ClientError
 | 
			
		||||
 | 
			
		||||
from moto import mock_aws, settings
 | 
			
		||||
from moto.core.versions import is_werkzeug_2_0_x_or_older
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def test_passthrough_calls_for_entire_service() -> None:
 | 
			
		||||
    if not settings.TEST_DECORATOR_MODE:
 | 
			
		||||
        raise SkipTest("Can only test config when using decorators")
 | 
			
		||||
    if is_werkzeug_2_0_x_or_older():
 | 
			
		||||
        raise SkipTest(
 | 
			
		||||
            "Bug in old werkzeug versions where headers with byte-values throw errors"
 | 
			
		||||
        )
 | 
			
		||||
    # Still mock the credentials ourselves, we don't want to reach out to AWS for real
 | 
			
		||||
    with patch.dict(
 | 
			
		||||
        os.environ, {"AWS_ACCESS_KEY_ID": "a", "AWS_SECRET_ACCESS_KEY": "b"}
 | 
			
		||||
@ -50,6 +55,10 @@ def test_passthrough_calls_for_entire_service() -> None:
 | 
			
		||||
def test_passthrough_calls_for_specific_url() -> None:
 | 
			
		||||
    if not settings.TEST_DECORATOR_MODE:
 | 
			
		||||
        raise SkipTest("Can only test config when using decorators")
 | 
			
		||||
    if is_werkzeug_2_0_x_or_older():
 | 
			
		||||
        raise SkipTest(
 | 
			
		||||
            "Bug in old werkzeug versions where headers with byte-values throw errors"
 | 
			
		||||
        )
 | 
			
		||||
    # Still mock the credentials ourselves, we don't want to reach out to AWS for real
 | 
			
		||||
    with patch.dict(
 | 
			
		||||
        os.environ, {"AWS_ACCESS_KEY_ID": "a", "AWS_SECRET_ACCESS_KEY": "b"}
 | 
			
		||||
@ -135,9 +144,9 @@ def test_passthrough__using_unsupported_service() -> None:
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        ):
 | 
			
		||||
            b2bi = boto3.client("b2bi", "us-east-1")
 | 
			
		||||
            workdocs = boto3.client("workdocs", "us-east-1")
 | 
			
		||||
            with pytest.raises(ClientError) as exc:
 | 
			
		||||
                b2bi.list_transformers()
 | 
			
		||||
                workdocs.describe_users()
 | 
			
		||||
            assert "Not yet implemented" in str(exc.value)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1,4 +1,6 @@
 | 
			
		||||
import json
 | 
			
		||||
import sys
 | 
			
		||||
from unittest import SkipTest
 | 
			
		||||
 | 
			
		||||
import boto3
 | 
			
		||||
import pytest
 | 
			
		||||
@ -7,6 +9,9 @@ from botocore.exceptions import ClientError
 | 
			
		||||
import moto.iotdata.models
 | 
			
		||||
from moto import mock_aws, settings
 | 
			
		||||
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
 | 
			
		||||
from moto.utilities.distutils_version import LooseVersion
 | 
			
		||||
 | 
			
		||||
boto3_version = sys.modules["botocore"].__version__
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
@ -94,6 +99,8 @@ def test_update():
 | 
			
		||||
 | 
			
		||||
@mock_aws
 | 
			
		||||
def test_create_named_shadows():
 | 
			
		||||
    if LooseVersion(boto3_version) < LooseVersion("1.29.0"):
 | 
			
		||||
        raise SkipTest("Parameter only available in newer versions")
 | 
			
		||||
    iot_client = boto3.client("iot", region_name="ap-northeast-1")
 | 
			
		||||
    client = boto3.client("iot-data", region_name="ap-northeast-1")
 | 
			
		||||
    thing_name = "my-thing"
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user