# What this PR does After deploying [`r439-v1.12.0`](https://github.com/grafana/oncall-private/releases/tag/r439-v1.12.0) to staging, I noticed that the migrations were taking a long time, and caused some wonkiness (see https://raintank-corp.slack.com/archives/C08063QES5N). ```bash Apply all migrations: [redacted secret grafana-admin-creds:admin-user], alerts, auth, auth_token, base, contenttypes, email, exotel, fcm_django, google, heartbeat, labels, mobile_app, oss_installation, phone_notifications, schedules, sessions, slack, social_django, telegram, twilioapp, user_management, webhooks, zvonok Running migrations: source=engine:app google_trace_id=none logger=apps.alerts.migrations.0063_migrate_channelfilter_slack_channel_id Starting migration to populate slack_channel field. source=engine:app google_trace_id=none logger=apps.alerts.migrations.0063_migrate_channelfilter_slack_channel_id Bulk updated 1 ChannelFilters with their Slack channel. source=engine:app google_trace_id=none logger=apps.alerts.migrations.0063_migrate_channelfilter_slack_channel_id Finished migration to populate slack_channel field. Applying alerts.0063_migrate_channelfilter_slack_channel_id... OK source=engine:app google_trace_id=none logger=apps.alerts.migrations.0064_migrate_resolutionnoteslackmessage_slack_channel_id Starting migration to populate slack_channel field. source=engine:app google_trace_id=none logger=apps.alerts.migrations.0064_migrate_resolutionnoteslackmessage_slack_channel_id Bulk updated 1 ResolutionNoteSlackMessage records with their Slack channel. source=engine:app google_trace_id=none logger=apps.alerts.migrations.0064_migrate_resolutionnoteslackmessage_slack_channel_id Finished migration to populate slack_channel field. Applying alerts.0064_migrate_resolutionnoteslackmessage_slack_channel_id... OK source=engine:app google_trace_id=none logger=apps.schedules.migrations.0019_auto_20241021_1735 Starting migration to populate slack_channel field. source=engine:app google_trace_id=none logger=apps.schedules.migrations.0019_auto_20241021_1735 Bulk updated 6 OnCallSchedules with their Slack channel. source=engine:app google_trace_id=none logger=apps.schedules.migrations.0019_auto_20241021_1735 Finished migration to populate slack_channel field. Applying schedules.0019_auto_20241021_1735... OK source=engine:app google_trace_id=none logger=apps.user_management.migrations.0026_auto_20241017_1919 Starting migration to populate default_slack_channel field. source=engine:app google_trace_id=none logger=apps.user_management.migrations.0026_auto_20241017_1919 Bulk updated 1 organizations with their default Slack channel. source=engine:app google_trace_id=none logger=apps.user_management.migrations.0026_auto_20241017_1919 Finished migration to populate default_slack_channel field. Applying user_management.0026_auto_20241017_1919... OK ``` **NOTE**: wrt these migrations already being run for certain OSS stacks; it shouldn't have much of an impact on OSS deployments, as it's really only an issue for _very large_ versions of these tables (particularly the `ResolutionNoteSlackMessage` table, which by its nature, has a tendency to generate a lot of data). ## Checklist - [ ] Unit, integration, and e2e (if applicable) tests updated - [ ] Documentation added (or `pr:no public docs` PR label added if not required) - [ ] Added the relevant release notes label (see labels prefixed w/ `release:`). These labels dictate how your PR will show up in the autogenerated release notes.
43 lines
1.6 KiB
Python
43 lines
1.6 KiB
Python
# Generated by Django 4.2.15 on 2024-10-17 19:19
|
|
import logging
|
|
|
|
from django.db import migrations
|
|
import django_migration_linter as linter
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def populate_default_slack_channel(apps, schema_editor):
|
|
Organization = apps.get_model("user_management", "Organization")
|
|
SlackChannel = apps.get_model("slack", "SlackChannel")
|
|
|
|
logger.info("Starting migration to populate default_slack_channel field.")
|
|
|
|
sql = f"""
|
|
UPDATE {Organization._meta.db_table} AS org
|
|
JOIN {SlackChannel._meta.db_table} AS sc ON sc.slack_id = org.general_log_channel_id
|
|
AND sc.slack_team_identity_id = org.slack_team_identity_id
|
|
SET org.default_slack_channel_id = sc.id
|
|
WHERE org.general_log_channel_id IS NOT NULL
|
|
AND org.slack_team_identity_id IS NOT NULL;
|
|
"""
|
|
|
|
with schema_editor.connection.cursor() as cursor:
|
|
cursor.execute(sql)
|
|
updated_rows = cursor.rowcount # Number of rows updated
|
|
|
|
logger.info(f"Bulk updated {updated_rows} organizations with their default Slack channel.")
|
|
logger.info("Finished migration to populate default_slack_channel field.")
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
dependencies = [
|
|
("user_management", "0025_organization_default_slack_channel"),
|
|
]
|
|
|
|
operations = [
|
|
# simply setting this new field is okay, we are not deleting the value of general_log_channel_id
|
|
# therefore, no need to revert it
|
|
linter.IgnoreMigration(),
|
|
migrations.RunPython(populate_default_slack_channel, migrations.RunPython.noop),
|
|
]
|