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")