def test_disable_python(self, mock_gen_aws_client,
                            mock_get_serialized_lambda_function):
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client

        mock_client.get_function = MagicMock(
            return_value={
                "Configuration": {
                    "FunctionName":
                    "lambdaF",
                    "Runtime":
                    "python3.6",
                    "FunctionArn":
                    "arn:aws:lambda:us-east-2:599817902985:function:lambdaF",
                    "Handler":
                    "sentry_sdk.integrations.init_serverless_sdk.sentry_lambda_handler",
                    "Layers": [
                        {
                            "Arn":
                            "arn:aws:lambda:us-east-2:1234:layer:something-else:2"
                        },
                        {
                            "Arn":
                            "arn:aws:lambda:us-east-2:1234:layer:my-python-layer:34"
                        },
                    ],
                    "Environment": {
                        "Variables": {
                            "SENTRY_INITIAL_HANDLER":
                            "lambda_handler.test_handler",
                            "SENTRY_DSN": self.sentry_dsn,
                            "SENTRY_TRACES_SAMPLE_RATE": "1.0",
                            "OTHER": "hi",
                        }
                    },
                },
            })
        mock_client.update_function_configuration = MagicMock()
        return_value = {
            "name": "lambdaF",
            "runtime": "python3.6",
            "version": -1,
            "outOfDate": False,
            "enabled": False,
        }
        mock_get_serialized_lambda_function.return_value = return_value

        assert self.get_response(action="disable",
                                 target="lambdaF").data == return_value

        mock_client.get_function.assert_called_with(FunctionName="lambdaF")

        mock_client.update_function_configuration.assert_called_with(
            FunctionName="lambdaF",
            Layers=["arn:aws:lambda:us-east-2:1234:layer:something-else:2"],
            Environment={"Variables": {
                "OTHER": "hi"
            }},
            Handler="lambda_handler.test_handler",
        )
示例#2
0
    def test_update_version(self, mock_gen_aws_client,
                            mock_get_serialized_lambda_function):
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client

        mock_client.get_function = MagicMock(
            return_value={
                "Configuration": {
                    "FunctionName":
                    "lambdaD",
                    "Runtime":
                    "nodejs10.x",
                    "FunctionArn":
                    "arn:aws:lambda:us-east-2:599817902985:function:lambdaD",
                    "Layers": [
                        {
                            "Arn":
                            "arn:aws:lambda:us-east-2:1234:layer:something-else:2"
                        },
                        {
                            "Arn":
                            "arn:aws:lambda:us-east-2:1234:layer:my-layer:2"
                        },
                    ],
                    "Environment": {
                        "Variables": {
                            "NODE_OPTIONS": "-r @sentry/serverless/dist/auto",
                            "SENTRY_DSN": self.sentry_dsn,
                            "SENTRY_TRACES_SAMPLE_RATE": "1.0",
                            "OTHER": "hi",
                        }
                    },
                },
            })
        mock_client.update_function_configuration = MagicMock()
        return_value = {
            "name": "lambdaD",
            "runtime": "nodejs10.x",
            "version": 3,
            "outOfDate": False,
            "enabled": True,
        }
        mock_get_serialized_lambda_function.return_value = return_value

        assert self.get_response(action="updateVersion",
                                 target="lambdaD").data == return_value

        mock_client.get_function.assert_called_with(FunctionName="lambdaD")

        mock_client.update_function_configuration.assert_called_with(
            FunctionName="lambdaD",
            Layers=[
                {
                    "Arn":
                    "arn:aws:lambda:us-east-2:1234:layer:something-else:2"
                },
                "arn:aws:lambda:us-east-2:1234:layer:my-layer:3",
            ],
        )
