Browse Source

[mocks] general improvements

- randomize commits
- add ip/name to users
- add deploy activity item
- expand users in events
David Cramer 8 years ago
parent
commit
0a3a7e3064
2 changed files with 145 additions and 73 deletions
  1. 84 67
      bin/load-mocks
  2. 61 6
      src/sentry/utils/samples.py

+ 84 - 67
bin/load-mocks

@@ -3,37 +3,36 @@ from sentry.runner import configure
 configure()
 
 import itertools
-import six
-
+import random
 from datetime import datetime, timedelta
+from hashlib import sha1
+from random import randint
+from uuid import uuid4
+
+import six
 from django.conf import settings
 from django.db import IntegrityError, transaction
 from django.db.models import F
 from django.utils import timezone
-from hashlib import sha1
+from loremipsum import Generator
 from pytz import utc
-from random import randint
-from uuid import uuid4
 
 from sentry import buffer, roles
-from sentry.tsdb import backend as tsdb
 from sentry.models import (
-    Activity, Broadcast, Deploy, File, GroupMeta, Organization, OrganizationAccessRequest,
-    OrganizationMember, Project, Release, ReleaseFile, Team, User, UserReport,
-    GroupRelease, Environment, ReleaseEnvironment, ReleaseCommit, Commit, Repository,
-    CommitAuthor, CommitFileChange,
+    Activity, Broadcast, Commit, CommitAuthor, CommitFileChange, Deploy,
+    Environment, EventUser, File, GroupMeta, GroupRelease, Organization,
+    OrganizationAccessRequest, OrganizationMember, Project, Release,
+    ReleaseCommit, ReleaseEnvironment, ReleaseFile, Repository, Team, User,
+    UserReport
 )
 from sentry.signals import mocks_loaded
 from sentry.similarity import features
+from sentry.tsdb import backend as tsdb
 from sentry.utils.hashlib import md5_text
 from sentry.utils.samples import create_sample_event as _create_sample_event
+from sentry.utils.samples import generate_user
 
