Exemplo n.º 1
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")
    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",
        )
Exemplo n.º 3
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",
            ],
        )
Exemplo n.º 4
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}
        )
Exemplo n.º 5
0
    def _stub_github(self):
        responses.reset()

        sentry.integrations.github.integration.get_jwt = MagicMock(
            return_value="jwt_token_1")
        sentry.integrations.github.client.get_jwt = MagicMock(
            return_value="jwt_token_1")

        responses.add(
            responses.POST,
            self.base_url +
            "/installations/{}/access_tokens".format(self.installation_id),
            json={
                "token": self.access_token,
                "expires_at": self.expires_at
            },
        )

        responses.add(
            responses.GET,
            self.base_url + "/installation/repositories",
            json={
                "repositories": [
                    {
                        "id": 1296269,
                        "name": "foo",
                        "full_name": "Test-Organization/foo"
                    },
                    {
                        "id": 9876574,
                        "name": "bar",
                        "full_name": "Test-Organization/bar"
                    },
                ]
            },
        )

        responses.add(
            responses.GET,
            self.base_url +
            "/app/installations/{}".format(self.installation_id),
            json={
                "id": self.installation_id,
                "app_id": self.app_id,
                "account": {
                    "login": "******",
                    "avatar_url": "http://example.com/avatar.png",
                    "html_url": "https://github.com/Test-Organization",
                    "type": "Organization",
                },
            },
        )

        responses.add(responses.GET,
                      self.base_url + "/repos/Test-Organization/foo/hooks",
                      json=[])
Exemplo n.º 6
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}
        )
Exemplo n.º 7
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}
        )
Exemplo n.º 8
0
    def test_retry_file_open(self) -> None:
        project = self.project

        release = Release.objects.create(
            organization_id=project.organization_id, version="abc")
        release.add_project(project)

        content = b"foo"

        file = File.objects.create(
            name="file.min.js",
            type="release.file",
            headers={"Content-Type": "application/json; charset=utf-8"},
        )
        file.putfile(BytesIO(content))

        ReleaseFile.objects.create(
            name=file.name,
            release=release,
            organization_id=project.organization_id,
            file=file,
        )

        stale_file_error = OSError()
        stale_file_error.errno = errno.ESTALE

        bad_file = MagicMock()
        bad_file.chunks.side_effect = stale_file_error

        bad_file_reader = MagicMock()
        bad_file_reader.__enter__.return_value = bad_file

        good_file = MagicMock()
        good_file.chunks.return_value = iter([content])

        good_file_reader = MagicMock()
        good_file_reader.__enter__.return_value = good_file

        with patch(
                "sentry.lang.javascript.processor.ReleaseFile.cache") as cache:
            cache.getfile.side_effect = [bad_file_reader, good_file_reader]

            assert fetch_release_file(file.name, release) == http.UrlResult(
                file.name,
                {k.lower(): v.lower()
                 for k, v in file.headers.items()},
                content,
                200,
                "utf-8",
            )

        assert bad_file.chunks.call_count == 1
        assert good_file.chunks.call_count == 1
    def test_includes_v2_plugins(self):
        group = self.create_group()
        result = self.TEMPLATE.render(context={"group": group},
                                      request=MagicMock())

        assert f"<span>Example Tag - http://example.com?id={group.id}</span>" in result
        assert "<span>Example Two - None</span>" in result
Exemplo n.º 10
0
    def test_includes_v2_plugins(self):
        group = self.create_group()
        result = self.TEMPLATE.render(context={"group": group},
                                      request=MagicMock())

        assert "<span>Example Action - http://example.com?id=%s</span>" % (
            group.id, ) in result
Exemplo n.º 11
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")
Exemplo n.º 12
0
    def test_applies_correctly(self):
        event = self.get_event()

        plugin = MagicMock()
        rule = self.get_rule()
        rule.get_plugins = lambda: (LegacyPluginService(plugin), )

        results = list(rule.after(event=event, state=self.get_state()))

        assert len(results) == 1
        assert plugin.should_notify.call_count == 1
        assert results[0].callback is plugin.rule_notify
Exemplo n.º 13
0
    def test_audits(self, create_audit_entry):
        InternalCreator.run(
            name="nulldb",
            user=self.user,
            author="Sentry",
            organization=self.org,
            scopes=("project:read",),
            webhook_url="http://example.com",
            schema={"elements": [self.create_issue_link_schema()]},
            request=MagicMock(),
        )

        call = faux(create_audit_entry)
        assert call.kwarg_equals("organization", self.org)
        assert call.kwarg_equals("target_object", self.org.id)
        assert call.kwarg_equals("event", AuditLogEntryEvent.INTERNAL_INTEGRATION_ADD)
Exemplo n.º 14
0
    def test_applies_correctly_for_plugins(self):
        event = self.get_event()

        plugin = MagicMock()
        plugin.is_enabled.return_value = True
        plugin.should_notify.return_value = True

        rule = self.get_rule(data={"service": "mail"})

        with patch("sentry.plugins.base.plugins.get") as get_plugin:
            get_plugin.return_value = plugin

            results = list(rule.after(event=event, state=self.get_state()))

        assert len(results) == 1
        assert plugin.should_notify.call_count == 1
        assert results[0].callback is plugin.rule_notify
Exemplo n.º 15
0
    def test_records_analytics(self, create_audit_entry, record):
        sentry_app = InternalCreator.run(
            name="nulldb",
            user=self.user,
            author="Sentry",
            organization=self.org,
            scopes=("project:read",),
            webhook_url="http://example.com",
            schema={"elements": [self.create_issue_link_schema()]},
            request=MagicMock(),
        )

        assert faux(record).args_equals("internal_integration.created")
        assert faux(record).kwargs == {
            "user_id": self.user.id,
            "organization_id": self.org.id,
            "sentry_app": sentry_app.slug,
        }
Exemplo n.º 16
0
    def test_notify_sentry_app_and_plugin_with_same_slug(self):
        event = self.get_event()

        self.create_sentry_app(organization=event.organization, name="Notify", is_alertable=True)

        plugin = MagicMock()
        plugin.is_enabled.return_value = True
        plugin.should_notify.return_value = True

        rule = self.get_rule(data={"service": "notify"})

        with patch("sentry.plugins.base.plugins.get") as get_plugin:
            get_plugin.return_value = plugin

            results = list(rule.after(event=event, state=self.get_state()))

        assert len(results) == 2
        assert plugin.should_notify.call_count == 1
        assert results[0].callback is notify_sentry_app
        assert results[1].callback is plugin.rule_notify
Exemplo n.º 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")
    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",
        )
Exemplo n.º 19
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)
Exemplo n.º 20
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)
Exemplo n.º 21
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
        })
Exemplo n.º 22
0
    def test_supported_foreign_lang(self):
        result = self.TEMPLATE.render(
            request=MagicMock(LANGUAGE_CODE="fr")  # French, in locale/catalogs.json
        )

        assert '<script src="/_static/{version}/sentry/dist/locale/fr.js"></script>' in result
Exemplo n.º 23
0
    def test_no_lang(self):
        result = self.TEMPLATE.render(request=MagicMock())

        assert result.strip() == ""
Exemplo n.º 24
0
    def test_english(self):
        result = self.TEMPLATE.render(request=MagicMock(LANGUAGE_CODE="en"))

        assert result.strip() == ""
Exemplo n.º 25
0
    def test_unsupported_foreign_lang(self):
        result = self.TEMPLATE.render(
            request=MagicMock(LANGUAGE_CODE="ro")  # Romanian, not in locale/catalogs.json
        )

        assert result.strip() == ""