From 31c50632961043b252de866b0a729b6f396965de Mon Sep 17 00:00:00 2001 From: E068097 Date: Tue, 3 Dec 2024 17:27:35 +0100 Subject: [PATCH] #3023 startupOrder not supported in Edge Device Model schema --- .../Helpers/ConfigHelper.cs | 14 +++++++++++++- .../EdgeModels/EdgeModule/ModuleDialog.razor | 13 ++++++++++++- .../EdgeModule/SystemModuleDialog.razor | 15 +++++++++++++-- .../Services/ConfigService.cs | 1 + src/IoTHub.Portal.Shared/GlobalUsings.cs | 1 + .../Models/DevicePropertyType.cs | 2 +- .../Models/v1.0/EdgeModelSystemModule.cs | 2 ++ .../Models/v1.0/IoTEdgeModule.cs | 2 ++ .../Models/v1.0/IoTEdgeModule/ConfigModule.cs | 19 +++++++++++++++---- .../EdgeAgentPropertiesDesired.cs | 9 +++++++++ .../IoTEdgeModule/EdgeHubPropertiesDesired.cs | 4 ++++ .../Models/v1.0/LoRaWAN/Channel.cs | 6 ++++++ .../Models/v1.0/LoRaWAN/ClassType.cs | 2 +- .../Models/v1.0/LoRaWAN/DeduplicationMode.cs | 2 +- .../Models/v1.0/LoRaWAN/RouterConfig.cs | 11 +++++++++++ .../EdgeModels/SystemModuleDialogTest.cs | 1 + .../Helpers/ConfigHelperTest.cs | 7 ++++++- 17 files changed, 99 insertions(+), 12 deletions(-) diff --git a/src/IoTHub.Portal.Application/Helpers/ConfigHelper.cs b/src/IoTHub.Portal.Application/Helpers/ConfigHelper.cs index 30a6763c0..b175e0cfb 100644 --- a/src/IoTHub.Portal.Application/Helpers/ConfigHelper.cs +++ b/src/IoTHub.Portal.Application/Helpers/ConfigHelper.cs @@ -142,6 +142,7 @@ public static IoTEdgeModule CreateGatewayModule(Configuration config, JProperty ModuleName = module.Name, Image = module.Value["settings"]?["image"]?.Value(), ContainerCreateOptions = module.Value["settings"]?["createOptions"]?.Value(), + StartupOrder = module.Value["settings"]?["startupOrder"]?.Value() ?? 0, Status = module.Value["status"]?.Value(), }; @@ -229,6 +230,11 @@ public static Dictionary> GenerateModulesCon edgeAgentPropertiesDesired.SystemModules.EdgeAgent.Settings.CreateOptions = edgeModel.SystemModules.Single(x => x.Name == "edgeAgent").ContainerCreateOptions; } + if (edgeModel.SystemModules.Single(x => x.Name == "edgeAgent").StartupOrder > 0) + { + edgeAgentPropertiesDesired.SystemModules.EdgeAgent.Settings.StartupOrder = edgeModel.SystemModules.Single(x => x.Name == "edgeAgent").StartupOrder; + } + if (!string.IsNullOrEmpty(edgeModel.SystemModules.Single(x => x.Name == "edgeHub").Image)) { edgeAgentPropertiesDesired.SystemModules.EdgeHub.Settings.Image = edgeModel.SystemModules.Single(x => x.Name == "edgeHub").Image; @@ -241,6 +247,11 @@ public static Dictionary> GenerateModulesCon edgeAgentPropertiesDesired.SystemModules.EdgeHub.Settings.CreateOptions = edgeModel.SystemModules.Single(x => x.Name == "edgeHub").ContainerCreateOptions; } + if (edgeModel.SystemModules.Single(x => x.Name == "edgeHub").StartupOrder > 0) + { + edgeAgentPropertiesDesired.SystemModules.EdgeHub.Settings.StartupOrder = edgeModel.SystemModules.Single(x => x.Name == "edgeHub").StartupOrder; + } + foreach (var item in edgeModel.SystemModules.Single(x => x.Name == "edgeAgent").EnvironmentVariables) { edgeAgentPropertiesDesired.SystemModules.EdgeAgent.EnvironmentVariables?.Add(item.Name, new EnvironmentVariable() { EnvValue = item.Value }); @@ -262,7 +273,8 @@ public static Dictionary> GenerateModulesCon Settings = new ModuleSettings() { Image = module.Image, - CreateOptions = module.ContainerCreateOptions + CreateOptions = module.ContainerCreateOptions, + StartupOrder = module.StartupOrder, }, RestartPolicy = "always", EnvironmentVariables = new Dictionary() diff --git a/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/ModuleDialog.razor b/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/ModuleDialog.razor index dbc48e572..8c3a8a5b7 100644 --- a/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/ModuleDialog.razor +++ b/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/ModuleDialog.razor @@ -4,7 +4,7 @@ - + + + + currentEnvironmentVariables = new(); private List currentModuleIdentityTwinSettings = new(); @@ -103,6 +112,7 @@ currentImage = Module.Image; currentContainerCreateOptions = Module.ContainerCreateOptions; currentNumVersion = Module.Version; + currentStartupOrder = Module.StartupOrder; currentEnvironmentVariables = new List(Module.EnvironmentVariables.ToArray()); currentModuleIdentityTwinSettings = new List(Module.ModuleIdentityTwinSettings.ToArray()); currentCommands = new List(Module.Commands.ToArray()); @@ -115,6 +125,7 @@ Module.ModuleName = currentModuleName; Module.Image = currentImage; Module.ContainerCreateOptions = currentContainerCreateOptions; + Module.StartupOrder = currentStartupOrder; if (Portal.CloudProvider.Equals(CloudProviders.Azure)) { Module.Version = " "; } else { Module.Version = currentNumVersion; } diff --git a/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/SystemModuleDialog.razor b/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/SystemModuleDialog.razor index e1469ed9d..d7bfd8a76 100644 --- a/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/SystemModuleDialog.razor +++ b/src/IoTHub.Portal.Client/Dialogs/EdgeModels/EdgeModule/SystemModuleDialog.razor @@ -3,7 +3,7 @@ - + + + + -@code { + @code { [CascadingParameter] MudDialogInstance MudDialog { get; set; } = default!; @@ -55,6 +63,7 @@ private string currentModuleName = default!; private string currentImage = default!; private string currentContainerCreateOptions = default!; + private int currentStartupOrder; private List currentEnvironmentVariables = new(); @@ -67,6 +76,7 @@ currentModuleName = Module.Name; currentImage = Module.Image; currentContainerCreateOptions = Module.ContainerCreateOptions; + currentStartupOrder = Module.StartupOrder; currentEnvironmentVariables = new List(Module.EnvironmentVariables.ToArray()); await Task.Delay(0); IsLoading = false; @@ -77,6 +87,7 @@ Module.Name = currentModuleName; Module.Image = currentImage; Module.ContainerCreateOptions = currentContainerCreateOptions; + Module.StartupOrder = currentStartupOrder; Module.EnvironmentVariables = new List(currentEnvironmentVariables.ToArray()); MudDialog.Close(DialogResult.Ok(true)); } diff --git a/src/IoTHub.Portal.Server/Services/ConfigService.cs b/src/IoTHub.Portal.Server/Services/ConfigService.cs index a49fb22a6..129fc8064 100644 --- a/src/IoTHub.Portal.Server/Services/ConfigService.cs +++ b/src/IoTHub.Portal.Server/Services/ConfigService.cs @@ -125,6 +125,7 @@ public async Task> GetModelSystemModule(string model Image = newModule.Image, EnvironmentVariables = newModule.EnvironmentVariables, ContainerCreateOptions = newModule.ContainerCreateOptions, + StartupOrder = newModule.StartupOrder }); } } diff --git a/src/IoTHub.Portal.Shared/GlobalUsings.cs b/src/IoTHub.Portal.Shared/GlobalUsings.cs index 7a634020e..f7901d94d 100644 --- a/src/IoTHub.Portal.Shared/GlobalUsings.cs +++ b/src/IoTHub.Portal.Shared/GlobalUsings.cs @@ -10,3 +10,4 @@ global using IoTHub.Portal.Shared.Constants; global using IoTHub.Portal.Shared.Models; global using IoTHub.Portal.Shared.Models.v10; +global using Newtonsoft.Json; diff --git a/src/IoTHub.Portal.Shared/Models/DevicePropertyType.cs b/src/IoTHub.Portal.Shared/Models/DevicePropertyType.cs index 5582347fa..7e71a21be 100644 --- a/src/IoTHub.Portal.Shared/Models/DevicePropertyType.cs +++ b/src/IoTHub.Portal.Shared/Models/DevicePropertyType.cs @@ -7,7 +7,7 @@ namespace IoTHub.Portal.Models /// /// Device property type. /// - [JsonConverter(typeof(JsonStringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] public enum DevicePropertyType { /// diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/EdgeModelSystemModule.cs b/src/IoTHub.Portal.Shared/Models/v1.0/EdgeModelSystemModule.cs index 16f2b27de..29f996a4f 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/EdgeModelSystemModule.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/EdgeModelSystemModule.cs @@ -11,6 +11,8 @@ public class EdgeModelSystemModule public string ContainerCreateOptions { get; set; } = default!; + public int StartupOrder { get; set; } + public List EnvironmentVariables { get; set; } public EdgeModelSystemModule(string name) diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule.cs b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule.cs index 5f810e620..eb517e42c 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule.cs @@ -27,6 +27,8 @@ public class IoTEdgeModule public string ContainerCreateOptions { get; set; } = default!; + public int StartupOrder { get; set; } + /// /// The module status. /// diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/ConfigModule.cs b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/ConfigModule.cs index 9348d02d6..b8e375696 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/ConfigModule.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/ConfigModule.cs @@ -8,19 +8,23 @@ namespace IoTHub.Portal.Shared.Models.v10.IoTEdgeModule public class ConfigModule { [JsonPropertyName("settings")] + [JsonProperty(PropertyName = "settings")] public ModuleSettings Settings { get; set; } [JsonPropertyName("type")] + [JsonProperty(PropertyName = "type")] public string Type { get; set; } = default!; [JsonPropertyName("env")] - //, NullValueHandling = NullValueHandling.Ignore)] + [JsonProperty(PropertyName = "env", NullValueHandling = NullValueHandling.Ignore)] public IDictionary? EnvironmentVariables { get; set; } - [JsonPropertyName("status")]/*, NullValueHandling = NullValueHandling.Ignore)]*/ + [JsonPropertyName("status")] + [JsonProperty(PropertyName = "status", NullValueHandling = NullValueHandling.Ignore)] public string? Status { get; set; } - [JsonPropertyName("restartPolicy")]/*, NullValueHandling = NullValueHandling.Ignore)]*/ + [JsonPropertyName("restartPolicy")] + [JsonProperty(PropertyName = "restartPolicy", NullValueHandling = NullValueHandling.Ignore)] public string? RestartPolicy { get; set; } public ConfigModule() @@ -32,15 +36,22 @@ public ConfigModule() public class ModuleSettings { [JsonPropertyName("image")] + [JsonProperty(PropertyName = "image")] public string Image { get; set; } = default!; - [JsonPropertyName("createOptions")]/*, NullValueHandling = NullValueHandling.Ignore)]*/ + [JsonPropertyName("createOptions")] + [JsonProperty(PropertyName = "createOptions", NullValueHandling = NullValueHandling.Ignore)] public string CreateOptions { get; set; } = default!; + + [JsonPropertyName("startupOrder")] + [JsonProperty(PropertyName = "startupOrder", NullValueHandling = NullValueHandling.Ignore)] + public int StartupOrder { get; set; } = 0; } public class EnvironmentVariable { [JsonPropertyName("value")] + [JsonProperty(PropertyName = "value")] public string EnvValue { get; set; } = default!; } } diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeAgentPropertiesDesired.cs b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeAgentPropertiesDesired.cs index ac75e39a9..e7fb74792 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeAgentPropertiesDesired.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeAgentPropertiesDesired.cs @@ -6,15 +6,19 @@ namespace IoTHub.Portal.Shared.Models.v10.IoTEdgeModule public class EdgeAgentPropertiesDesired { [JsonPropertyName("modules")] + [JsonProperty(PropertyName = "modules")] public IDictionary Modules { get; set; } [JsonPropertyName("runtime")] + [JsonProperty(PropertyName = "runtime")] public Runtime Runtime { get; set; } [JsonPropertyName("schemaVersion")] + [JsonProperty(PropertyName = "schemaVersion")] public string SchemaVersion { get; set; } [JsonPropertyName("systemModules")] + [JsonProperty(PropertyName = "systemModules")] public SystemModules SystemModules { get; set; } public EdgeAgentPropertiesDesired() @@ -29,9 +33,11 @@ public EdgeAgentPropertiesDesired() public class Runtime { [JsonPropertyName("settings")] + [JsonProperty(PropertyName = "settings")] public RuntimeSettings Settings { get; set; } [JsonPropertyName("type")] + [JsonProperty(PropertyName = "type")] public string Type { get; set; } public Runtime() @@ -44,6 +50,7 @@ public Runtime() public class RuntimeSettings { [JsonPropertyName("minDockerVersion")] + [JsonProperty(PropertyName = "minDockerVersion")] public string MinDockerVersion { get; set; } public RuntimeSettings() @@ -55,9 +62,11 @@ public RuntimeSettings() public class SystemModules { [JsonPropertyName("edgeAgent")] + [JsonProperty(PropertyName = "edgeAgent")] public ConfigModule EdgeAgent { get; set; } [JsonPropertyName("edgeHub")] + [JsonProperty(PropertyName = "edgeHub")] public ConfigModule EdgeHub { get; set; } public SystemModules() diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeHubPropertiesDesired.cs b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeHubPropertiesDesired.cs index 59dfe6c15..9b7b68c01 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeHubPropertiesDesired.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/IoTEdgeModule/EdgeHubPropertiesDesired.cs @@ -6,12 +6,15 @@ namespace IoTHub.Portal.Shared.Models.v10.IoTEdgeModule public class EdgeHubPropertiesDesired { [JsonPropertyName("routes")] + [JsonProperty(PropertyName = "routes")] public IDictionary Routes { get; set; } [JsonPropertyName("schemaVersion")] + [JsonProperty(PropertyName = "schemaVersion")] public string SchemaVersion { get; set; } [JsonPropertyName("storeAndForwardConfiguration")] + [JsonProperty(PropertyName = "storeAndForwardConfiguration")] public StoreAndForwardConfiguration StoreAndForwardConfiguration { get; set; } public EdgeHubPropertiesDesired() @@ -25,6 +28,7 @@ public EdgeHubPropertiesDesired() public class StoreAndForwardConfiguration { [JsonPropertyName("timeToLiveSecs")] + [JsonProperty(PropertyName = "timeToLiveSecs")] public int TimeToLiveSecs { get; set; } public StoreAndForwardConfiguration() diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/Channel.cs b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/Channel.cs index 864d3c9b7..70c5ec0af 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/Channel.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/Channel.cs @@ -12,36 +12,42 @@ public class Channel /// A value indicating whether the channel is enabled. /// [JsonPropertyName("enable")] + [JsonProperty("enable")] public bool? Enable { get; set; } /// /// The frequency. /// [JsonPropertyName("freq")] + [JsonProperty("freq")] public int Freq { get; set; } /// /// The radio. /// [JsonPropertyName("radio")] + [JsonProperty("radio")] public int Radio { get; set; } /// /// The interface. /// [JsonPropertyName("if")] + [JsonProperty("if")] public int If { get; set; } /// /// The bandwidth. /// [JsonPropertyName("bandwidth")] + [JsonProperty("bandwidth")] public int Bandwidth { get; set; } /// /// The spread factor. /// [JsonPropertyName("spread_factor")] + [JsonProperty("spread_factor")] public int SpreadFactor { get; set; } } } diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/ClassType.cs b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/ClassType.cs index ff50bca16..c4dac0217 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/ClassType.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/ClassType.cs @@ -6,7 +6,7 @@ namespace IoTHub.Portal.Models.v10.LoRaWAN /// /// LoRaWAN Device Class. /// - [JsonConverter(typeof(JsonStringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] public enum ClassType { /// diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/DeduplicationMode.cs b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/DeduplicationMode.cs index 5a64ef252..3ee107c05 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/DeduplicationMode.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/DeduplicationMode.cs @@ -6,7 +6,7 @@ namespace IoTHub.Portal.Models.v10.LoRaWAN /// /// LoRaWAN Deduplication strategy. /// - [JsonConverter(typeof(JsonStringEnumConverter))] + [System.Text.Json.Serialization.JsonConverter(typeof(JsonStringEnumConverter))] public enum DeduplicationMode { /// diff --git a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/RouterConfig.cs b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/RouterConfig.cs index c4dcd0dbc..7acc24e1f 100644 --- a/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/RouterConfig.cs +++ b/src/IoTHub.Portal.Shared/Models/v1.0/LoRaWAN/RouterConfig.cs @@ -12,59 +12,70 @@ public class RouterConfig /// The network identifier. /// [JsonPropertyName("NetID")] + [JsonProperty("NetID")] public List NetID { get; set; } = new(); /// /// The join eui. /// [JsonPropertyName("JoinEui")] + [JsonProperty("JoinEui")] public List> JoinEui { get; set; } = new(); /// /// The region. /// [JsonPropertyName("region")] + [JsonProperty("region")] public string Region { get; set; } = default!; /// /// The hardware specifications. /// [JsonPropertyName("hwspec")] + [JsonProperty("hwspec")] public string Hwspec { get; set; } = default!; /// /// The frequency range. /// [JsonPropertyName("freq_range")] + [JsonProperty("freq_range")] public List FreqRange { get; set; } = new(); /// /// The DRs. /// [JsonPropertyName("DRs")] + [JsonProperty("DRs")] public List> DRs { get; set; } = new(); /// /// The SX1301 conf. /// [JsonPropertyName("sx1301_conf")] + [JsonProperty("sx1301_conf")] public List> Sx1301Conf { get; set; } = new(); /// /// true if nocca; otherwise, false. /// [JsonPropertyName("nocca")] + [JsonProperty("nocca")] public bool Nocca { get; set; } /// /// true if nodc; otherwise, false. /// [JsonPropertyName("nodc")] + [JsonProperty("nodc")] public bool Nodc { get; set; } + /// /// true if nodwell; otherwise, false. /// [JsonPropertyName("nodwell")] + [JsonProperty("nodwell")] public bool Nodwell { get; set; } } } diff --git a/src/IoTHub.Portal.Tests.Unit/Client/Pages/EdgeModels/SystemModuleDialogTest.cs b/src/IoTHub.Portal.Tests.Unit/Client/Pages/EdgeModels/SystemModuleDialogTest.cs index 4c2a883e7..fe0a10b20 100644 --- a/src/IoTHub.Portal.Tests.Unit/Client/Pages/EdgeModels/SystemModuleDialogTest.cs +++ b/src/IoTHub.Portal.Tests.Unit/Client/Pages/EdgeModels/SystemModuleDialogTest.cs @@ -27,6 +27,7 @@ public async Task SystemModuleDialogMustCloseOnCLickOnCloseButton() } }, ContainerCreateOptions = Fixture.Create(), + StartupOrder = Fixture.Create(), }; var cut = RenderComponent(); diff --git a/src/IoTHub.Portal.Tests.Unit/Infrastructure/Helpers/ConfigHelperTest.cs b/src/IoTHub.Portal.Tests.Unit/Infrastructure/Helpers/ConfigHelperTest.cs index e3248e2e6..100a490e6 100644 --- a/src/IoTHub.Portal.Tests.Unit/Infrastructure/Helpers/ConfigHelperTest.cs +++ b/src/IoTHub.Portal.Tests.Unit/Infrastructure/Helpers/ConfigHelperTest.cs @@ -86,7 +86,8 @@ public void CreateGatewayModuleShouldReturnValue() { "settings", new Dictionary() { { "image", "image_test" }, - { "createOptions", expectedContainerCreateOptions } + { "createOptions", expectedContainerCreateOptions }, + { "startupOrder", 100 }, } }, { "env", new Dictionary() @@ -111,6 +112,7 @@ public void CreateGatewayModuleShouldReturnValue() Assert.AreEqual("running", result.Status); Assert.AreEqual("image_test", result.Image); Assert.AreEqual(expectedContainerCreateOptions, result.ContainerCreateOptions); + Assert.AreEqual(100, result.StartupOrder); Assert.AreEqual(1, result.EnvironmentVariables.Count); } @@ -161,6 +163,7 @@ public void GenerateModulesContentShouldReturnValue() Status = "running", Image = "image", ContainerCreateOptions = expectedContainerCreateOptions, + StartupOrder = 100, EnvironmentVariables = new List() { new() { Name = "envTest01", Value = "test" } @@ -174,6 +177,7 @@ public void GenerateModulesContentShouldReturnValue() { Image = "image", ContainerCreateOptions = Guid.NewGuid().ToString(), + StartupOrder = 100, EnvironmentVariables = new List() { new IoTEdgeModuleEnvironmentVariable(){ Name ="test", Value = "test" } @@ -201,6 +205,7 @@ public void GenerateModulesContentShouldReturnValue() var edgeHubPropertiesDesired = (EdgeAgentPropertiesDesired)result["$edgeAgent"]["properties.desired"]; _ = edgeHubPropertiesDesired.Modules[expectedModuleName].Settings.CreateOptions.Should() .Be(expectedContainerCreateOptions); + _ = edgeHubPropertiesDesired.Modules[expectedModuleName].Settings.StartupOrder.Should().Be(100); } [Test]