Skip to content

Commit

Permalink
Altered configuration upgrade to be opt-in.
Browse files Browse the repository at this point in the history
  • Loading branch information
CraigHawker committed Dec 12, 2023
1 parent 080c29c commit cafce32
Show file tree
Hide file tree
Showing 7 changed files with 44 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public partial class ConfigurationUpgradeManager
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_NoUpgradePathsDefined()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(false, c.TryGetDeclaredConfigurationUpgrades<VersionZero>(out var configurationVersion, out var rules));
Assert.AreEqual("0.0", configurationVersion?.ToString());
Assert.AreEqual(0, rules.Count());
Expand All @@ -27,7 +27,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_NoUpgradeP
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToOneUpgradeWithInstanceUpgradePath()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionOneWithInstanceUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("1.0", configurationVersion?.ToString());
Assert.AreEqual(1, rules.Count());
Expand All @@ -38,7 +38,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToOneU
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToOneUpgradeWithInstanceUpgradePath_WithoutConfigurationAttribute()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionOneWithoutConfigurationAttributeInstanceUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("1.0", configurationVersion?.ToString());
Assert.AreEqual(1, rules.Count());
Expand All @@ -50,7 +50,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToOneU
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToOneWithStaticUpgradePath()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionOneWithStaticUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("1.0", configurationVersion?.ToString());
Assert.AreEqual(1, rules.Count());
Expand All @@ -61,7 +61,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToOneW
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_OneToTwoWithStaticUpgradePath_WithJsonParameter()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionTwoWithStaticUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("2.0", configurationVersion?.ToString());
Assert.AreEqual(2, rules.Count());
Expand All @@ -74,7 +74,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_OneToTwoWi
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToTwoUpgradeWithInstanceUpgradePath()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionTwoWithInstanceUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("2.0", configurationVersion?.ToString());
Assert.AreEqual(2, rules.Count());
Expand All @@ -87,7 +87,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToTwoU
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToThreeUpgradeWithInstanceUpgradePath()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionThreeWithInstanceUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("3.0", configurationVersion?.ToString());
Assert.AreEqual(3, rules.Count());
Expand All @@ -104,7 +104,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ZeroToThre
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ThreeToFourUpgradeWithInstanceUpgradePath_WithJsonParameter()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionFourWithInstanceUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("4.0", configurationVersion?.ToString());
Assert.AreEqual(4, rules.Count());
Expand All @@ -122,7 +122,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_ThreeToFou
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_FourToFiveUpgradeWithInstanceUpgradePath()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionFiveWithInstanceUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("5.0", configurationVersion?.ToString());
Assert.AreEqual(5, rules.Count());
Expand All @@ -142,7 +142,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_FourToFive
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_FiveToSixUpgradeWithInstanceUpgradePath()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionSixWithInstanceUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("6.0", configurationVersion?.ToString());
Assert.AreEqual(6, rules.Count());
Expand All @@ -167,7 +167,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_FiveToSixU
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnNewest_CyclicUpgradeRule()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(false, c.TryGetDeclaredConfigurationUpgrades<CyclicUpgradeRule2>(out var configurationVersion, out var rules));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ public partial class ConfigurationUpgradeManager
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_AllUpgradePathsIdentified()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionThreeWithStaticUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("3.0", configurationVersion?.ToString());
Assert.AreEqual(3, rules.Count());
Expand All @@ -37,14 +37,14 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_AllUpgrade
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_CyclicUpgradeRule()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(false, c.TryGetDeclaredConfigurationUpgrades<CyclicUpgradeRule2>(out var configurationVersion, out var rules));
}

[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_CyclicUpgradeRule_Same()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(false, c.TryGetDeclaredConfigurationUpgrades<CyclicUpgradeRule_Same>(out var configurationVersion, out var rules));
}

