migrations: Backfill audit log entries for remote server creation.

This is a follow-up to #20408.
This commit is contained in:
Eeshan Garg 2021-12-30 17:51:38 -05:00 committed by Tim Abbott
parent 15e8717847
commit 4cc35c339b
3 changed files with 84 additions and 20 deletions

View File

@ -1,8 +1,10 @@
from argparse import ArgumentParser
from typing import Any
from django.db import transaction
from zerver.lib.management import ZulipBaseCommand
from zilencer.models import RemoteZulipServer
from zilencer.models import RemoteZulipServer, RemoteZulipServerAuditLog
class Command(ZulipBaseCommand):
@ -18,9 +20,15 @@ class Command(ZulipBaseCommand):
group.add_argument("--email", "-e", required=True, help="a contact email address")
def handle(self, *args: Any, **options: Any) -> None:
RemoteZulipServer.objects.create(
uuid=options["uuid"],
api_key=options["key"],
hostname=options["hostname"],
contact_email=options["email"],
)
with transaction.atomic():
remote_server = RemoteZulipServer.objects.create(
uuid=options["uuid"],
api_key=options["key"],
hostname=options["hostname"],
contact_email=options["email"],
)
RemoteZulipServerAuditLog.objects.create(
event_type=RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED,
server=remote_server,
event_time=remote_server.last_updated,
)

View File

@ -0,0 +1,45 @@
from django.db import migrations
from django.db.backends.postgresql.schema import DatabaseSchemaEditor
from django.db.migrations.state import StateApps
def backfill_remote_zulip_server_creation_log_events(
apps: StateApps, schema_editor: DatabaseSchemaEditor
) -> None:
RemoteZulipServer = apps.get_model("zilencer", "RemoteZulipServer")
RemoteZulipServerAuditLog = apps.get_model("zilencer", "RemoteZulipServerAuditLog")
RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED = 10215
objects_to_create = []
for remote_server in RemoteZulipServer.objects.all():
entry = RemoteZulipServerAuditLog(
server=remote_server,
event_type=RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED,
event_time=remote_server.last_updated,
backfilled=True,
)
objects_to_create.append(entry)
RemoteZulipServerAuditLog.objects.bulk_create(objects_to_create)
def reverse_code(apps: StateApps, schema_editor: DatabaseSchemaEditor) -> None:
RemoteZulipServerAuditLog = apps.get_model("zilencer", "RemoteZulipServerAuditLog")
RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED = 10215
RemoteZulipServerAuditLog.objects.filter(
event_type=RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED, backfilled=True
).delete()
class Migration(migrations.Migration):
dependencies = [
("zilencer", "0021_alter_remotezulipserver_uuid"),
]
operations = [
migrations.RunPython(
backfill_remote_zulip_server_creation_log_events,
reverse_code=reverse_code,
elidable=True,
)
]

View File

@ -40,6 +40,7 @@ from zilencer.models import (
RemoteRealmAuditLog,
RemoteRealmCount,
RemoteZulipServer,
RemoteZulipServerAuditLog,
)
logger = logging.getLogger(__name__)
@ -108,20 +109,30 @@ def register_remote_server(
except ValidationError as e:
raise JsonableError(e.message)
remote_server, created = RemoteZulipServer.objects.get_or_create(
uuid=zulip_org_id,
defaults={"hostname": hostname, "contact_email": contact_email, "api_key": zulip_org_key},
)
if not created:
if remote_server.api_key != zulip_org_key:
raise InvalidZulipServerKeyError(zulip_org_id)
with transaction.atomic():
remote_server, created = RemoteZulipServer.objects.get_or_create(
uuid=zulip_org_id,
defaults={
"hostname": hostname,
"contact_email": contact_email,
"api_key": zulip_org_key,
},
)
if created:
RemoteZulipServerAuditLog.objects.create(
event_type=RemoteZulipServerAuditLog.REMOTE_SERVER_CREATED,
server=remote_server,
event_time=remote_server.last_updated,
)
else:
remote_server.hostname = hostname
remote_server.contact_email = contact_email
if new_org_key is not None:
remote_server.api_key = new_org_key
remote_server.save()
if remote_server.api_key != zulip_org_key:
raise InvalidZulipServerKeyError(zulip_org_id)
else:
remote_server.hostname = hostname
remote_server.contact_email = contact_email
if new_org_key is not None:
remote_server.api_key = new_org_key
remote_server.save()
return json_success({"created": created})