示例#3
0
    def test_lambda_setup_layer_too_many_requests_exception(
        self, mock_react_view, mock_gen_aws_client, mock_get_supported_functions
    ):
        class MockException(Exception):
            pass

        too_many_requests_err = (
            "An error occurred (TooManyRequestsException) when calling the "
            "UpdateFunctionConfiguration operation (reached max retries: 4): "
            "Rate exceeded"
        )
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client
        mock_client.update_function_configuration = MagicMock(
            side_effect=Exception(too_many_requests_err)
        )
        mock_client.describe_account = MagicMock(return_value={"Account": {"Name": "my_name"}})
        mock_client.exceptions = MagicMock()
        mock_client.exceptions.ResourceConflictException = MockException

        mock_get_supported_functions.return_value = [
            {
                "FunctionName": "lambdaB",
                "Runtime": "nodejs10.x",
                "FunctionArn": "arn:aws:lambda:us-east-2:599817902985:function:lambdaB",
            },
        ]

        aws_external_id = "12-323"
        self.pipeline.state.step_index = 2
        self.pipeline.state.data = {
            "region": region,
            "account_number": account_number,
            "aws_external_id": aws_external_id,
            "project_id": self.projectA.id,
        }

        resp = self.client.post(
            self.setup_path,
            {"lambdaB": True},
            format="json",
            HTTP_ACCEPT="application/json",
            headers={"Content-Type": "application/json", "Accept": "application/json"},
        )

        assert resp.status_code == 200
        assert not Integration.objects.filter(provider=self.provider.key).exists()

        failures = [
            {
                "name": "lambdaB",
                "error": "Something went wrong! Please enable function manually after installation",
            }
        ]

        mock_react_view.assert_called_with(
            ANY, "awsLambdaFailureDetails", {"lambdaFunctionFailures": failures, "successCount": 0}
        )
示例#4
0
    def test_lambda_setup_layer_missing_role_error(
        self, mock_react_view, mock_gen_aws_client, mock_get_supported_functions
    ):
        class MockException(Exception):
            pass

        missing_role_err = (
            "An error occurred (InvalidParameterValueException) when "
            "calling the UpdateFunctionConfiguration operation: "
            "The role defined for the function cannot be "
            "assumed by Lambda."
        )
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client
        mock_client.update_function_configuration = MagicMock(
            side_effect=Exception(missing_role_err)
        )
        mock_client.describe_account = MagicMock(return_value={"Account": {"Name": "my_name"}})
        mock_client.exceptions = MagicMock()
        mock_client.exceptions.ResourceConflictException = MockException

        mock_get_supported_functions.return_value = [
            {
                "FunctionName": "lambdaB",
                "Runtime": "nodejs10.x",
                "FunctionArn": "arn:aws:lambda:us-east-2:599817902985:function:lambdaB",
            },
        ]

        aws_external_id = "12-323"
        self.pipeline.state.step_index = 2
        self.pipeline.state.data = {
            "region": region,
            "account_number": account_number,
            "aws_external_id": aws_external_id,
            "project_id": self.projectA.id,
        }

        resp = self.client.post(
            self.setup_path,
            {"lambdaB": True},
            format="json",
            HTTP_ACCEPT="application/json",
            headers={"Content-Type": "application/json", "Accept": "application/json"},
        )

        assert resp.status_code == 200
        assert not Integration.objects.filter(provider=self.provider.key).exists()

        failures = [
            {"name": "lambdaB", "error": "Invalid role associated with the lambda function"}
        ]

        mock_react_view.assert_called_with(
            ANY, "awsLambdaFailureDetails", {"lambdaFunctionFailures": failures, "successCount": 0}
        )
示例#5
0
    def test_lambda_setup_layer_error(
        self, mock_react_view, mock_gen_aws_client, mock_get_supported_functions
    ):
        class MockException(Exception):
            pass

        bad_layer = "arn:aws:lambda:us-east-2:546545:layer:another-layer:5"
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client
        mock_client.update_function_configuration = MagicMock(
            side_effect=Exception(f"Layer version {bad_layer} does not exist")
        )
        mock_client.describe_account = MagicMock(return_value={"Account": {"Name": "my_name"}})
        mock_client.exceptions = MagicMock()
        mock_client.exceptions.ResourceConflictException = MockException

        mock_get_supported_functions.return_value = [
            {
                "FunctionName": "lambdaA",
                "Runtime": "nodejs12.x",
                "FunctionArn": "arn:aws:lambda:us-east-2:599817902985:function:lambdaA",
            },
            {
                "FunctionName": "lambdaB",
                "Runtime": "nodejs10.x",
                "FunctionArn": "arn:aws:lambda:us-east-2:599817902985:function:lambdaB",
            },
        ]

        aws_external_id = "12-323"
        self.pipeline.state.step_index = 2
        self.pipeline.state.data = {
            "region": region,
            "account_number": account_number,
            "aws_external_id": aws_external_id,
            "project_id": self.projectA.id,
        }

        resp = self.client.post(
            self.setup_path,
            {"lambdaB": True},
            format="json",
            HTTP_ACCEPT="application/json",
            headers={"Content-Type": "application/json", "Accept": "application/json"},
        )

        assert resp.status_code == 200
        assert not Integration.objects.filter(provider=self.provider.key).exists()

        failures = [{"name": "lambdaB", "error": "Invalid existing layer another-layer"}]

        mock_react_view.assert_called_with(
            ANY, "awsLambdaFailureDetails", {"lambdaFunctionFailures": failures, "successCount": 0}
        )
