diff --git a/src/Squidex.Infrastructure/Migrations/Migrator.cs b/src/Squidex.Infrastructure/Migrations/Migrator.cs index 0ba832d9e..7d10a20ec 100644 --- a/src/Squidex.Infrastructure/Migrations/Migrator.cs +++ b/src/Squidex.Infrastructure/Migrations/Migrator.cs @@ -5,6 +5,7 @@ // All rights reserved. Licensed under the MIT license. // ========================================================================== +using System; using System.Linq; using System.Threading.Tasks; using Squidex.Infrastructure.Log; @@ -66,12 +67,24 @@ namespace Squidex.Infrastructure.Migrations .WriteProperty("status", "Started") .WriteProperty("migrator", name)); - using (log.MeasureInformation(w => w - .WriteProperty("action", "Migration") - .WriteProperty("status", "Completed") - .WriteProperty("migrator", name))) + try + { + using (log.MeasureInformation(w => w + .WriteProperty("action", "Migration") + .WriteProperty("status", "Completed") + .WriteProperty("migrator", name))) + { + await migration.UpdateAsync(); + } + } + catch (Exception ex) { - await migration.UpdateAsync(); + log.LogFatal(ex, w => w + .WriteProperty("action", "Migration") + .WriteProperty("status", "Failed") + .WriteProperty("migrator", name)); + + throw; } } diff --git a/src/Squidex/Config/Domain/StoreServices.cs b/src/Squidex/Config/Domain/StoreServices.cs index 230264117..586dc232c 100644 --- a/src/Squidex/Config/Domain/StoreServices.cs +++ b/src/Squidex/Config/Domain/StoreServices.cs @@ -73,7 +73,7 @@ namespace Squidex.Config.Domain services.AddTransientAs() .As(); - services.AddTransientAs() + services.AddTransientAs() .As(); services.AddHealthChecks() diff --git a/tests/Squidex.Infrastructure.Tests/Migrations/MigratorTests.cs b/tests/Squidex.Infrastructure.Tests/Migrations/MigratorTests.cs index df56ca42b..2a9addcae 100644 --- a/tests/Squidex.Infrastructure.Tests/Migrations/MigratorTests.cs +++ b/tests/Squidex.Infrastructure.Tests/Migrations/MigratorTests.cs @@ -89,11 +89,15 @@ namespace Squidex.Infrastructure.Migrations await sut.MigrateAsync(); - A.CallTo(() => migrator_0_1.UpdateAsync()).MustHaveHappened(); - A.CallTo(() => migrator_1_2.UpdateAsync()).MustHaveHappened(); - A.CallTo(() => migrator_2_3.UpdateAsync()).MustHaveHappened(); - - A.CallTo(() => status.UnlockAsync(3)).MustHaveHappened(); + A.CallTo(() => migrator_0_1.UpdateAsync()) + .MustHaveHappened(); + A.CallTo(() => migrator_1_2.UpdateAsync()) + .MustHaveHappened(); + A.CallTo(() => migrator_2_3.UpdateAsync()) + .MustHaveHappened(); + + A.CallTo(() => status.UnlockAsync(3)) + .MustHaveHappened(); } [Fact] @@ -109,9 +113,12 @@ namespace Squidex.Infrastructure.Migrations await Assert.ThrowsAsync(sut.MigrateAsync); - A.CallTo(() => migrator_0_1.UpdateAsync()).MustHaveHappened(); - A.CallTo(() => migrator_1_2.UpdateAsync()).MustHaveHappened(); - A.CallTo(() => migrator_2_3.UpdateAsync()).MustNotHaveHappened(); + A.CallTo(() => migrator_0_1.UpdateAsync()) + .MustHaveHappened(); + A.CallTo(() => migrator_1_2.UpdateAsync()) + .MustHaveHappened(); + A.CallTo(() => migrator_2_3.UpdateAsync()) + .MustNotHaveHappened(); A.CallTo(() => status.UnlockAsync(0)).MustHaveHappened(); } @@ -126,8 +133,32 @@ namespace Squidex.Infrastructure.Migrations await Task.WhenAll(Enumerable.Repeat(0, 10).Select(x => Task.Run(sut.MigrateAsync))); - A.CallTo(() => migrator_0_1.UpdateAsync()).MustHaveHappened(1, Times.Exactly); - A.CallTo(() => migrator_1_2.UpdateAsync()).MustHaveHappened(1, Times.Exactly); + A.CallTo(() => migrator_0_1.UpdateAsync()) + .MustHaveHappened(1, Times.Exactly); + A.CallTo(() => migrator_1_2.UpdateAsync()) + .MustHaveHappened(1, Times.Exactly); + } + + [Fact] + public async Task Should_log_exception_when_migration_failed() + { + var migrator_0_1 = BuildMigration(0, 1); + var migrator_1_2 = BuildMigration(1, 2); + + var ex = new InvalidOperationException(); + + A.CallTo(() => migrator_0_1.UpdateAsync()) + .Throws(ex); + + var sut = new Migrator(status, path, log); + + await Assert.ThrowsAsync(() => sut.MigrateAsync()); + + A.CallTo(() => log.Log(SemanticLogLevel.Fatal, default, A>.Ignored)) + .MustHaveHappened(); + + A.CallTo(() => migrator_1_2.UpdateAsync()) + .MustNotHaveHappened(); } private IMigration BuildMigration(int fromVersion, int toVersion) diff --git a/tools/Migrate_01/MigrationPath.cs b/tools/Migrate_01/MigrationPath.cs index f9938d14e..13d0b16fc 100644 --- a/tools/Migrate_01/MigrationPath.cs +++ b/tools/Migrate_01/MigrationPath.cs @@ -103,16 +103,10 @@ namespace Migrate_01 yield return serviceProvider.GetRequiredService(); } - // Version 16: Introduce file name slugs for assets. - if (version < 16) - { - yield return serviceProvider.GetRequiredService(); - } - // Version 17: Rename slug field. if (version < 17) { - yield return serviceProvider.GetService(); + yield return serviceProvider.GetService(); } // Version 18: Rebuild assets. @@ -121,6 +115,12 @@ namespace Migrate_01 yield return serviceProvider.GetService(); } + // Version 16: Introduce file name slugs for assets. + if (version < 16) + { + yield return serviceProvider.GetRequiredService(); + } + yield return serviceProvider.GetRequiredService(); } } diff --git a/tools/Migrate_01/Migrations/MongoDb/RenameSlugField.cs b/tools/Migrate_01/Migrations/MongoDb/RenameAssetSlugField.cs similarity index 88% rename from tools/Migrate_01/Migrations/MongoDb/RenameSlugField.cs rename to tools/Migrate_01/Migrations/MongoDb/RenameAssetSlugField.cs index 061600643..1fcfad042 100644 --- a/tools/Migrate_01/Migrations/MongoDb/RenameSlugField.cs +++ b/tools/Migrate_01/Migrations/MongoDb/RenameAssetSlugField.cs @@ -12,11 +12,11 @@ using Squidex.Infrastructure.Migrations; namespace Migrate_01.Migrations.MongoDb { - public sealed class RenameSlugField : IMigration + public sealed class RenameAssetSlugField : IMigration { private readonly IMongoDatabase database; - public RenameSlugField(IMongoDatabase database) + public RenameAssetSlugField(IMongoDatabase database) { this.database = database; }