Browse Source

fix(api): Fix events endpoints to not query snuba if user/org have no projects

fixes SENTRY-85E
Jess MacQueen 6 years ago
parent
commit
b73c8432ba

+ 18 - 10
src/sentry/api/endpoints/organization_events.py

@@ -6,7 +6,7 @@ from functools32 import partial
 
 from rest_framework.response import Response
 
-from sentry.api.bases import OrganizationEventsEndpointBase, OrganizationEventsError
+from sentry.api.bases import OrganizationEventsEndpointBase, OrganizationEventsError, NoProjects
 from sentry.api.paginator import GenericOffsetPaginator
 from sentry.api.serializers import serialize
 from sentry.api.serializers.models.event import SnubaEvent
@@ -25,15 +25,19 @@ class OrganizationEventsEndpoint(OrganizationEventsEndpointBase):
             snuba_args = self.get_snuba_query_args(request, organization)
         except OrganizationEventsError as exc:
             return Response({'detail': exc.message}, status=400)
-
-        data_fn = partial(
-            # extract 'data' from raw_query result
-            lambda *args, **kwargs: raw_query(*args, **kwargs)['data'],
-            selected_columns=SnubaEvent.selected_columns,
-            orderby='-timestamp',
-            referrer='api.organization-events',
-            **snuba_args
-        )
+        except NoProjects:
+            # return empty result if org doesn't have projects
+            # or user doesn't have access to projects in org
+            data_fn = lambda *args, **kwargs: []
+        else:
+            data_fn = partial(
+                # extract 'data' from raw_query result
+                lambda *args, **kwargs: raw_query(*args, **kwargs)['data'],
+                selected_columns=SnubaEvent.selected_columns,
+                orderby='-timestamp',
+                referrer='api.organization-events',
+                **snuba_args
+            )
 
         return self.paginate(
             request=request,
@@ -50,6 +54,8 @@ class OrganizationEventsStatsEndpoint(OrganizationEventsEndpointBase):
             snuba_args = self.get_snuba_query_args(request, organization)
         except OrganizationEventsError as exc:
             return Response({'detail': exc.message}, status=400)
+        except NoProjects:
+            return Response({'data': []})
 
         interval = parse_stats_period(request.GET.get('interval', '1h'))
         if interval is None:
@@ -84,6 +90,8 @@ class OrganizationEventsMetaEndpoint(OrganizationEventsEndpointBase):
             snuba_args = self.get_snuba_query_args(request, organization)
         except OrganizationEventsError as exc:
             return Response({'detail': exc.message}, status=400)
+        except NoProjects:
+            return Response({'count': 0})
 
         data = raw_query(
             aggregations=[['count()', '', 'count']],

+ 45 - 0
tests/snuba/api/endpoints/test_organization_events.py

@@ -491,6 +491,21 @@ class OrganizationEventsEndpointTest(OrganizationEventsTestBase):
         assert len(response.data) == 1
         self.assert_events_in_response(response, [event_1.event_id])
 
+    def test_no_projects(self):
+        org = self.create_organization(owner=self.user)
+        self.login_as(user=self.user)
+
+        url = reverse(
+            'sentry-api-0-organization-events',
+            kwargs={
+                'organization_slug': org.slug,
+            }
+        )
+        response = self.client.get(url, format='json')
+
+        assert response.status_code == 200, response.content
+        assert len(response.data) == 0
+
 
 class OrganizationEventsStatsEndpointTest(OrganizationEventsTestBase):
     def test_simple(self):
@@ -553,6 +568,21 @@ class OrganizationEventsStatsEndpointTest(OrganizationEventsTestBase):
             (1541070000, [{'count': 2}]),
         ]
 
+    def test_no_projects(self):
+        org = self.create_organization(owner=self.user)
+        self.login_as(user=self.user)
+
+        url = reverse(
+            'sentry-api-0-organization-events-stats',
+            kwargs={
+                'organization_slug': org.slug,
+            }
+        )
+        response = self.client.get(url, format='json')
+
+        assert response.status_code == 200, response.content
+        assert len(response.data['data']) == 0
+
 
 class OrganizationEventsMetaEndpoint(OrganizationEventsTestBase):
     def test_simple(self):
@@ -601,3 +631,18 @@ class OrganizationEventsMetaEndpoint(OrganizationEventsTestBase):
         assert response.status_code == 200, response.content
         # this is not exact because of turbo=True
         assert response.data['count'] == 10
+
+    def test_no_projects(self):
+        org = self.create_organization(owner=self.user)
+        self.login_as(user=self.user)
+
+        url = reverse(
+            'sentry-api-0-organization-events-meta',
+            kwargs={
+                'organization_slug': org.slug,
+            }
+        )
+        response = self.client.get(url, format='json')
+
+        assert response.status_code == 200, response.content
+        assert response.data['count'] == 0