示例#6
0
    def test_record_platform_integration_metric(self, add_request_metric_tags):
        @add_integration_platform_metric_tag
        def get(self, request, *args, **kwargs):
            pass

        request = Mock()
        endpoint = Mock(request=request)

        get(endpoint, request)

        add_request_metric_tags.assert_called_with(request, integration_platform=True)
示例#7
0
class GetSupportedFunctionsTest(TestCase):
    mock_client = Mock()
    mock_paginate = MagicMock()
    mock_paginate.paginate = MagicMock(return_value=[
        {
            "Functions": [
                {
                    "FunctionName": "lambdaA",
                    "Runtime": "nodejs12.x"
                },
                {
                    "FunctionName": "lambdaB",
                    "Runtime": "nodejs10.x"
                },
            ]
        },
        {
            "Functions": [
                {
                    "FunctionName": "lambdaC",
                    "Runtime": "nodejs12.x"
                },
                {
                    "FunctionName": "lambdaD",
                    "Runtime": "python3.6"
                },
                {
                    "FunctionName": "lambdaE",
                    "Runtime": "nodejs14.x"
                },
            ]
        },
    ])

    mock_client.get_paginator = MagicMock(return_value=mock_paginate)

    assert get_supported_functions(mock_client) == [
        {
            "FunctionName": "lambdaA",
            "Runtime": "nodejs12.x"
        },
        {
            "FunctionName": "lambdaB",
            "Runtime": "nodejs10.x"
        },
        {
            "FunctionName": "lambdaC",
            "Runtime": "nodejs12.x"
        },
        {
            "FunctionName": "lambdaD",
            "Runtime": "python3.6"
        },
        {
            "FunctionName": "lambdaE",
            "Runtime": "nodejs14.x"
        },
    ]

    mock_client.get_paginator.assert_called_once_with("list_functions")
示例#8
0
    def test_records_default_api_metrics(self, incr):
        request = self.factory.get("/")
        request._view_path = "/"
        response = Mock(status_code=200)

        self.middleware.process_response(request, response)

        incr.assert_called_with(
            "view.response",
            instance=request._view_path,
            tags={
                "method": "GET",
                "status_code": 200
            },
            skip_internal=False,
        )
示例#9
0
    def test_records_default_api_metrics(self, incr):
        request = self.factory.get('/')
        request._view_path = '/'
        response = Mock(status_code=200)

        self.middleware.process_response(request, response)

        incr.assert_called_with(
            'view.response',
            instance=request._view_path,
            tags={
                'method': 'GET',
                'status_code': 200,
            },
            skip_internal=False,
        )
示例#10
0
    def test_records_ui_request(self, incr):
        request = self.factory.get("/")
        request._view_path = "/"
        response = Mock(status_code=200)
        request.COOKIES = {"foo": "bar"}

        self.middleware.process_response(request, response)

        incr.assert_called_with(
            "view.response",
            instance=request._view_path,
            tags={
                "method": "GET",
                "status_code": 200,
                "ui_request": True
            },
            skip_internal=False,
        )
示例#11
0
    def test_records_endpoint_specific_metrics(self, incr):
        request = self.factory.get("/")
        request._view_path = "/"
        request._metric_tags = {"a": "b"}

        response = Mock(status_code=200)

        self.middleware.process_response(request, response)

        incr.assert_called_with(
            "view.response",
            instance=request._view_path,
            tags={
                "method": "GET",
                "status_code": 200,
                "ui_request": False,
                "a": "b"
            },
            skip_internal=False,
        )
示例#12
0
    def test_add_request_metric_tags(self, incr):
        request = self.factory.get("/")
        request._view_path = "/"

        add_request_metric_tags(request, foo="bar")

        response = Mock(status_code=200)

        self.middleware.process_response(request, response)

        incr.assert_called_with(
            "view.response",
            instance=request._view_path,
            tags={
                "method": "GET",
                "status_code": 200,
                "foo": "bar"
            },
            skip_internal=False,
        )
