Skip to content

Commit

Permalink
Fix tempfilter with IEnumerable (#2248)
Browse files Browse the repository at this point in the history
* deploy routes before modules
  • Loading branch information
and-rewsmith authored Jan 7, 2020
1 parent 4f55388 commit 7290eeb
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 18 deletions.
14 changes: 9 additions & 5 deletions test/Microsoft.Azure.Devices.Edge.Test.Common/EdgeRuntime.cs
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,17 @@ public async Task<EdgeDeployment> DeployConfigurationAsync(Action<EdgeConfigBuil
addConfig(builder);

DateTime deployTime = DateTime.Now;
EdgeConfiguration config = builder.Build();
IEnumerable<EdgeConfiguration> 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<EdgeModule> modules = config.ModuleNames
// The last configuration will contain all modules including $edgeHub and $edgeAgent
List<EdgeModule> 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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<EdgeConfiguration> BuildConfigurationStages()
{
// Build all modules *except* edge agent
List<ModuleConfiguration> modules = this.moduleBuilders
Expand All @@ -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<string, IDictionary<string, object>>()
Expand All @@ -72,21 +75,22 @@ public EdgeConfiguration Build()
var moduleNames = new List<string>();
var moduleImages = new List<string>();

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<string, object>
{
["properties.desired"] = module.DesiredProperties
};
}
Dictionary<string, IDictionary<string, object>> copyModulesContent = config.ModulesContent.ToDictionary(entry => entry.Key, entry => entry.Value);
yield return new EdgeConfiguration(this.deviceId, new List<string>(moduleNames), new List<string>(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<ModuleConfiguration> configs)
Expand Down Expand Up @@ -167,6 +171,25 @@ ModuleConfiguration BuildEdgeAgent(IEnumerable<ModuleConfiguration> configs)
return agentBuilder.Build();
}

bool IsSystemModule(ModuleConfiguration module)
{
return module.Name.Equals("$edgeHub") || module.Name.Equals("$edgeAgent");
}

void AddModuleToConfiguration(ModuleConfiguration module, List<string> moduleNames, List<string> moduleImages, ConfigurationContent config)
{
moduleNames.Add(module.Name);
moduleImages.Add(module.Image);

if (module.DesiredProperties.Count != 0)
{
config.ModulesContent[module.Name] = new Dictionary<string, object>
{
["properties.desired"] = module.DesiredProperties
};
}
}

public IModuleConfigBuilder GetModule(string name)
{
return this.moduleBuilders[name];
Expand Down

0 comments on commit 7290eeb

Please sign in to comment.