Skip to content

Commit c718100

Browse files
committed
also call bulk endpoint
1 parent 5fb3cbe commit c718100

File tree

2 files changed

+51
-11
lines changed
  • src/sentry/integrations/services/repository
  • tests/sentry/integrations/services/repository

2 files changed

+51
-11
lines changed

src/sentry/integrations/services/repository/impl.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -132,13 +132,14 @@ def disable_repositories_for_integration(
132132
self, *, organization_id: int, integration_id: int, provider: str
133133
) -> None:
134134
with transaction.atomic(router.db_for_write(Repository)):
135-
repo_ids = list(
135+
repos = list(
136136
Repository.objects.filter(
137137
organization_id=organization_id,
138138
integration_id=integration_id,
139139
provider=provider,
140-
).values_list("id", flat=True)
140+
).values_list("id", "external_id", "provider")
141141
)
142+
repo_ids = [repo_id for repo_id, _, _ in repos]
142143

143144
if repo_ids:
144145
Repository.objects.filter(id__in=repo_ids).update(status=ObjectStatus.DISABLED)
@@ -150,6 +151,19 @@ def disable_repositories_for_integration(
150151
except Organization.DoesNotExist:
151152
pass
152153

154+
repos_to_clean = [
155+
{"repo_external_id": external_id, "repo_provider": repo_provider}
156+
for _, external_id, repo_provider in repos
157+
if external_id and repo_provider
158+
]
159+
if repos_to_clean:
160+
bulk_cleanup_seer_repository_preferences.apply_async(
161+
kwargs={
162+
"organization_id": organization_id,
163+
"repos": repos_to_clean,
164+
}
165+
)
166+
153167
def disable_repositories_by_external_ids(
154168
self,
155169
*,
@@ -159,15 +173,16 @@ def disable_repositories_by_external_ids(
159173
external_ids: list[str],
160174
) -> None:
161175
with transaction.atomic(router.db_for_write(Repository)):
162-
repo_ids = list(
176+
repos = list(
163177
Repository.objects.filter(
164178
organization_id=organization_id,
165179
integration_id=integration_id,
166180
provider=provider,
167181
external_id__in=external_ids,
168182
status=ObjectStatus.ACTIVE,
169-
).values_list("id", flat=True)
183+
).values_list("id", "external_id", "provider")
170184
)
185+
repo_ids = [repo_id for repo_id, _, _ in repos]
171186

172187
if repo_ids:
173188
Repository.objects.filter(id__in=repo_ids).update(status=ObjectStatus.DISABLED)
@@ -179,6 +194,19 @@ def disable_repositories_by_external_ids(
179194
except Organization.DoesNotExist:
180195
pass
181196

197+
repos_to_clean = [
198+
{"repo_external_id": external_id, "repo_provider": repo_provider}
199+
for _, external_id, repo_provider in repos
200+
if external_id and repo_provider
201+
]
202+
if repos_to_clean:
203+
bulk_cleanup_seer_repository_preferences.apply_async(
204+
kwargs={
205+
"organization_id": organization_id,
206+
"repos": repos_to_clean,
207+
}
208+
)
209+
182210
def disassociate_organization_integration(
183211
self,
184212
*,

tests/sentry/integrations/services/repository/test_impl.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from unittest.mock import patch
2+
13
from sentry.constants import ObjectStatus
24
from sentry.integrations.services.repository.service import repository_service
35
from sentry.models.repository import Repository
@@ -164,7 +166,8 @@ def test_empty_external_ids_is_noop(self) -> None:
164166
assert repo.status == ObjectStatus.ACTIVE
165167

166168
@with_feature("organizations:seer-project-settings-dual-write")
167-
def test_deletes_seer_project_repository_rows(self) -> None:
169+
@patch("sentry.integrations.services.repository.impl.bulk_cleanup_seer_repository_preferences")
170+
def test_cleans_up_seer_preferences(self, mock_cleanup) -> None:
168171
project = self.create_project(organization=self.organization)
169172
repo = Repository.objects.create(
170173
organization_id=self.organization.id,
@@ -183,9 +186,13 @@ def test_deletes_seer_project_repository_rows(self) -> None:
183186
external_ids=["100"],
184187
)
185188

186-
repo.refresh_from_db()
187-
assert repo.status == ObjectStatus.DISABLED
188189
assert not SeerProjectRepository.objects.filter(repository_id=repo.id).exists()
190+
mock_cleanup.apply_async.assert_called_once_with(
191+
kwargs={
192+
"organization_id": self.organization.id,
193+
"repos": [{"repo_external_id": "100", "repo_provider": self.provider}],
194+
}
195+
)
189196

190197

191198
@cell_silo_test
@@ -198,7 +205,7 @@ def setUp(self) -> None:
198205
)
199206
self.provider = "integrations:github"
200207

201-
def test_disables_all_repos_for_integration(self) -> None:
208+
def test_disables_matching_active_repos(self) -> None:
202209
repo = Repository.objects.create(
203210
organization_id=self.organization.id,
204211
name="getsentry/sentry",
@@ -218,7 +225,8 @@ def test_disables_all_repos_for_integration(self) -> None:
218225
assert repo.status == ObjectStatus.DISABLED
219226

220227
@with_feature("organizations:seer-project-settings-dual-write")
221-
def test_deletes_seer_project_repository_rows(self) -> None:
228+
@patch("sentry.integrations.services.repository.impl.bulk_cleanup_seer_repository_preferences")
229+
def test_cleans_up_seer_preferences(self, mock_cleanup) -> None:
222230
project = self.create_project(organization=self.organization)
223231
repo = Repository.objects.create(
224232
organization_id=self.organization.id,
@@ -236,6 +244,10 @@ def test_deletes_seer_project_repository_rows(self) -> None:
236244
provider=self.provider,
237245
)
238246

239-
repo.refresh_from_db()
240-
assert repo.status == ObjectStatus.DISABLED
241247
assert not SeerProjectRepository.objects.filter(repository_id=repo.id).exists()
248+
mock_cleanup.apply_async.assert_called_once_with(
249+
kwargs={
250+
"organization_id": self.organization.id,
251+
"repos": [{"repo_external_id": "100", "repo_provider": self.provider}],
252+
}
253+
)

0 commit comments

Comments
 (0)