-
-def create_sample_event(*args, **kwargs):
-    event = _create_sample_event(*args, **kwargs)
-    features.record(event)
-    return event
-
+loremipsum = Generator()
 
 PLATFORMS = itertools.cycle([
     'ruby',
@@ -60,6 +59,46 @@ ENVIRONMENTS = itertools.cycle([
 ])
 
 
+def make_sentence(words=None):
+    if words is None:
+        words = int(random.weibullvariate(8, 3))
+    return ' '.join(random.choice(loremipsum.words) for _ in range(words))
+
+
+def create_sample_event(*args, **kwargs):
+    event = _create_sample_event(*args, **kwargs)
+    features.record(event)
+    return event
+
+
+def generate_commits(user):
+    commits = []
+    for i in range(random.randint(0, 20)):
+        filename = random.choice(loremipsum.words)
+        if random.randint(0, 5) == 1:
+            author = (user.name, user.email)
+        else:
+            author = (
+                '{} {}'.format(
+                    random.choice(loremipsum.words),
+                    random.choice(loremipsum.words),
+                ),
+                '{}@example.com'.format(
+                    random.choice(loremipsum.words),
+                ),
+            )
+
+        commits.append({
+            'key': sha1(uuid4().hex).hexdigest(),
+            'message': 'modified {}.js}',
+            'author': author,
+            'files': [
+                (filename, 'M'),
+            ],
+        })
+    return commits
+
+
 def create_system_time_series():
     now = datetime.utcnow().replace(tzinfo=utc)
 
@@ -234,6 +273,7 @@ def main(num_events=1, extra_events=False):
 
     if settings.SENTRY_SINGLE_ORGANIZATION:
         org = Organization.get_default()
+        print('Mocking org {}'.format(org.name))
     else:
         print('Mocking org {}'.format('Default'))
         org, _ = Organization.objects.get_or_create(
@@ -301,51 +341,7 @@ def main(num_events=1, extra_events=False):
                         )
                     release.add_project(project)
 
-            raw_commits = [
-                {
-                    'key': '5fb7672bee9c461a8aa074f52ed72eddzc9399e7a',
-                    'message': 'modified js view',
-                    'author': (user.name, user.email),
-                    'files': [
-                        ('/sentry/scripts/views.js', 'M'),
-                    ],
-                },
-                {
-                    'key': '6fb7672bee9c469a8aa074f52ed72eddzc9399e7d',
-                    'message': 'modified raven base',
-                    'author': (user.name, user.email),
-                    'files': [
-                        ('/getsentry/src/raven/raven/base.py', 'M'),
-                    ],
-                },
-                {
-                    'key': '6fb7672bee9c469a8aa074f52ed72eddc939ae7d',
-                    'message': 'Fix widget for real this time\n\nTurns out the sprocket configuration was broken.',
-                    'author': (user.name, user.email),
-                    'files': [
-                        ('/static/js/widget.js', 'M'),
-                    ],
-                },
-                {
-                    'key': '98a0672968c19e3d7921def5d724cc977e85f527',
-                    'message': 'Added .gitignore',
-                    'author': ('Jane Doe', 'janedoe@example.com'),
-                    'files': [
-                        ('.gitignore', 'A'),
-                        ('.DS_Store', 'D')
-                    ],
-                },
-                {
-                    'key': '631cd9096bd9811a046a472bb0aa8b573e86e1f1',
-                    'message': 'Fix widget',
-                    'author': (user.name, user.email),
-                    'files': [
-                        ('/static/html/widget.html', 'M'),
-                        ('/static/js/widget.js', 'M'),
-                        ('.DS_Store', 'A'),
-                    ],
-                },
-            ]
+            raw_commits = generate_commits(user)
 
             repo = Repository.objects.get_or_create(
                 organization_id=org.id,
@@ -408,15 +404,29 @@ def main(num_events=1, extra_events=False):
                 data={'version': release.version},
             )
 
-            Deploy.objects.create(
+            environment = Environment.get_or_create(
+                project=project,
+                name=ENVIRONMENTS.next()
+            )
+
+            deploy = Deploy.objects.create(
                 organization_id=project.organization_id,
                 release=release,
-                environment_id=Environment.get_or_create(
-                    project=project,
-                    name=ENVIRONMENTS.next()
-                ).id,
+                environment_id=environment.id,
             )
 
+            Activity.objects.create(
+                type=Activity.DEPLOY,
+                project=project,
+                ident=release.version,
+                data={
+                    'version': release.version,
+                    'deploy_id': deploy.id,
+                    'environment': environment.name
+                },
+                datetime=deploy.date_finished,
+             )
+
             # Add a bunch of additional dummy events to support pagination
             if extra_events:
                 for _ in range(45):
@@ -430,6 +440,7 @@ def main(num_events=1, extra_events=False):
                         environment=ENVIRONMENTS.next(),
                         message='This is a mostly useless example %s exception' % platform,
                         checksum=md5_text(platform + six.text_type(_)).hexdigest(),
+                        user=generate_user(),
                     )
 
             for _ in range(num_events):
@@ -438,6 +449,7 @@ def main(num_events=1, extra_events=False):
                     platform='python',
                     release=release.version,
                     environment=ENVIRONMENTS.next(),
+                    user=generate_user(),
                 )
 
                 event2 = create_sample_event(
@@ -449,6 +461,7 @@ def main(num_events=1, extra_events=False):
                         'name': 'raven-js',
                         'version': '2.1.0',
                     },
+                    user=generate_user(),
                 )
 
                 event3 = create_sample_event(project, 'java')
@@ -458,6 +471,7 @@ def main(num_events=1, extra_events=False):
                     platform='ruby',
                     release=release.version,
                     environment=ENVIRONMENTS.next(),
