Esempio n. 1
0
    def get_scim_token(self):
        from sentry.models import SentryAppInstallationForProvider

        if self.flags.scim_enabled:
            return SentryAppInstallationForProvider.get_token(
                self.organization, f"{self.provider}_scim")
        else:
            logger.warning(
                "SCIM disabled but tried to access token",
                extra={"organization_id": self.organization.id},
            )
            return None
Esempio n. 2
0
    def test_update_org_config_vars_exist(self):
        """Test the case wherein the secret and env vars already exist"""

        with self.tasks():
            self.assert_setup_flow()

        org = self.organization
        project_id = self.project.id
        enabled_dsn = ProjectKey.get_default(project=Project.objects.get(
            id=project_id)).get_dsn(public=True)
        sentry_auth_token = SentryAppInstallationForProvider.get_token(
            org.id, "vercel")

        env_var_map = {
            "SENTRY_ORG": {
                "type": "encrypted",
                "value": org.slug
            },
            "SENTRY_PROJECT": {
                "type": "encrypted",
                "value": self.project.slug
            },
            "SENTRY_DSN": {
                "type": "encrypted",
                "value": enabled_dsn
            },
            "SENTRY_AUTH_TOKEN": {
                "type": "secret",
                "value": sentry_auth_token
            },
            "VERCEL_GIT_COMMIT_SHA": {
                "type": "system",
                "value": "VERCEL_GIT_COMMIT_SHA"
            },
        }

        # mock get_project API call
        responses.add(
            responses.GET,
            "https://api.vercel.com/v1/projects/%s" %
            "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H",
            json={
                "link": {
                    "type": "github"
                },
                "framework": "gatsby"
            },
        )

        # mock update env vars
        count = 0
        for env_var, details in env_var_map.items():
            # mock try to create env var
            responses.add(
                responses.POST,
                "https://api.vercel.com/v7/projects/%s/env" %
                "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H",
                json={"error": {
                    "code": "ENV_ALREADY_EXISTS"
                }},
                status=400,
            )
            # mock get env var
            responses.add(
                responses.GET,
                "https://api.vercel.com/v7/projects/%s/env" %
                "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H",
                json={"envs": [{
                    "id": count,
                    "key": env_var
                }]},
            )
            # mock update env var
            responses.add(
                responses.PATCH,
                "https://api.vercel.com/v7/projects/%s/env/%s" %
                ("Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H", count),
                json={
                    "key": env_var,
                    "value": details["value"],
                    "target": ["production"],
                    "type": details["type"],
                },
            )
            count += 1

        data = {
            "project_mappings":
            [[project_id, "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H"]]
        }
        integration = Integration.objects.get(provider=self.provider.key)
        installation = integration.get_installation(org.id)
        org_integration = OrganizationIntegration.objects.get(
            organization_id=org.id, integration_id=integration.id)
        assert org_integration.config == {}
        installation.update_organization_config(data)
        org_integration = OrganizationIntegration.objects.get(
            organization_id=org.id, integration_id=integration.id)
        assert org_integration.config == {
            "project_mappings":
            [[project_id, "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H"]]
        }

        req_params = json.loads(responses.calls[5].request.body)
        assert req_params["key"] == "SENTRY_ORG"
        assert req_params["value"] == org.slug
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[8].request.body)
        assert req_params["key"] == "SENTRY_PROJECT"
        assert req_params["value"] == self.project.slug
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[11].request.body)
        assert req_params["key"] == "SENTRY_DSN"
        assert req_params["value"] == enabled_dsn
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[14].request.body)
        assert req_params["key"] == "SENTRY_AUTH_TOKEN"
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[17].request.body)
        assert req_params["key"] == "VERCEL_GIT_COMMIT_SHA"
        assert req_params["value"] == "VERCEL_GIT_COMMIT_SHA"
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "system"
Esempio n. 3
0
    def test_update_organization_config(self):
        """Test that Vercel environment variables are created"""
        with self.tasks():
            self.assert_setup_flow()

        org = self.organization
        project_id = self.project.id
        enabled_dsn = ProjectKey.get_default(project=Project.objects.get(
            id=project_id)).get_dsn(public=True)
        sentry_auth_token = SentryAppInstallationForProvider.get_token(
            org.id, "vercel")

        env_var_map = {
            "SENTRY_ORG": {
                "type": "encrypted",
                "value": org.slug
            },
            "SENTRY_PROJECT": {
                "type": "encrypted",
                "value": self.project.slug
            },
            "SENTRY_DSN": {
                "type": "encrypted",
                "value": enabled_dsn
            },
            "SENTRY_AUTH_TOKEN": {
                "type": "encrypted",
                "value": sentry_auth_token
            },
            "VERCEL_GIT_COMMIT_SHA": {
                "type": "system",
                "value": "VERCEL_GIT_COMMIT_SHA"
            },
        }

        # mock get_project API call
        responses.add(
            responses.GET,
            "https://api.vercel.com/v1/projects/%s" %
            "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H",
            json={
                "link": {
                    "type": "github"
                },
                "framework": "nextjs"
            },
        )

        # mock create the env vars
        for env_var, details in env_var_map.items():
            responses.add(
                responses.POST,
                "https://api.vercel.com/v7/projects/%s/env" %
                "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H",
                json={
                    "key": env_var,
                    "value": details["value"],
                    "target": ["production"],
                    "type": details["type"],
                },
            )

        integration = Integration.objects.get(provider=self.provider.key)
        installation = integration.get_installation(org.id)
        org_integration = OrganizationIntegration.objects.get(
            organization_id=org.id, integration_id=integration.id)
        assert org_integration.config == {}
        data = {
            "project_mappings":
            [[project_id, "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H"]]
        }

        installation.update_organization_config(data)
        org_integration = OrganizationIntegration.objects.get(
            organization_id=org.id, integration_id=integration.id)
        assert org_integration.config == {
            "project_mappings":
            [[project_id, "Qme9NXBpguaRxcXssZ1NWHVaM98MAL6PHDXUs1jPrgiM8H"]]
        }

        # assert the env vars were created correctly
        req_params = json.loads(responses.calls[5].request.body)
        assert req_params["key"] == "SENTRY_ORG"
        assert req_params["value"] == org.slug
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[6].request.body)
        assert req_params["key"] == "SENTRY_PROJECT"
        assert req_params["value"] == self.project.slug
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[7].request.body)
        assert req_params["key"] == "NEXT_PUBLIC_SENTRY_DSN"
        assert req_params["value"] == enabled_dsn
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[8].request.body)
        assert req_params["key"] == "SENTRY_AUTH_TOKEN"
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "encrypted"

        req_params = json.loads(responses.calls[9].request.body)
        assert req_params["key"] == "VERCEL_GIT_COMMIT_SHA"
        assert req_params["value"] == "VERCEL_GIT_COMMIT_SHA"
        assert req_params["target"] == ["production"]
        assert req_params["type"] == "system"
