diff --git a/CHANGELOG.md b/CHANGELOG.md index d0bbed6b6d..266d3bb44e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -21,6 +21,8 @@ For details about compatibility between different releases, see the **Commitment - Potential leak of end devices of other (owned) applications in the top end devices panel in the application overview of the Console. - Fix reversed Join Server dev nonce metrics. +- Identity Server's store runs each migration within a transaction, so a migration's changes are only applied if all of its queries are successful. + - Identity Server's store now marks a migration as successful after all its operations are finished. Previously it was possible to have a successful migration which not all of its queries were processed. ### Security diff --git a/cmd/ttn-lw-stack/commands/is_db.go b/cmd/ttn-lw-stack/commands/is_db.go index 297f1d5744..1003494ebc 100644 --- a/cmd/ttn-lw-stack/commands/is_db.go +++ b/cmd/ttn-lw-stack/commands/is_db.go @@ -25,6 +25,7 @@ import ( bunstore "go.thethings.network/lorawan-stack/v3/pkg/identityserver/bunstore" "go.thethings.network/lorawan-stack/v3/pkg/identityserver/store" ismigrations "go.thethings.network/lorawan-stack/v3/pkg/identityserver/store/migrations" + "go.thethings.network/lorawan-stack/v3/pkg/log" "go.thethings.network/lorawan-stack/v3/pkg/ttnpb" ttntypes "go.thethings.network/lorawan-stack/v3/pkg/types" storeutil "go.thethings.network/lorawan-stack/v3/pkg/util/store" @@ -42,6 +43,36 @@ var ( return fmt.Errorf("init command deprecated, use migrate instead") }, } + isDBStatusCommand = &cobra.Command{ + Use: "status", + Short: "Check the migration status of the Identity Server database", + RunE: func(cmd *cobra.Command, _ []string) error { + logger.WithField("URI", config.IS.DatabaseURI).Info("Connecting to Identity Server database...") + + sqlDB, err := storeutil.OpenDB(cmd.Context(), config.IS.DatabaseURI) + if err != nil { + return err + } + defer sqlDB.Close() + + bunDB := bun.NewDB(sqlDB, pgdialect.New()) + + migrator := migrate.NewMigrator(bunDB, ismigrations.Migrations, migrate.WithMarkAppliedOnSuccess(true)) + + group, err := migrator.MigrationsWithStatus(ctx) + if err != nil { + return err + } + + log.FromContext(ctx). + WithField("migrations", group). + WithField("unapplied_migrations", group.Unapplied()). + WithField("applied_migrations", group.Applied()). + Info("Status fetched") + + return nil + }, + } isDBMigrateCommand = &cobra.Command{ Use: "migrate", Short: "Migrate the Identity Server database", @@ -56,7 +87,7 @@ var ( bunDB := bun.NewDB(sqlDB, pgdialect.New()) - migrator := migrate.NewMigrator(bunDB, ismigrations.Migrations) + migrator := migrate.NewMigrator(bunDB, ismigrations.Migrations, migrate.WithMarkAppliedOnSuccess(true)) err = migrator.Init(cmd.Context()) if err != nil { @@ -68,10 +99,10 @@ var ( return err } if migrations := status.Applied(); len(migrations) > 0 { - logger.Infof("Applied: %s", status) + logger.Infof("Applied: %s", migrations) } if migrations := status.Unapplied(); len(migrations) > 0 { - logger.Infof("Unapplied: %s", status) + logger.Infof("Unapplied: %s", migrations) } var group *migrate.MigrationGroup @@ -373,6 +404,7 @@ func init() { isDBCommand.AddCommand(isDBInitCommand) isDBMigrateCommand.Flags().Bool("rollback", false, "Rollback most recent migration group") isDBCommand.AddCommand(isDBMigrateCommand) + isDBCommand.AddCommand(isDBStatusCommand) isDBCleanupCommand.Flags().Bool("dry-run", false, "Dry run") isDBCommand.AddCommand(isDBCleanupCommand) isDBEUIBlockCreationCommand.Flags().Bool("use-config", false, "Create block using values from config") diff --git a/pkg/identityserver/store/migrations/20220726092000_account_views.down.sql b/pkg/identityserver/store/migrations/20220726092000_account_views.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220726092000_account_views.down.sql rename to pkg/identityserver/store/migrations/20220726092000_account_views.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20220726092000_account_views.up.sql b/pkg/identityserver/store/migrations/20220726092000_account_views.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220726092000_account_views.up.sql rename to pkg/identityserver/store/migrations/20220726092000_account_views.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20220726093000_membership_views.down.sql b/pkg/identityserver/store/migrations/20220726093000_membership_views.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220726093000_membership_views.down.sql rename to pkg/identityserver/store/migrations/20220726093000_membership_views.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20220726093000_membership_views.up.sql b/pkg/identityserver/store/migrations/20220726093000_membership_views.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220726093000_membership_views.up.sql rename to pkg/identityserver/store/migrations/20220726093000_membership_views.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20220802000000_enddevice-cac.down.sql b/pkg/identityserver/store/migrations/20220802000000_enddevice-cac.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220802000000_enddevice-cac.down.sql rename to pkg/identityserver/store/migrations/20220802000000_enddevice-cac.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20220802000000_enddevice-cac.up.sql b/pkg/identityserver/store/migrations/20220802000000_enddevice-cac.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220802000000_enddevice-cac.up.sql rename to pkg/identityserver/store/migrations/20220802000000_enddevice-cac.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.down.sql b/pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.down.sql rename to pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.up.sql b/pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.up.sql rename to pkg/identityserver/store/migrations/20220808000000_optimize_membership_views.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.down.sql b/pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.down.sql rename to pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.up.sql b/pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.up.sql rename to pkg/identityserver/store/migrations/20220913000000_update_gtw_eui_index.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20221207000000_serial_number_field.down.sql b/pkg/identityserver/store/migrations/20221207000000_serial_number_field.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20221207000000_serial_number_field.down.sql rename to pkg/identityserver/store/migrations/20221207000000_serial_number_field.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20221207000000_serial_number_field.up.sql b/pkg/identityserver/store/migrations/20221207000000_serial_number_field.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20221207000000_serial_number_field.up.sql rename to pkg/identityserver/store/migrations/20221207000000_serial_number_field.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.down.sql b/pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.down.sql rename to pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.up.sql b/pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.up.sql rename to pkg/identityserver/store/migrations/20221208000000_lora_alliance_profile_ids.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20231206000000_email_validations.down.sql b/pkg/identityserver/store/migrations/20231206000000_email_validations.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20231206000000_email_validations.down.sql rename to pkg/identityserver/store/migrations/20231206000000_email_validations.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20231206000000_email_validations.up.sql b/pkg/identityserver/store/migrations/20231206000000_email_validations.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20231206000000_email_validations.up.sql rename to pkg/identityserver/store/migrations/20231206000000_email_validations.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.down.sql b/pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.down.sql rename to pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.up.sql b/pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.up.sql rename to pkg/identityserver/store/migrations/20231211000000_organization_notification_fanout.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20240100200000_contact_info_removal.up.sql b/pkg/identityserver/store/migrations/20240100200000_contact_info_removal.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20240100200000_contact_info_removal.up.sql rename to pkg/identityserver/store/migrations/20240100200000_contact_info_removal.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20240103000001_console_preferences.down.sql b/pkg/identityserver/store/migrations/20240103000001_console_preferences.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20240103000001_console_preferences.down.sql rename to pkg/identityserver/store/migrations/20240103000001_console_preferences.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20240103000001_console_preferences.up.sql b/pkg/identityserver/store/migrations/20240103000001_console_preferences.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20240103000001_console_preferences.up.sql rename to pkg/identityserver/store/migrations/20240103000001_console_preferences.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20240103000002_user_bookmarks.down.sql b/pkg/identityserver/store/migrations/20240103000002_user_bookmarks.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20240103000002_user_bookmarks.down.sql rename to pkg/identityserver/store/migrations/20240103000002_user_bookmarks.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20240103000002_user_bookmarks.up.sql b/pkg/identityserver/store/migrations/20240103000002_user_bookmarks.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20240103000002_user_bookmarks.up.sql rename to pkg/identityserver/store/migrations/20240103000002_user_bookmarks.tx.up.sql diff --git a/pkg/identityserver/store/migrations/20240806000000_user_rights.down.sql b/pkg/identityserver/store/migrations/20240806000000_user_rights.tx.down.sql similarity index 100% rename from pkg/identityserver/store/migrations/20240806000000_user_rights.down.sql rename to pkg/identityserver/store/migrations/20240806000000_user_rights.tx.down.sql diff --git a/pkg/identityserver/store/migrations/20240806000000_user_rights.up.sql b/pkg/identityserver/store/migrations/20240806000000_user_rights.tx.up.sql similarity index 100% rename from pkg/identityserver/store/migrations/20240806000000_user_rights.up.sql rename to pkg/identityserver/store/migrations/20240806000000_user_rights.tx.up.sql