+                    user=generate_user(),
                 )
 
                 event5 = create_sample_event(
@@ -465,6 +479,7 @@ def main(num_events=1, extra_events=False):
                     platform='cocoa',
                     release=release.version,
                     environment=ENVIRONMENTS.next(),
+                    user=generate_user(),
                 )
 
                 create_sample_event(
@@ -473,6 +488,7 @@ def main(num_events=1, extra_events=False):
                     release=release.version,
                     environment=ENVIRONMENTS.next(),
                     message='This is a an example PHP event with an extremely long and annoying title\nIt also happens to contain some newlines in it,\nthus making it even more annoying.',
+                    user=generate_user(),
                 )
 
                 create_sample_event(
@@ -481,6 +497,7 @@ def main(num_events=1, extra_events=False):
                     sample_name='react-native',
                     release=release.version,
                     environment=ENVIRONMENTS.next(),
+                    user=generate_user(),
                 )
 
             Commit.objects.get_or_create(
@@ -519,7 +536,7 @@ def main(num_events=1, extra_events=False):
                 group=event3.group,
                 name='Jane Doe',
                 email='jane@example.com',
-                comments='I have no idea how I got here.',
+                comments=make_sentence(),
             )
 
             print('    > Loading time series data'.format(project_name))

+ 61 - 6
src/sentry/utils/samples.py

@@ -8,13 +8,16 @@ sentry.utils.samples
 from __future__ import absolute_import
 
 import os.path
+import random
 from datetime import datetime, timedelta
 
+import six
+
 from sentry.constants import DATA_ROOT
 from sentry.event_manager import EventManager
+from sentry.interfaces.user import User as UserInterface
 from sentry.utils import json
 
-
 epoch = datetime.utcfromtimestamp(0)
 
 
@@ -23,6 +26,57 @@ def milliseconds_ago(now, milliseconds):
     return (ago - epoch).total_seconds()
 
 
+def random_ip():
+    not_valid = [10, 127, 169, 172, 192]
+
+    first = random.randrange(1, 256)
+    while first in not_valid:
+        first = random.randrange(1, 256)
+
+    return '.'.join((
+        six.text_type(first),
+        six.text_type(random.randrange(1, 256)),
+        six.text_type(random.randrange(1, 256)),
+        six.text_type(random.randrange(1, 256))
+    ))
+
+
+def random_username():
+    return random.choice([
+        'jess', 'david', 'chris', 'eric', 'katie', 'ben', 'armin', 'saloni',
+        'max', 'meredith', 'matt', 'sentry',
+    ])
+
+
+def name_for_username(username):
+    return {
+        'ben': 'Ben Vinegar',
+        'chris': 'Chris Jennings',
+        'david': 'David Cramer',
+        'matt': 'Matt Robenolt',
+        'jess': 'Jess MacQueen',
+        'katie': 'Katie Lundsgaard',
+        'saloni': 'Saloni Dudziak',
+        'max': 'Max Bittker',
+        'meredith': 'Meredith Heller',
+        'eric': 'Eric Feng',
+        'armin': 'Armin Ronacher',
+    }.get(username, username.replace('_', ' ').title())
+
+
+def generate_user(username=None, email=None, ip_address=None, id=None):
+    if username is None and email is None:
+        username = random_username()
+        email = '{}@example.com'.format(username)
+    return UserInterface.to_python({
+        'id': id,
+        'username': username,
+        'email': email,
+        'ip_address': ip_address or random_ip(),
+        'name': name_for_username(username),
+    }).to_json()
+
+
 def load_data(platform, default=None, timestamp=None, sample_name=None):
     # NOTE: Before editing this data, make sure you understand the context
     # in which its being used. It is NOT only used for local development and
@@ -56,11 +110,12 @@ def load_data(platform, default=None, timestamp=None, sample_name=None):
 
     data['platform'] = platform
     data['message'] = 'This is an example %s exception' % (sample_name,)
-    data['sentry.interfaces.User'] = {
-        "username": "getsentry",
-        "id": "1671",
-        "email": "foo@example.com"
-    }
+    data['sentry.interfaces.User'] = generate_user(
+        ip_address='127.0.0.1',
+        username='sentry',
+        id=1,
+        email='sentry@example.com',
+    )
     data['extra'] = {
         'session': {
             'foo': 'bar',