Skip to content

Commit b14078a

Browse files
committed
ref(integrations): Remove the legacy web-view setup pipeline from integrations
Every integration provider now installs through the API-driven pipeline (`get_pipeline_api_steps()` + the organization pipeline endpoint), so the server-rendered web-view setup path is dead for integrations. Drop `get_pipeline_views()` from the `IntegrationProvider` base class and from all provider subclasses (each was a no-op `return []`). `IntegrationPipeline` now returns an empty list of pipeline views directly, so integration pipelines no longer depend on the provider method. Delete the now-unused `OrganizationIntegrationSetupView` and its `/extensions/<provider>/setup/` route, plus the dangling test helper. The generic `Pipeline` framework (and `PipelineView`/`PipelineAdvancerView`) is left intact since it is still shared with the auth/SSO and identity pipelines.
1 parent d1773a3 commit b14078a

28 files changed

Lines changed: 26 additions & 231 deletions

File tree

pyproject.toml

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1986,7 +1986,6 @@ module = [
19861986
"tests.sentry.integrations.utils.*",
19871987
"tests.sentry.integrations.vercel.*",
19881988
"tests.sentry.integrations.vsts.*",
1989-
"tests.sentry.integrations.web.*",
19901989
"tests.sentry.issues.related.*",
19911990
"tests.sentry.issues.test_group",
19921991
"tests.sentry.issues.test_ingest_incident_integration",

src/sentry/integrations/aws_lambda/integration.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -407,9 +407,6 @@ class AwsLambdaIntegrationProvider(IntegrationProvider):
407407
integration_cls = AwsLambdaIntegration
408408
features = frozenset([IntegrationFeatures.SERVERLESS])
409409

410-
def get_pipeline_views(self) -> list:
411-
return []
412-
413410
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
414411
return [
415412
ProjectSelectApiStep(),

src/sentry/integrations/base.py

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
import abc
44
import logging
55
import sys
6-
from collections.abc import Callable, Mapping, MutableMapping, Sequence
6+
from collections.abc import Mapping, MutableMapping, Sequence
77
from enum import StrEnum
88
from functools import cached_property
99
from typing import TYPE_CHECKING, Any, NamedTuple, NoReturn, NotRequired, TypedDict
@@ -312,19 +312,15 @@ def create_audit_log_entry(
312312
data={"provider": integration.provider, "name": integration.name},
313313
)
314314

315-
def get_pipeline_views(
316-
self,
317-
) -> Sequence[
318-
PipelineView[IntegrationPipeline] | Callable[[], PipelineView[IntegrationPipeline]]
319-
]:
315+
def get_pipeline_views(self) -> Sequence[PipelineView[IntegrationPipeline]]:
320316
"""
321-
Return a list of ``View`` instances describing this integration's
322-
configuration pipeline.
323-
324-
>>> def get_pipeline_views(self):
325-
>>> return []
317+
Do NOT override this for an integration. Integrations install through
318+
the API-driven pipeline (``get_pipeline_api_steps``) and have no
319+
server-rendered pipeline views -- the legacy web-view setup flow has
320+
been removed. This empty implementation exists only to satisfy the
321+
abstract ``PipelineProvider`` interface for every integration provider.
326322
"""
327-
raise NotImplementedError
323+
return []
328324

329325
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline] | None:
330326
"""

src/sentry/integrations/bitbucket/integration.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from __future__ import annotations
22

3-
from collections.abc import Mapping, Sequence
3+
from collections.abc import Mapping
44
from itertools import chain
55
from typing import Any
66

@@ -35,7 +35,7 @@
3535
from sentry.models.repository import Repository
3636
from sentry.organizations.services.organization.model import RpcOrganization
3737
from sentry.pipeline.types import PipelineStepResult
38-
from sentry.pipeline.views.base import ApiPipelineSteps, PipelineView
38+
from sentry.pipeline.views.base import ApiPipelineSteps
3939
from sentry.shared_integrations.exceptions import ApiError
4040
from sentry.utils.http import absolute_uri
4141

@@ -260,9 +260,6 @@ class BitbucketIntegrationProvider(IntegrationProvider):
260260
]
261261
)
262262

263-
def get_pipeline_views(self) -> Sequence[PipelineView[IntegrationPipeline]]:
264-
return []
265-
266263
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
267264
return [BitbucketAuthorizeApiStep()]
268265

src/sentry/integrations/bitbucket_server/integration.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
from sentry.models.repository import Repository
3939
from sentry.organizations.services.organization.model import RpcOrganization
4040
from sentry.pipeline.types import PipelineStepResult
41-
from sentry.pipeline.views.base import ApiPipelineSteps, PipelineView
41+
from sentry.pipeline.views.base import ApiPipelineSteps
4242
from sentry.shared_integrations.exceptions import ApiError, IntegrationError
4343
from sentry.users.models.identity import Identity
4444

@@ -381,9 +381,6 @@ class BitbucketServerIntegrationProvider(IntegrationProvider):
381381
)
382382
setup_dialog_config = {"width": 1030, "height": 1000}
383383

384-
def get_pipeline_views(self) -> list[PipelineView[IntegrationPipeline]]:
385-
return []
386-
387384
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
388385
return [InstallationConfigApiStep(), OAuthApiStep()]
389386

src/sentry/integrations/claude_code/integration.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -185,9 +185,6 @@ class ClaudeCodeAgentIntegrationProvider(CodingAgentIntegrationProvider):
185185
metadata = metadata
186186
requires_feature_flag = False
187187

188-
def get_pipeline_views(self):
189-
return []
190-
191188
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
192189
return [ClaudeCodeApiKeyApiStep()]
193190

src/sentry/integrations/cursor/integration.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,6 @@ class CursorAgentIntegrationProvider(CodingAgentIntegrationProvider):
9090
# parent class's flag check rather than rely on a removed registration.
9191
requires_feature_flag = False
9292

93-
def get_pipeline_views(self):
94-
return []
95-
9693
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
9794
return [CursorApiKeyApiStep()]
9895

src/sentry/integrations/discord/integration.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
from sentry.notifications.platform.target import IntegrationNotificationTarget
3434
from sentry.organizations.services.organization.model import RpcOrganization
3535
from sentry.pipeline.types import PipelineStepResult
36-
from sentry.pipeline.views.base import ApiPipelineSteps, PipelineView
36+
from sentry.pipeline.views.base import ApiPipelineSteps
3737
from sentry.shared_integrations.exceptions import ApiError, IntegrationError
3838
from sentry.utils.http import absolute_uri
3939

@@ -257,9 +257,6 @@ def __init__(self) -> None:
257257
self.configure_url = absolute_uri("extensions/discord/configure/")
258258
super().__init__()
259259

260-
def get_pipeline_views(self) -> list[PipelineView[IntegrationPipeline]]:
261-
return []
262-
263260
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
264261
return [
265262
DiscordOAuthApiStep(

src/sentry/integrations/example/integration.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -240,9 +240,6 @@ class ExampleIntegrationProvider(IntegrationProvider):
240240
]
241241
)
242242

243-
def get_pipeline_views(self) -> list:
244-
return []
245-
246243
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
247244
return [ExampleSetupApiStep()]
248245

src/sentry/integrations/github/integration.py

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import logging
44
import re
5-
from collections.abc import Callable, Iterable, Mapping, MutableMapping, Sequence
5+
from collections.abc import Iterable, Mapping, MutableMapping
66
from dataclasses import dataclass
77
from enum import StrEnum
88
from typing import Any, NotRequired, TypedDict
@@ -63,7 +63,7 @@
6363
from sentry.organizations.services.organization import organization_service
6464
from sentry.organizations.services.organization.model import RpcOrganization
6565
from sentry.pipeline.types import PipelineStepResult
66-
from sentry.pipeline.views.base import ApiPipelineSteps, PipelineView
66+
from sentry.pipeline.views.base import ApiPipelineSteps
6767
from sentry.shared_integrations.constants import ERR_INTERNAL, ERR_UNAUTHORIZED
6868
from sentry.shared_integrations.exceptions import (
6969
ApiError,
@@ -742,13 +742,6 @@ def post_install(
742742
}
743743
)
744744

745-
def get_pipeline_views(
746-
self,
747-
) -> Sequence[
748-
PipelineView[IntegrationPipeline] | Callable[[], PipelineView[IntegrationPipeline]]
749-
]:
750-
return []
751-
752745
def get_pipeline_api_steps(self) -> ApiPipelineSteps[IntegrationPipeline]:
753746
return [
754747
OAuthLoginApiStep(),

0 commit comments

Comments
 (0)