Esempio n. 4
0
    def update_organization_config(self, data):
        # data = {"project_mappings": [[sentry_project_id, vercel_project_id]]}

        vercel_client = self.get_client()
        config = self.org_integration.config
        try:
            new_mappings = data["project_mappings"]
        except KeyError:
            raise ValidationError("Failed to update configuration.")

        old_mappings = config.get("project_mappings") or []

        for mapping in new_mappings:
            # skip any mappings that already exist
            if mapping in old_mappings:
                continue

            [sentry_project_id, vercel_project_id] = mapping
            sentry_project = Project.objects.get(id=sentry_project_id)

            enabled_dsn = ProjectKey.get_default(project=sentry_project)
            if not enabled_dsn:
                raise ValidationError({
                    "project_mappings":
                    ["You must have an enabled DSN to continue!"]
                })

            sentry_project_dsn = enabled_dsn.get_dsn(public=True)

            vercel_project = vercel_client.get_project(vercel_project_id)
            source_code_provider = vercel_project.get("link", {}).get("type")

            if not source_code_provider:
                raise ValidationError({
                    "project_mappings": [
                        "You must connect your Vercel project to a Git repository to continue!"
                    ]
                })

            is_next_js = vercel_project.get("framework") == "nextjs"
            dsn_env_name = "NEXT_PUBLIC_SENTRY_DSN" if is_next_js else "SENTRY_DSN"

            sentry_auth_token = SentryAppInstallationForProvider.get_token(
                sentry_project.organization.id,
                "vercel",
            )

            env_var_map = {
                "SENTRY_ORG": {
                    "type": "encrypted",
                    "value": sentry_project.organization.slug
                },
                "SENTRY_PROJECT": {
                    "type": "encrypted",
                    "value": sentry_project.slug
                },
                dsn_env_name: {
                    "type": "encrypted",
                    "value": sentry_project_dsn
                },
                "SENTRY_AUTH_TOKEN": {
                    "type": "encrypted",
                    "value": sentry_auth_token,
                },
                "VERCEL_GIT_COMMIT_SHA": {
                    "type": "system",
                    "value": "VERCEL_GIT_COMMIT_SHA"
                },
            }

            for env_var, details in env_var_map.items():
                self.create_env_var(vercel_client, vercel_project_id, env_var,
                                    details["value"], details["type"])

        config.update(data)
        self.org_integration.update(config=config)