Browse Source

fix(hybrid-cloud): Fix Github repo installation webhook event for split silo (#55935)

Alberto Leal 1 year ago
parent
commit
0d81bb9075

+ 10 - 4
src/sentry_plugins/github/webhooks/events/installation_repository.py

@@ -1,4 +1,5 @@
 from sentry.models import Integration, Repository
+from sentry.services.hybrid_cloud.integration import integration_service
 
 from . import Webhook
 
@@ -8,16 +9,21 @@ class InstallationRepositoryEventWebhook(Webhook):
     def __call__(self, event, organization=None):
         installation = event["installation"]
 
-        integration = Integration.objects.get(
+        integration = integration_service.get_integration(
             external_id=installation["id"], provider="github_apps"
         )
+        if integration is None:
+            raise Integration.DoesNotExist
+
+        integration_orgs = integration_service.get_organization_integrations(
+            integration_id=integration.id
+        )
+        organizations = [org.organization_id for org in integration_orgs]
 
         repos_added = event["repositories_added"]
 
         if repos_added:
-            for org_id in integration.organizationintegration_set.values_list(
-                "organization_id", flat=True
-            ):
+            for org_id in organizations:
                 for r in repos_added:
                     config = {"name": r["full_name"]}
                     repo, created = Repository.objects.get_or_create(

+ 13 - 10
tests/sentry_plugins/github/endpoints/test_installation_repo_install_event.py

@@ -1,23 +1,25 @@
 from uuid import uuid4
 
 from sentry.models import Integration, Repository
+from sentry.silo.base import SiloMode
 from sentry.testutils.cases import APITestCase
-from sentry.testutils.silo import region_silo_test
+from sentry.testutils.silo import assume_test_silo_mode, region_silo_test
 from sentry_plugins.github.testutils import INSTALLATION_REPO_EVENT
 
 
-@region_silo_test
+@region_silo_test(stable=True)
 class InstallationRepoInstallEventWebhookTest(APITestCase):
     def test_simple(self):
         project = self.project  # force creation
 
         url = "/plugins/github/installations/webhook/"
 
-        integration = Integration.objects.create(
-            provider="github_apps", external_id="2", name="octocat"
-        )
+        with assume_test_silo_mode(SiloMode.CONTROL):
+            integration = Integration.objects.create(
+                provider="github_apps", external_id="2", name="octocat"
+            )
 
-        integration.add_organization(project.organization)
+            integration.add_organization(project.organization)
 
         response = self.client.post(
             path=url,
@@ -42,11 +44,12 @@ class InstallationRepoInstallEventWebhookTest(APITestCase):
 
         url = "/plugins/github/installations/webhook/"
 
-        integration = Integration.objects.create(
-            provider="github_apps", external_id="2", name="octocat"
-        )
+        with assume_test_silo_mode(SiloMode.CONTROL):
+            integration = Integration.objects.create(
+                provider="github_apps", external_id="2", name="octocat"
+            )
 
-        integration.add_organization(project.organization)
+            integration.add_organization(project.organization)
 
         repo = Repository.objects.create(
             provider="github",