Browse Source

* Fix migration path.

* Log proper error when migration fails.
pull/403/head
Sebastian Stehle 7 years ago
parent
commit
314c2fa13c
  1. 23
      src/Squidex.Infrastructure/Migrations/Migrator.cs
  2. 2
      src/Squidex/Config/Domain/StoreServices.cs
  3. 51
      tests/Squidex.Infrastructure.Tests/Migrations/MigratorTests.cs
  4. 14
      tools/Migrate_01/MigrationPath.cs
  5. 4
      tools/Migrate_01/Migrations/MongoDb/RenameAssetSlugField.cs

23
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;
}
}

2
src/Squidex/Config/Domain/StoreServices.cs

@ -73,7 +73,7 @@ namespace Squidex.Config.Domain
services.AddTransientAs<ConvertRuleEventsJson>()
.As<IMigration>();
services.AddTransientAs<RenameSlugField>()
services.AddTransientAs<RenameAssetSlugField>()
.As<IMigration>();
services.AddHealthChecks()

51
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<ArgumentException>(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<InvalidOperationException>(() => sut.MigrateAsync());
A.CallTo(() => log.Log<None>(SemanticLogLevel.Fatal, default, A<Action<None, IObjectWriter>>.Ignored))
.MustHaveHappened();
A.CallTo(() => migrator_1_2.UpdateAsync())
.MustNotHaveHappened();
}
private IMigration BuildMigration(int fromVersion, int toVersion)

14
tools/Migrate_01/MigrationPath.cs

@ -103,16 +103,10 @@ namespace Migrate_01
yield return serviceProvider.GetRequiredService<RestructureContentCollection>();
}
// Version 16: Introduce file name slugs for assets.
if (version < 16)
{
yield return serviceProvider.GetRequiredService<CreateAssetSlugs>();
}
// Version 17: Rename slug field.
if (version < 17)
{
yield return serviceProvider.GetService<RenameSlugField>();
yield return serviceProvider.GetService<RenameAssetSlugField>();
}
// Version 18: Rebuild assets.
@ -121,6 +115,12 @@ namespace Migrate_01
yield return serviceProvider.GetService<RebuildAssets>();
}
// Version 16: Introduce file name slugs for assets.
if (version < 16)
{
yield return serviceProvider.GetRequiredService<CreateAssetSlugs>();
}
yield return serviceProvider.GetRequiredService<StartEventConsumers>();
}
}

4
tools/Migrate_01/Migrations/MongoDb/RenameSlugField.cs → 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;
}
Loading…
Cancel
Save