示例#13
0
    def test_simple(self, mock_get_client, mock_get_session):
        arn = (
            "arn:aws:cloudformation:us-west-1:599817902985:stack/"
            "Sentry-Monitoring-Stack-Filter/e42083d0-3e3f-11eb-b66a-0ac9b5db7f30"
        )

        aws_external_id = "124-343"

        mock_client = Mock()
        mock_get_client.return_value = mock_client
        credentials = {
            "AccessKeyId": "my_access_key_id",
            "SecretAccessKey": "my_secret_access_key",
            "SessionToken": "my_session_token",
        }
        mock_client.assume_role = MagicMock(return_value={"Credentials": credentials})

        mock_session = Mock()
        mock_session.client = MagicMock(return_value="expected_output")

        mock_get_session.return_value = mock_session

        assert "expected_output" == gen_aws_client(arn, aws_external_id)

        mock_get_client.assert_called_once_with(
            service_name="sts",
            aws_access_key_id="aws-key-id",
            aws_secret_access_key="aws-secret-access-key",
            region_name="us-east-2",
        )

        role_arn = "arn:aws:iam::599817902985:role/SentryRole"

        mock_client.assume_role.assert_called_once_with(
            RoleSessionName="Sentry", RoleArn=role_arn, ExternalId=aws_external_id
        )

        mock_get_session.assert_called_once_with(
            aws_access_key_id=credentials["AccessKeyId"],
            aws_secret_access_key=credentials["SecretAccessKey"],
            aws_session_token=credentials["SessionToken"],
        )

        mock_session.client.assert_called_once_with(service_name="lambda", region_name="us-west-1")
    def test_enable_python_layer_on_already_enabled(
            self, mock_gen_aws_client, mock_get_serialized_lambda_function):
        """
        Test that ensures that if sentry-sdk is already enabled, then
        re-enabling it should not override the env variables since it could be
        problematic since the SENTRY_INITIAL_HANDLER env variable could be overriden
        the second time with "sentry_sdk.integrations.init_serverless_sdk.
        sentry_lambda_handler" and then disabling the sentry-sdk, would break
        the function because the Handler will be updated with an incorrect
        SENTRY_INITIAL_HANDLER value
        """
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client

        mock_client.get_function = MagicMock(
            return_value={
                "Configuration": {
                    "FunctionName":
                    "lambdaZ",
                    "Runtime":
                    "python3.8",
                    "Handler":
                    "sentry_sdk.integrations.init_serverless_sdk.sentry_lambda_handler",
                    "FunctionArn":
                    "arn:aws:lambda:us-east-2:599817902985:function:lambdaZ",
                    "Layers": [
                        "arn:aws:lambda:us-east-2:1234:layer:something-else:2",
                        "arn:aws:lambda:us-east-2:1234:layer:my-python-layer:34",
                    ],
                    "Environment": {
                        "Variables": {
                            "SENTRY_INITIAL_HANDLER":
                            "lambda_handler.test_handler",
                            "SENTRY_DSN": self.sentry_dsn,
                            "SENTRY_TRACES_SAMPLE_RATE": "1.0",
                        }
                    },
                },
            })
        mock_client.update_function_configuration = MagicMock()
        return_value = {
            "name": "lambdaZ",
            "runtime": "python3.8",
            "version": 3,
            "outOfDate": False,
            "enabled": True,
        }
        mock_get_serialized_lambda_function.return_value = return_value

        assert self.get_response(action="enable",
                                 target="lambdaZ").data == return_value

        mock_client.get_function.assert_called_with(FunctionName="lambdaZ")

        mock_client.update_function_configuration.assert_called_with(
            FunctionName="lambdaZ",
            Layers=[
                "arn:aws:lambda:us-east-2:1234:layer:something-else:2",
                "arn:aws:lambda:us-east-2:1234:layer:my-python-layer:34",
            ],
            Environment={
                "Variables": {
                    "SENTRY_INITIAL_HANDLER": "lambda_handler.test_handler",
                    "SENTRY_DSN": self.sentry_dsn,
                    "SENTRY_TRACES_SAMPLE_RATE": "1.0",
                }
            },
            Handler=
            "sentry_sdk.integrations.init_serverless_sdk.sentry_lambda_handler",
        )
