From 7290eeb36e25c44c30309eb119da821c37b43520 Mon Sep 17 00:00:00 2001 From: Andrew Smith Date: Tue, 7 Jan 2020 14:58:27 -0800 Subject: [PATCH] Fix tempfilter with IEnumerable (#2248) * deploy routes before modules --- .../EdgeRuntime.cs | 14 ++++-- .../config/EdgeConfigBuilder.cs | 49 ++++++++++++++----- 2 files changed, 45 insertions(+), 18 deletions(-) diff --git a/test/Microsoft.Azure.Devices.Edge.Test.Common/EdgeRuntime.cs b/test/Microsoft.Azure.Devices.Edge.Test.Common/EdgeRuntime.cs index aa4b60951dd..aebbe90300d 100644 --- a/test/Microsoft.Azure.Devices.Edge.Test.Common/EdgeRuntime.cs +++ b/test/Microsoft.Azure.Devices.Edge.Test.Common/EdgeRuntime.cs @@ -48,13 +48,17 @@ public async Task DeployConfigurationAsync(Action configs = builder.BuildConfigurationStages(); + foreach (EdgeConfiguration edgeConfiguration in configs) + { + await edgeConfiguration.DeployAsync(this.iotHub, token); + await Task.Delay(TimeSpan.FromSeconds(10)); + } - await config.DeployAsync(this.iotHub, token); - - IEnumerable modules = config.ModuleNames + // The last configuration will contain all modules including $edgeHub and $edgeAgent + List modules = configs.Last().ModuleNames .Select(id => new EdgeModule(id, this.deviceId, this.iotHub)) - .ToArray(); + .ToList(); await EdgeModule.WaitForStatusAsync(modules, EdgeModuleStatus.Running, token); return new EdgeDeployment(deployTime, modules); diff --git a/test/Microsoft.Azure.Devices.Edge.Test.Common/config/EdgeConfigBuilder.cs b/test/Microsoft.Azure.Devices.Edge.Test.Common/config/EdgeConfigBuilder.cs index 9f4463638a9..69db9344314 100644 --- a/test/Microsoft.Azure.Devices.Edge.Test.Common/config/EdgeConfigBuilder.cs +++ b/test/Microsoft.Azure.Devices.Edge.Test.Common/config/EdgeConfigBuilder.cs @@ -52,7 +52,10 @@ public IModuleConfigBuilder AddModule(string name, string image) return builder; } - public EdgeConfiguration Build() + /* Will output edgeHub and edgeAgent configurations, then a full configuration at the end. + This is done to assure routes are set up for the most recent $edgeHub deployment before the test modules start sending messages (i.e. assure messages won't get dropped). + Another way to handle this is to define all possible routes at the very beginning of the test, but there is added complexity as module names are assigned dynamically. */ + public IEnumerable BuildConfigurationStages() { // Build all modules *except* edge agent List modules = this.moduleBuilders @@ -63,7 +66,7 @@ public EdgeConfiguration Build() // Build edge agent modules.Insert(0, this.BuildEdgeAgent(modules)); - // Compose edge configuration + // Find the $edgeAgent and $edgeHub match, then immediately compose and return a configuration var config = new ConfigurationContent { ModulesContent = new Dictionary>() @@ -72,21 +75,22 @@ public EdgeConfiguration Build() var moduleNames = new List(); var moduleImages = new List(); - foreach (ModuleConfiguration module in modules) + // Return a configuration for $edgeHub and $edgeAgent + foreach (ModuleConfiguration module in modules.Where(m => this.IsSystemModule(m))) { - moduleNames.Add(module.Name); - moduleImages.Add(module.Image); + this.AddModuleToConfiguration(module, moduleNames, moduleImages, config); + } - if (module.DesiredProperties.Count != 0) - { - config.ModulesContent[module.Name] = new Dictionary - { - ["properties.desired"] = module.DesiredProperties - }; - } + Dictionary> copyModulesContent = config.ModulesContent.ToDictionary(entry => entry.Key, entry => entry.Value); + yield return new EdgeConfiguration(this.deviceId, new List(moduleNames), new List(moduleImages), new ConfigurationContent { ModulesContent = copyModulesContent }); + + // Return a configuration for other modules + foreach (ModuleConfiguration module in modules.Where(m => !this.IsSystemModule(m))) + { + this.AddModuleToConfiguration(module, moduleNames, moduleImages, config); } - return new EdgeConfiguration(this.deviceId, moduleNames, moduleImages, config); + yield return new EdgeConfiguration(this.deviceId, moduleNames, moduleImages, config); } ModuleConfiguration BuildEdgeAgent(IEnumerable configs) @@ -167,6 +171,25 @@ ModuleConfiguration BuildEdgeAgent(IEnumerable configs) return agentBuilder.Build(); } + bool IsSystemModule(ModuleConfiguration module) + { + return module.Name.Equals("$edgeHub") || module.Name.Equals("$edgeAgent"); + } + + void AddModuleToConfiguration(ModuleConfiguration module, List moduleNames, List moduleImages, ConfigurationContent config) + { + moduleNames.Add(module.Name); + moduleImages.Add(module.Image); + + if (module.DesiredProperties.Count != 0) + { + config.ModulesContent[module.Name] = new Dictionary + { + ["properties.desired"] = module.DesiredProperties + }; + } + } + public IModuleConfigBuilder GetModule(string name) { return this.moduleBuilders[name];