Expand All @@ -55,7 +55,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_CyclicUpgr
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_IdentifiesStringParameterMethod()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionFourWithStaticUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("4.0", configurationVersion?.ToString());
Assert.AreEqual(4, rules.Count());
Expand All @@ -76,7 +76,7 @@ public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_Identifies
[TestMethod]
public void TryGetDeclaredConfigurationUpgrades_UpgradeMethodOnOldest_IdentifiesJObjectParameterMethod()
{
var c = new VAF.Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
var c = new VAF.Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>());
Assert.AreEqual(true, c.TryGetDeclaredConfigurationUpgrades<VersionFiveWithStaticUpgradePath>(out var configurationVersion, out var rules));
Assert.AreEqual("5.0", configurationVersion?.ToString());
Assert.AreEqual(5, rules.Count());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public void UpgradeConfiguration_ZeroToOneNoExistingConfiguration()
{
var vault = this.GetVaultMock().Object;
var managerMock = this.GetNamedValueStorageManagerMock();
var c = new Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
var c = new Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
{
NamedValueStorageManager = managerMock.Object
};
Expand All @@ -106,7 +106,7 @@ public void UpgradeConfiguration_ZeroToOneUpgradeWithInstanceUpgradePath()
"Castle.Proxies.VaultApplicationBaseProxy",
this.CreateNamedValues("config", Newtonsoft.Json.JsonConvert.SerializeObject(source))
);
var c = new Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
var c = new Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
{
NamedValueStorageManager = managerMock.Object
};
Expand Down Expand Up @@ -136,7 +136,7 @@ public void EnsureLatestSerializationSettings_TimeSpan_FromStringToSeparateEleme
"Castle.Proxies.VaultApplicationBaseProxy",
this.CreateNamedValues("configuration", @"{ ""World"" : ""abc"", ""Version"" : ""3.0"", ""TimeSpan"" : { ""Interval"" : ""01:02:03"", ""RunOnVaultStartup"" : false } }")
);
var c = new Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
var c = new Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
{
NamedValueStorageManager = managerMock.Object
};
Expand Down Expand Up @@ -166,7 +166,7 @@ public void EnsureLatestSerializationSettings_TimeSpan_FromStringToSeparateEleme
"Castle.Proxies.VaultApplicationBaseProxy",
this.CreateNamedValues("configuration", @"{ ""Version"" : ""3.0"", ""TimeSpan"" : { ""Interval"" : ""01:02:03"", ""RunOnVaultStartup"" : false }, ""TimeSpan-Comment"": ""hello world"" }")
);
var c = new Extensions.Configuration.Upgrading.ConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
var c = new Extensions.Configuration.Upgrading.DefaultConfigurationUpgradeManager(Mock.Of<VaultApplicationBase>())
{
NamedValueStorageManager = managerMock.Object
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,13 @@ public abstract partial class ConfigurableVaultApplicationBase<TSecureConfigurat
/// Returns the instance of <see cref="IConfigurationUpgradeManager"/> that will be used
/// to upgrade any configuration found.
/// </summary>
/// <returns></returns>
/// <returns>
/// <see langword="null"/> by default.
/// Return an instance of something that inherits <see cref="IConfigurationUpgradeManager"/>,
/// for example <see cref="DefaultConfigurationUpgradeManager"/>, to control configuration upgrading.
/// </returns>
public virtual IConfigurationUpgradeManager GetConfigurationUpgradeManager()
{
return new ConfigurationUpgradeManager(this);
}
=> null;

/// <inheritdoc />
/// <remarks>Will call <see cref="UpgradeConfiguration"/> then call the base implementation.</remarks>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,10 @@

namespace MFiles.VAF.Extensions.Configuration.Upgrading
{
public class ConfigurationUpgradeManager
public class DefaultConfigurationUpgradeManager
: IConfigurationUpgradeManager
{
private ILogger Logger { get; } = LogManager.GetLogger(typeof(ConfigurationUpgradeManager));
private ILogger Logger { get; } = LogManager.GetLogger(typeof(DefaultConfigurationUpgradeManager));

/// <summary>
/// The NamedValueStorageManager used to interact with named value storage.
Expand All @@ -34,7 +34,7 @@ public class ConfigurationUpgradeManager
/// </summary>
protected VaultApplicationBase VaultApplication { get; set; }

public ConfigurationUpgradeManager(VaultApplicationBase vaultApplication)
public DefaultConfigurationUpgradeManager(VaultApplicationBase vaultApplication)
{
this.VaultApplication = vaultApplication ?? throw new ArgumentNullException(nameof(vaultApplication));
}
Expand Down
13 changes: 13 additions & 0 deletions MFiles.VAF.Extensions/Configuration/Upgrading/Readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,19 @@ When using the `ConfigurableVaultApplicationBase<T>` class, changes to the struc

This library supports the ability for you to programmatically control the upgrade process so that the application can convert any old configuration across to the new structures and continue loading.

## Enabling the functionality

Within your VaultApplication class, override `GetConfigurationUpgradeManager` and return an instance of something that implements `IConfigurationUpgradeManager`. The default implementation is within `DefaultConfigurationUpgradeManager`:

```csharp
public override IConfigurationUpgradeManager GetConfigurationUpgradeManager()
{
return new DefaultConfigurationUpgradeManager(this);
}
```

The configuration upgrade process will now run whenever the vault comes online.

## Adding versioning to your configuration class

Consider that we wish to make a change to the configuration structure but wish to be able to migrate the old configuration across. Consider these configuration classes:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -258,7 +258,7 @@ public static ISingleNamedValueItem GetConfigurationLocation(this Type configura
/// </summary>
/// <param name="configurationType">The configuration type to check.</param>
/// <param name="vaultApplication">The vault application to fall back to.</param>
/// <param name="configurationVersion">The version of the configuration, or <see cref="ConfigurationUpgradeManager.VersionZero"/> if none is available.</param>
/// <param name="configurationVersion">The version of the configuration, or <see cref="DefaultConfigurationUpgradeManager.VersionZero"/> if none is available.</param>
/// <returns>The location in named value storage.</returns>
/// <exception cref="ArgumentNullException">If <paramref name="configurationType"/> or <paramref name="vaultApplication"/> are null.</exception>
public static ISingleNamedValueItem GetConfigurationLocation(this Type configurationType, VaultApplicationBase vaultApplication, out Version configurationVersion)
Expand All @@ -274,7 +274,7 @@ public static ISingleNamedValueItem GetConfigurationLocation(this Type configura
.Where(a => a is Configuration.ConfigurationVersionAttribute)
.Cast<Configuration.ConfigurationVersionAttribute>()
.FirstOrDefault();
configurationVersion = parameterTypeConfigurationVersionAttribute?.Version ?? ConfigurationUpgradeManager.VersionZero;
configurationVersion = parameterTypeConfigurationVersionAttribute?.Version ?? DefaultConfigurationUpgradeManager.VersionZero;

// Where should we read from? (Use the configuration attribute if we can, otherwise default to vault application location.
return (parameterTypeConfigurationVersionAttribute?.UsesCustomNVSLocation ?? false)
Expand Down

0 comments on commit cafce32

Please sign in to comment.