示例#15
0
    def test_lambda_setup_layer_success(self, mock_gen_aws_client,
                                        mock_get_supported_functions):
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client
        mock_client.update_function_configuration = MagicMock()
        mock_client.describe_account = MagicMock(
            return_value={"Account": {
                "Name": "my_name"
            }})

        mock_get_supported_functions.return_value = [
            {
                "FunctionName":
                "lambdaA",
                "Runtime":
                "nodejs12.x",
                "FunctionArn":
                "arn:aws:lambda:us-east-2:599817902985:function:lambdaA",
            },
            {
                "FunctionName":
                "lambdaB",
                "Runtime":
                "nodejs10.x",
                "FunctionArn":
                "arn:aws:lambda:us-east-2:599817902985:function:lambdaB",
            },
        ]

        aws_external_id = "12-323"
        self.pipeline.state.step_index = 2
        self.pipeline.state.data = {
            "arn": arn,
            "aws_external_id": aws_external_id,
            "project_id": self.projectA.id,
        }

        sentry_project_dsn = ProjectKey.get_default(
            project=self.projectA).get_dsn(public=True)

        resp = self.client.post(
            self.setup_path,
            {"lambdaB": True},
            format="json",
            HTTP_ACCEPT="application/json",
            headers={
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
        )

        assert resp.status_code == 200

        mock_client.update_function_configuration.assert_called_with(
            FunctionName="lambdaB",
            Layers=["arn:aws:lambda:us-east-2:1234:layer:my-layer:3"],
            Environment={
                "Variables": {
                    "NODE_OPTIONS": "-r @sentry/serverless/dist/auto",
                    "SENTRY_DSN": sentry_project_dsn,
                    "SENTRY_TRACES_SAMPLE_RATE": "1.0",
                }
            },
        )

        integration = Integration.objects.get(provider=self.provider.key)
        assert integration.name == "my_name us-east-2"
        assert integration.external_id == "599817902985-us-east-2"
        assert integration.metadata == {
            "arn": arn,
            "aws_external_id": aws_external_id
        }
        assert OrganizationIntegration.objects.filter(
            integration=integration, organization=self.organization)
示例#16
0
    def test_python_lambda_setup_layer_success(self, mock_gen_aws_client,
                                               mock_get_supported_functions):
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client
        mock_client.update_function_configuration = MagicMock()
        mock_client.describe_account = MagicMock(
            return_value={"Account": {
                "Name": "my_name"
            }})

        mock_get_supported_functions.return_value = [{
            "FunctionName":
            "lambdaA",
            "Handler":
            "lambda_handler.test_handler",
            "Runtime":
            "python3.6",
            "FunctionArn":
            "arn:aws:lambda:us-east-2:599817902985:function:lambdaA",
        }]

        aws_external_id = "12-323"
        self.pipeline.state.step_index = 2
        self.pipeline.state.data = {
            "region": region,
            "account_number": account_number,
            "aws_external_id": aws_external_id,
            "project_id": self.projectA.id,
        }

        sentry_project_dsn = ProjectKey.get_default(
            project=self.projectA).get_dsn(public=True)

        resp = self.client.post(
            self.setup_path,
            data={"lambdaA": True},
            format="json",
            HTTP_ACCEPT="application/json",
            headers={
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
        )

        assert resp.status_code == 200

        mock_client.update_function_configuration.assert_called_once_with(
            FunctionName="lambdaA",
            Layers=["arn:aws:lambda:us-east-2:1234:layer:my-python-layer:34"],
            Environment={
                "Variables": {
                    "SENTRY_INITIAL_HANDLER": "lambda_handler.test_handler",
                    "SENTRY_DSN": sentry_project_dsn,
                    "SENTRY_TRACES_SAMPLE_RATE": "1.0",
                }
            },
            Handler=
            "sentry_sdk.integrations.init_serverless_sdk.sentry_lambda_handler",
        )

        integration = Integration.objects.get(provider=self.provider.key)
        assert integration.name == "my_name us-east-2"
        assert integration.external_id == "599817902985-us-east-2"
        assert integration.metadata == {
            "region": region,
            "account_number": account_number,
            "aws_external_id": aws_external_id,
        }
        assert OrganizationIntegration.objects.filter(
            integration=integration, organization=self.organization)
示例#17
0
    def test_simple(self, mock_get_client, mock_get_session):
        account_number = "599817902985"
        region = "us-west-1"
        aws_external_id = "124-343"

        mock_client = Mock()
        mock_get_client.return_value = mock_client
        credentials = {
            "AccessKeyId": "my_access_key_id",
            "SecretAccessKey": "my_secret_access_key",
            "SessionToken": "my_session_token",
        }
        mock_client.assume_role = MagicMock(
            return_value={"Credentials": credentials})

        mock_session = Mock()
        mock_session.client = MagicMock(return_value="expected_output")

        mock_get_session.return_value = mock_session

        assert "expected_output" == gen_aws_client(account_number, region,
                                                   aws_external_id)

        mock_get_client.assert_called_once_with(
            service_name="sts",
            aws_access_key_id="aws-key-id",
            aws_secret_access_key="aws-secret-access-key",
            region_name="us-east-2",
        )

        role_arn = "arn:aws:iam::599817902985:role/SentryRole"

        mock_client.assume_role.assert_called_once_with(
            RoleSessionName="Sentry",
            RoleArn=role_arn,
            ExternalId=aws_external_id,
            Policy=json.dumps({
                "Version":
                "2012-10-17",
                "Statement": [
                    {
                        "Effect":
                        "Allow",
                        "Action": [
                            "lambda:UpdateFunctionConfiguration",
                            "lambda:GetFunction"
                        ],
                        "Resource":
                        "arn:aws:lambda:us-west-1:599817902985:function:*",
                    },
                    {
                        "Effect":
                        "Allow",
                        "Action": [
                            "lambda:ListFunctions",
                            "lambda:ListLayerVersions",
                            "lambda:GetLayerVersion",
                            "organizations:DescribeAccount",
                        ],
                        "Resource":
                        "*",
                    },
                ],
            }),
        )

        mock_get_session.assert_called_once_with(
            aws_access_key_id=credentials["AccessKeyId"],
            aws_secret_access_key=credentials["SecretAccessKey"],
            aws_session_token=credentials["SessionToken"],
        )

        mock_session.client.assert_called_once_with(service_name="lambda",
                                                    region_name="us-west-1")
示例#18
0
    def test_lambda_setup_layer_env_vars_limit_exceeded_exception(
            self, mock_react_view, mock_gen_aws_client,
            mock_get_supported_functions):
        class MockException(Exception):
            pass

        env_vars_size_limit_err = (
            "An error occurred (InvalidParameterValueException) when calling the "
            "UpdateFunctionConfiguration operation: Lambda was unable to configure "
            "your environment variables because the environment variables you have "
            "provided exceeded the 4KB limit. String measured: {'MESSAGE':'This is production "
            "environment','TARGET_ENV' :'pre-production','IS_SERVERLESS':'true','STAGE':'pre-prod'"
        )
        mock_client = Mock()
        mock_gen_aws_client.return_value = mock_client
        mock_client.update_function_configuration = MagicMock(
            side_effect=Exception(env_vars_size_limit_err))
        mock_client.describe_account = MagicMock(
            return_value={"Account": {
                "Name": "my_name"
            }})
        mock_client.exceptions = MagicMock()
        mock_client.exceptions.ResourceConflictException = MockException

        mock_get_supported_functions.return_value = [
            {
                "FunctionName":
                "lambdaB",
                "Runtime":
                "nodejs10.x",
                "FunctionArn":
                "arn:aws:lambda:us-east-2:599817902985:function:lambdaB",
            },
        ]

        aws_external_id = "12-323"
        self.pipeline.state.step_index = 2
        self.pipeline.state.data = {
            "region": region,
            "account_number": account_number,
            "aws_external_id": aws_external_id,
            "project_id": self.projectA.id,
        }

        resp = self.client.post(
            self.setup_path,
            {"lambdaB": True},
            format="json",
            HTTP_ACCEPT="application/json",
            headers={
                "Content-Type": "application/json",
                "Accept": "application/json"
            },
        )

        assert resp.status_code == 200
        assert not Integration.objects.filter(
            provider=self.provider.key).exists()

        failures = [{
            "name":
            "lambdaB",
            "error":
            "Environment variables size limit of 4KB was exceeded",
        }]

        mock_react_view.assert_called_with(ANY, "awsLambdaFailureDetails", {
            "lambdaFunctionFailures": failures,
            "successCount": 0
        })