diff --git a/src/sentry/api/endpoints/organization_relay_usage.py b/src/sentry/api/endpoints/organization_relay_usage.py
index 725a8a98136447..c8be6aef6f9a99 100644
--- a/src/sentry/api/endpoints/organization_relay_usage.py
+++ b/src/sentry/api/endpoints/organization_relay_usage.py
@@ -2,7 +2,6 @@
from rest_framework.request import Request
from rest_framework.response import Response
-from sentry import features
from sentry.api.api_owners import ApiOwner
from sentry.api.api_publish_status import ApiPublishStatus
from sentry.api.base import region_silo_endpoint
@@ -41,13 +40,7 @@ class OrganizationRelayUsage(OrganizationEndpoint):
def get(self, request: Request, organization: Organization) -> Response:
"""
Return a list of trusted relays bound to an organization.
-
- If the organization doesn't have Relay usage enabled it returns a 404.
"""
- has_relays = features.has("organizations:relay", organization, actor=request.user)
- if not has_relays:
- return Response(status=404)
-
option_key = "sentry:trusted-relays"
trusted_relays = organization.get_option(option_key)
if trusted_relays is None or len(trusted_relays) == 0:
diff --git a/src/sentry/core/endpoints/organization_details.py b/src/sentry/core/endpoints/organization_details.py
index 61a4b37e927561..c20b25df17bbe1 100644
--- a/src/sentry/core/endpoints/organization_details.py
+++ b/src/sentry/core/endpoints/organization_details.py
@@ -418,16 +418,6 @@ def validate_require2FA(self, value):
return value
def validate_trustedRelays(self, value):
- from sentry import features
-
- organization = self.context["organization"]
- request = self.context["request"]
- has_relays = features.has("organizations:relay", organization, actor=request.user)
- if not has_relays:
- raise serializers.ValidationError(
- "Organization does not have the relay feature enabled"
- )
-
# make sure we don't have multiple instances of one public key
public_keys = set()
if value is not None:
diff --git a/static/app/types/hooks.tsx b/static/app/types/hooks.tsx
index 40882b43b61d73..cefe01ea12915f 100644
--- a/static/app/types/hooks.tsx
+++ b/static/app/types/hooks.tsx
@@ -271,7 +271,6 @@ export type FeatureDisabledHooks = {
'feature-disabled:project-selector-all-projects': FeatureDisabledHook;
'feature-disabled:project-selector-checkbox': FeatureDisabledHook;
'feature-disabled:rate-limits': FeatureDisabledHook;
- 'feature-disabled:relay': FeatureDisabledHook;
'feature-disabled:replay-sidebar-item': FeatureDisabledHook;
'feature-disabled:sso-basic': FeatureDisabledHook;
'feature-disabled:sso-saml2': FeatureDisabledHook;
diff --git a/static/app/views/settings/organizationRelay/index.tsx b/static/app/views/settings/organizationRelay/index.tsx
index 983997fc5429f0..edd5b69ab4653c 100644
--- a/static/app/views/settings/organizationRelay/index.tsx
+++ b/static/app/views/settings/organizationRelay/index.tsx
@@ -1,34 +1,7 @@
-import Feature from 'sentry/components/acl/feature';
-import FeatureDisabled from 'sentry/components/acl/featureDisabled';
-import Panel from 'sentry/components/panels/panel';
-import PanelBody from 'sentry/components/panels/panelBody';
-import {t} from 'sentry/locale';
-import useOrganization from 'sentry/utils/useOrganization';
-
import {RelayWrapper} from './relayWrapper';
function OrganizationRelay() {
- const organization = useOrganization();
- return (
- (
-
-
-
-
-
- )}
- >
-
-
- );
+ return ;
}
export default OrganizationRelay;
diff --git a/static/gsApp/components/features/disabledRelay.tsx b/static/gsApp/components/features/disabledRelay.tsx
deleted file mode 100644
index 369de479acced8..00000000000000
--- a/static/gsApp/components/features/disabledRelay.tsx
+++ /dev/null
@@ -1,82 +0,0 @@
-import styled from '@emotion/styled';
-
-import {Button} from 'sentry/components/core/button';
-import EmptyMessage from 'sentry/components/emptyMessage';
-import Panel from 'sentry/components/panels/panel';
-import {IconBroadcast, IconBusiness} from 'sentry/icons';
-import {t, tct} from 'sentry/locale';
-import {space} from 'sentry/styles/space';
-import type {Organization} from 'sentry/types/organization';
-
-import {openUpsellModal} from 'getsentry/actionCreators/modal';
-import LearnMoreButton from 'getsentry/components/features/learnMoreButton';
-import PlanFeature from 'getsentry/components/features/planFeature';
-import {displayPlanName} from 'getsentry/utils/billing';
-
-type Props = {
- features: string[];
- organization: Organization;
-};
-
-function DisabledRelay({organization, features}: Props) {
- return (
-
- {({plan}) => (
-
- }
- title={t('Protect your private data and more by running a local Relay')}
- description={tct(
- '[strong: Sentry Relay] offers enterprise-grade data security by providing a standalone service that acts as a middle layer between your application and sentry.io. This feature [planRequirement] or above.',
-
- {
- strong: ,
- planRequirement: (
- {t('requires a %s Plan', displayPlanName(plan))}
- ),
- }
- )}
- action={
-
- }
- onClick={() => openUpsellModal({organization, source: 'feature.relay'})}
- >
- {t('Learn More')}
-
-
- {t('Documentation')}
-
-
- }
- />
-
- )}
-
- );
-}
-
-export default DisabledRelay;
-
-const ButtonBar = styled('div')`
- display: flex;
- flex-wrap: wrap;
- justify-content: center;
- align-items: center;
- margin: -${space(0.75)};
-`;
-
-const StyledButton = styled(Button)`
- margin: ${space(0.75)};
-`;
-
-const StyledLearnMoreButton = styled(LearnMoreButton)`
- margin: ${space(0.75)};
-`;
diff --git a/static/gsApp/components/labelWithPowerIcon.tsx b/static/gsApp/components/labelWithPowerIcon.tsx
index 938bbd0ac95390..5d106152f36371 100644
--- a/static/gsApp/components/labelWithPowerIcon.tsx
+++ b/static/gsApp/components/labelWithPowerIcon.tsx
@@ -11,7 +11,6 @@ import type {Subscription} from 'getsentry/types';
import {isEnterprise} from 'getsentry/utils/billing';
const SSO = 'sso';
-const RELAY = 'relay';
const ALLOCATIONS = 'allocations-upsell';
const TEAM_ROLES = 'team-roles-upsell';
@@ -37,11 +36,6 @@ const POWER_FEATURE_CONFIG = [
features: ['sso-saml2'],
partial: true,
},
- {
- id: RELAY,
- features: ['relay'],
- partial: false,
- },
{
id: ALLOCATIONS,
features: ['spend-allocations'],
diff --git a/static/gsApp/registerHooks.tsx b/static/gsApp/registerHooks.tsx
index ea35d81d9eec81..bd73c6d5e85314 100644
--- a/static/gsApp/registerHooks.tsx
+++ b/static/gsApp/registerHooks.tsx
@@ -19,7 +19,6 @@ import DisabledDataForwarding from 'getsentry/components/features/disabledDataFo
import DisabledDateRange from 'getsentry/components/features/disabledDateRange';
import DisabledDiscardGroup from 'getsentry/components/features/disabledDiscardGroup';
import DisabledRateLimits from 'getsentry/components/features/disabledRateLimits';
-import DisabledRelay from 'getsentry/components/features/disabledRelay';
import DisabledSelectorItems from 'getsentry/components/features/disabledSelectorItems';
import ExploreDateRangeQueryLimitFooter from 'getsentry/components/features/exploreDateRangeQueryLimitFooter';
import InsightsDateRangeQueryLimitFooter from 'getsentry/components/features/insightsDateRangeQueryLimitFooter';
@@ -267,7 +266,6 @@ const GETSENTRY_HOOKS: Partial = {
'feature-disabled:discard-groups': p => ,
'feature-disabled:data-forwarding': p => ,
- 'feature-disabled:relay': p => ,
'feature-disabled:rate-limits': p => ,
'feature-disabled:sso-basic': p => ,
'feature-disabled:sso-saml2': p => ,
diff --git a/tests/sentry/api/endpoints/test_organization_relay_usage.py b/tests/sentry/api/endpoints/test_organization_relay_usage.py
index a37b9f3dba0329..9fffd25176a860 100644
--- a/tests/sentry/api/endpoints/test_organization_relay_usage.py
+++ b/tests/sentry/api/endpoints/test_organization_relay_usage.py
@@ -5,7 +5,6 @@
from sentry.models.relay import RelayUsage
from sentry.testutils.cases import APITestCase
-from sentry.testutils.helpers import with_feature
class OrganizationRelayHistoryTest(APITestCase):
@@ -59,7 +58,6 @@ def setUp(self) -> None:
for relay_data in self._history_fixture():
RelayUsage.objects.create(**relay_data)
- @with_feature("organizations:relay")
def _set_org_public_keys(self, public_keys):
self.login_as(user=self.user)
@@ -73,7 +71,6 @@ def _set_org_public_keys(self, public_keys):
resp = self.client.put(url, data=data)
assert resp.status_code == 200
- @with_feature("organizations:relay")
def test_no_valid_public_keys(self) -> None:
"""
An organization with no valid public keys should return an
@@ -84,13 +81,6 @@ def test_no_valid_public_keys(self) -> None:
response = self.get_success_response(self.organization.slug)
assert response.data == []
- @with_feature({"organizations:relay": False})
- def test_endpoint_checks_feature_present(self) -> None:
- self.login_as(user=self.user)
- resp = self.get_response(self.organization.slug)
- assert resp.status_code == 404
-
- @with_feature("organizations:relay")
def test_only_records_for_known_public_keys_are_returned(self) -> None:
"""
Only the relay history for relays belonging to the origanization are
diff --git a/tests/sentry/core/endpoints/test_organization_details.py b/tests/sentry/core/endpoints/test_organization_details.py
index 28d7c5edb08007..573396904b0516 100644
--- a/tests/sentry/core/endpoints/test_organization_details.py
+++ b/tests/sentry/core/endpoints/test_organization_details.py
@@ -259,11 +259,10 @@ def test_trusted_relays_info(self) -> None:
data = {"trustedRelays": trusted_relays}
- with self.feature("organizations:relay"):
- start_time = timezone.now()
- self.get_success_response(self.organization.slug, method="put", **data)
- end_time = timezone.now()
- response = self.get_success_response(self.organization.slug)
+ start_time = timezone.now()
+ self.get_success_response(self.organization.slug, method="put", **data)
+ end_time = timezone.now()
+ response = self.get_success_response(self.organization.slug)
response_data = response.data.get("trustedRelays")
@@ -886,19 +885,6 @@ def test_setting_codecov_without_paid_plan_forbidden(self) -> None:
data = {"codecovAccess": True}
self.get_error_response(self.organization.slug, status_code=403, **data)
- def test_setting_trusted_relays_forbidden(self) -> None:
- data = {
- "trustedRelays": [
- {"publicKey": _VALID_RELAY_KEYS[0], "name": "name1"},
- {"publicKey": _VALID_RELAY_KEYS[1], "name": "name2"},
- ]
- }
-
- with self.feature({"organizations:relay": False}):
- response = self.get_error_response(self.organization.slug, status_code=400, **data)
-
- assert b"feature" in response.content
-
def test_setting_duplicate_trusted_keys(self) -> None:
"""
Test that you cannot set duplicated keys
@@ -928,8 +914,7 @@ def test_setting_duplicate_trusted_keys(self) -> None:
data = {"trustedRelays": trusted_relays}
- with self.feature("organizations:relay"):
- response = self.get_error_response(self.organization.slug, status_code=400, **data)
+ response = self.get_error_response(self.organization.slug, status_code=400, **data)
response_data = response.data.get("trustedRelays")
assert response_data is not None
@@ -956,7 +941,7 @@ def test_creating_trusted_relays(self) -> None:
data = {"trustedRelays": trusted_relays}
- with self.feature("organizations:relay"), outbox_runner():
+ with outbox_runner():
start_time = timezone.now()
response = self.get_success_response(self.organization.slug, **data)
end_time = timezone.now()
@@ -1040,7 +1025,7 @@ def test_modifying_trusted_relays(self) -> None:
initial_settings = {"trustedRelays": initial_trusted_relays}
changed_settings = {"trustedRelays": modified_trusted_relays}
- with self.feature("organizations:relay"), outbox_runner():
+ with outbox_runner():
start_time = timezone.now()
self.get_success_response(self.organization.slug, **initial_settings)
after_initial = timezone.now()
@@ -1108,9 +1093,8 @@ def test_deleting_trusted_relays(self) -> None:
initial_settings = {"trustedRelays": initial_trusted_relays}
changed_settings: dict[str, Any] = {"trustedRelays": []}
- with self.feature("organizations:relay"):
- self.get_success_response(self.organization.slug, **initial_settings)
- response = self.get_success_response(self.organization.slug, **changed_settings)
+ self.get_success_response(self.organization.slug, **initial_settings)
+ response = self.get_success_response(self.organization.slug, **changed_settings)
response_data = response.data.get("trustedRelays")