|
@@ -92,6 +92,7 @@ from sentry.models.integrations.integration_feature import Feature, IntegrationT
|
|
|
from sentry.models.releasefile import update_artifact_index
|
|
|
from sentry.signals import project_created
|
|
|
from sentry.snuba.dataset import Dataset
|
|
|
+from sentry.testutils.silo import exempt_from_silo_limits
|
|
|
from sentry.types.activity import ActivityType
|
|
|
from sentry.types.integrations import ExternalProviders
|
|
|
from sentry.utils import json, loremipsum
|
|
@@ -240,6 +241,7 @@ def _patch_artifact_manifest(path, org, release, project=None, extra_files=None)
|
|
|
# TODO(dcramer): consider moving to something more scalable like factoryboy
|
|
|
class Factories:
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_organization(name=None, owner=None, **kwargs):
|
|
|
if not name:
|
|
|
name = petname.Generate(2, " ", letters=10).title()
|
|
@@ -250,6 +252,7 @@ class Factories:
|
|
|
return org
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_member(teams=None, **kwargs):
|
|
|
kwargs.setdefault("role", "member")
|
|
|
|
|
@@ -260,6 +263,7 @@ class Factories:
|
|
|
return om
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_team_membership(team, member=None, user=None, role=None):
|
|
|
if member is None:
|
|
|
member, _ = OrganizationMember.objects.get_or_create(
|
|
@@ -271,6 +275,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_team(organization, **kwargs):
|
|
|
if not kwargs.get("name"):
|
|
|
kwargs["name"] = petname.Generate(2, " ", letters=10).title()
|
|
@@ -285,6 +290,7 @@ class Factories:
|
|
|
return team
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_environment(project, **kwargs):
|
|
|
name = kwargs.get("name", petname.Generate(3, " ", letters=10)[:64])
|
|
|
|
|
@@ -298,6 +304,7 @@ class Factories:
|
|
|
return env
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_project(organization=None, teams=None, fire_project_created=False, **kwargs):
|
|
|
if not kwargs.get("name"):
|
|
|
kwargs["name"] = petname.Generate(2, " ", letters=10).title()
|
|
@@ -318,10 +325,12 @@ class Factories:
|
|
|
return project
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_project_bookmark(project, user):
|
|
|
return ProjectBookmark.objects.create(project_id=project.id, user=user)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_project_rule(project, action_data=None, condition_data=None):
|
|
|
action_data = action_data or [
|
|
|
{
|
|
@@ -350,6 +359,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_slack_project_rule(project, integration_id, channel_id=None, channel_name=None):
|
|
|
action_data = [
|
|
|
{
|
|
@@ -363,10 +373,12 @@ class Factories:
|
|
|
return Factories.create_project_rule(project, action_data)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_project_key(project):
|
|
|
return project.key_set.get_or_create()[0]
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_release(
|
|
|
project: Project,
|
|
|
user: Optional[User] = None,
|
|
@@ -437,6 +449,7 @@ class Factories:
|
|
|
return release
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_release_file(release_id, file=None, name=None, dist_id=None):
|
|
|
if file is None:
|
|
|
file = Factories.create_file(
|
|
@@ -460,6 +473,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_artifact_bundle(org, release, project=None, extra_files=None):
|
|
|
import zipfile
|
|
|
|
|
@@ -483,6 +497,7 @@ class Factories:
|
|
|
return bundle.getvalue()
|
|
|
|
|
|
@classmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_release_archive(cls, org, release: str, project=None, dist=None):
|
|
|
bundle = cls.create_artifact_bundle(org, release, project)
|
|
|
file_ = File.objects.create(name="release-artifacts.zip")
|
|
@@ -491,6 +506,7 @@ class Factories:
|
|
|
return update_artifact_index(release, dist, file_)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_code_mapping(project, repo=None, organization_integration=None, **kwargs):
|
|
|
kwargs.setdefault("stack_root", "")
|
|
|
kwargs.setdefault("source_root", "")
|
|
@@ -506,6 +522,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_repo(project, name=None, provider=None, integration_id=None, url=None):
|
|
|
repo = Repository.objects.create(
|
|
|
organization_id=project.organization_id,
|
|
@@ -518,6 +535,7 @@ class Factories:
|
|
|
return repo
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_commit(
|
|
|
repo, project=None, author=None, release=None, message=None, key=None, date_added=None
|
|
|
):
|
|
@@ -550,6 +568,7 @@ class Factories:
|
|
|
return commit
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_commit_author(organization_id=None, project=None, user=None):
|
|
|
return CommitAuthor.objects.get_or_create(
|
|
|
organization_id=organization_id or project.organization_id,
|
|
@@ -558,12 +577,14 @@ class Factories:
|
|
|
)[0]
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_commit_file_change(commit, filename):
|
|
|
return CommitFileChange.objects.get_or_create(
|
|
|
organization_id=commit.organization_id, commit=commit, filename=filename, type="M"
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_user(email=None, **kwargs):
|
|
|
if email is None:
|
|
|
email = uuid4().hex + "@example.com"
|
|
@@ -584,6 +605,7 @@ class Factories:
|
|
|
return user
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_useremail(user, email, **kwargs):
|
|
|
if not email:
|
|
|
email = uuid4().hex + "@example.com"
|
|
@@ -611,6 +633,7 @@ class Factories:
|
|
|
return event
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_group(project, **kwargs):
|
|
|
kwargs.setdefault("message", "Hello world")
|
|
|
kwargs.setdefault("data", {})
|
|
@@ -621,10 +644,12 @@ class Factories:
|
|
|
return Group.objects.create(project=project, **kwargs)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_file(**kwargs):
|
|
|
return File.objects.create(**kwargs)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_file_from_path(path, name=None, **kwargs):
|
|
|
if name is None:
|
|
|
name = os.path.basename(path)
|
|
@@ -635,6 +660,7 @@ class Factories:
|
|
|
return file
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_event_attachment(event, file=None, **kwargs):
|
|
|
if file is None:
|
|
|
file = Factories.create_file(
|
|
@@ -653,6 +679,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_dif_file(
|
|
|
project,
|
|
|
debug_id=None,
|
|
@@ -696,6 +723,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_dif_from_path(path, object_name=None, **kwargs):
|
|
|
if object_name is None:
|
|
|
object_name = os.path.basename(path)
|
|
@@ -709,6 +737,7 @@ class Factories:
|
|
|
UserPermission.objects.create(user=user, permission=permission)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_sentry_app(**kwargs):
|
|
|
app = sentry_apps.Creator.run(is_internal=False, **Factories._sentry_app_kwargs(**kwargs))
|
|
|
|
|
@@ -718,12 +747,14 @@ class Factories:
|
|
|
return app
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_internal_integration(**kwargs):
|
|
|
return sentry_apps.InternalCreator.run(
|
|
|
is_internal=True, **Factories._sentry_app_kwargs(**kwargs)
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_internal_integration_token(install, **kwargs):
|
|
|
return sentry_app_installation_tokens.Creator.run(sentry_app_installation=install, **kwargs)
|
|
|
|
|
@@ -745,6 +776,7 @@ class Factories:
|
|
|
return _kwargs
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_sentry_app_installation(
|
|
|
organization=None, slug=None, user=None, status=None, prevent_token_exchange=False
|
|
|
):
|
|
@@ -773,10 +805,12 @@ class Factories:
|
|
|
return install
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_stacktrace_link_schema():
|
|
|
return {"type": "stacktrace-link", "uri": "/redirect/"}
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_issue_link_schema():
|
|
|
return {
|
|
|
"type": "issue-link",
|
|
@@ -815,6 +849,7 @@ class Factories:
|
|
|
}
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_alert_rule_action_schema():
|
|
|
return {
|
|
|
"type": "alert-rule-action",
|
|
@@ -844,6 +879,7 @@ class Factories:
|
|
|
}
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_service_hook(actor=None, org=None, project=None, events=None, url=None, **kwargs):
|
|
|
if not actor:
|
|
|
actor = Factories.create_user()
|
|
@@ -869,6 +905,7 @@ class Factories:
|
|
|
return service_hooks.Creator.run(**_kwargs)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_sentry_app_feature(feature=None, sentry_app=None, description=None):
|
|
|
if not sentry_app:
|
|
|
sentry_app = Factories.create_sentry_app()
|
|
@@ -900,6 +937,7 @@ class Factories:
|
|
|
return _kwargs
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_doc_integration(features=None, has_avatar: bool = False, **kwargs) -> DocIntegration:
|
|
|
doc = DocIntegration.objects.create(**Factories._doc_integration_kwargs(**kwargs))
|
|
|
if features:
|
|
@@ -909,6 +947,7 @@ class Factories:
|
|
|
return doc
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_doc_integration_features(
|
|
|
features=None, doc_integration=None
|
|
|
) -> List[IntegrationFeature]:
|
|
@@ -928,6 +967,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_doc_integration_avatar(doc_integration=None, **kwargs) -> DocIntegrationAvatar:
|
|
|
if not doc_integration:
|
|
|
doc_integration = Factories.create_doc_integration()
|
|
@@ -938,6 +978,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_userreport(group, project=None, event_id=None, **kwargs):
|
|
|
return UserReport.objects.create(
|
|
|
group_id=group.id,
|
|
@@ -950,6 +991,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_session():
|
|
|
engine = import_module(settings.SESSION_ENGINE)
|
|
|
|
|
@@ -958,6 +1000,7 @@ class Factories:
|
|
|
return session
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_platform_external_issue(
|
|
|
group=None, service_type=None, display_name=None, web_url=None
|
|
|
):
|
|
@@ -970,6 +1013,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_integration_external_issue(group=None, integration=None, key=None):
|
|
|
external_issue = ExternalIssue.objects.create(
|
|
|
organization_id=group.organization.id, integration_id=integration.id, key=key
|
|
@@ -986,6 +1030,7 @@ class Factories:
|
|
|
return external_issue
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_incident(
|
|
|
organization,
|
|
|
projects,
|
|
@@ -1025,12 +1070,14 @@ class Factories:
|
|
|
return incident
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_incident_activity(incident, type, comment=None, user=None):
|
|
|
return IncidentActivity.objects.create(
|
|
|
incident=incident, type=type, comment=comment, user=user
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_alert_rule(
|
|
|
organization,
|
|
|
projects,
|
|
@@ -1085,6 +1132,7 @@ class Factories:
|
|
|
return alert_rule
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_alert_rule_trigger(alert_rule, label=None, alert_threshold=100):
|
|
|
if not label:
|
|
|
label = petname.Generate(2, " ", letters=10).title()
|
|
@@ -1092,6 +1140,7 @@ class Factories:
|
|
|
return create_alert_rule_trigger(alert_rule, label, alert_threshold)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_incident_trigger(incident, alert_rule_trigger, status=None):
|
|
|
if status is None:
|
|
|
status = TriggerStatus.ACTIVE.value
|
|
@@ -1101,6 +1150,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_alert_rule_trigger_action(
|
|
|
trigger,
|
|
|
type=AlertRuleTriggerAction.Type.EMAIL,
|
|
@@ -1121,6 +1171,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_external_user(user: User, **kwargs: Any) -> ExternalActor:
|
|
|
kwargs.setdefault("provider", ExternalProviders.GITHUB.value)
|
|
|
kwargs.setdefault("external_name", "")
|
|
@@ -1128,6 +1179,7 @@ class Factories:
|
|
|
return ExternalActor.objects.create(actor=user.actor, **kwargs)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_external_team(team: Team, **kwargs: Any) -> ExternalActor:
|
|
|
kwargs.setdefault("provider", ExternalProviders.GITHUB.value)
|
|
|
kwargs.setdefault("external_name", "@getsentry/ecosystem")
|
|
@@ -1135,6 +1187,7 @@ class Factories:
|
|
|
return ExternalActor.objects.create(actor=team.actor, **kwargs)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_codeowners(project, code_mapping, **kwargs):
|
|
|
kwargs.setdefault("raw", "")
|
|
|
|
|
@@ -1143,6 +1196,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_slack_integration(
|
|
|
organization: Organization, external_id: str, **kwargs: Any
|
|
|
) -> Integration:
|
|
@@ -1159,6 +1213,7 @@ class Factories:
|
|
|
return integration
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_integration(
|
|
|
organization: Organization, external_id: str, **kwargs: Any
|
|
|
) -> Integration:
|
|
@@ -1168,6 +1223,7 @@ class Factories:
|
|
|
return integration
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_identity_provider(integration: Integration, **kwargs: Any) -> IdentityProvider:
|
|
|
return IdentityProvider.objects.create(
|
|
|
type=integration.provider,
|
|
@@ -1176,6 +1232,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_identity(
|
|
|
user: User, identity_provider: IdentityProvider, external_id: str, **kwargs: Any
|
|
|
) -> Identity:
|
|
@@ -1188,6 +1245,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_group_history(
|
|
|
group: Group,
|
|
|
status: int,
|
|
@@ -1216,6 +1274,7 @@ class Factories:
|
|
|
)
|
|
|
|
|
|
@staticmethod
|
|
|
+ @exempt_from_silo_limits()
|
|
|
def create_comment(issue, project, user, text="hello world"):
|
|
|
data = {"text": text}
|
|
|
return Activity.objects.create(
|