public async Task <ModuleSet> GetModulesAsync(CancellationToken token) { IEnumerable <ModuleRuntimeInfo> moduleStatuses = await this.moduleStatusProvider.GetModules(token); var modules = new List <IModule>(); ModuleSet moduleSet = this.deploymentConfig.GetModuleSet(); foreach (ModuleRuntimeInfo moduleRuntimeInfo in moduleStatuses) { if (moduleRuntimeInfo.Type != "docker" || !(moduleRuntimeInfo is ModuleRuntimeInfo <DockerReportedConfig> dockerRuntimeInfo)) { Events.InvalidModuleType(moduleRuntimeInfo); continue; } if (!moduleSet.Modules.TryGetValue(dockerRuntimeInfo.Name, out IModule configModule) || !(configModule is DockerModule dockerModule)) { dockerModule = new DockerModule(dockerRuntimeInfo.Name, string.Empty, ModuleStatus.Unknown, Core.RestartPolicy.Unknown, new DockerConfig(Constants.UnknownImage, new CreateContainerParameters()), new ConfigurationInfo(), null); } Option <ModuleState> moduleStateOption = await this.moduleStateStore.Get(moduleRuntimeInfo.Name); ModuleState moduleState = moduleStateOption.GetOrElse(new ModuleState(0, moduleRuntimeInfo.ExitTime.GetOrElse(DateTime.MinValue))); // compute module state based on restart policy DateTime lastExitTime = moduleRuntimeInfo.ExitTime.GetOrElse(DateTime.MinValue); ModuleStatus moduleRuntimeStatus = this.restartManager.ComputeModuleStatusFromRestartPolicy(moduleRuntimeInfo.ModuleStatus, dockerModule.RestartPolicy, moduleState.RestartCount, lastExitTime); string image = !string.IsNullOrWhiteSpace(dockerRuntimeInfo.Config.Image) ? dockerRuntimeInfo.Config.Image : dockerModule.Config.Image; var dockerReportedConfig = new DockerReportedConfig(image, dockerModule.Config.CreateOptions, dockerRuntimeInfo.Config.ImageHash); IModule module; switch (moduleRuntimeInfo.Name) { case Core.Constants.EdgeHubModuleName: module = new EdgeHubDockerRuntimeModule( dockerModule.DesiredStatus, dockerModule.RestartPolicy, dockerReportedConfig, (int)dockerRuntimeInfo.ExitCode, dockerRuntimeInfo.Description, dockerRuntimeInfo.StartTime.GetOrElse(DateTime.MinValue), lastExitTime, moduleState.RestartCount, moduleState.LastRestartTimeUtc, moduleRuntimeStatus, dockerModule.ConfigurationInfo, dockerModule.Env); break; case Core.Constants.EdgeAgentModuleName: module = new EdgeAgentDockerRuntimeModule( dockerReportedConfig, moduleRuntimeStatus, (int)dockerRuntimeInfo.ExitCode, dockerRuntimeInfo.Description, dockerRuntimeInfo.StartTime.GetOrElse(DateTime.MinValue), lastExitTime, dockerModule.ConfigurationInfo, dockerModule.Env); break; default: module = new DockerRuntimeModule( moduleRuntimeInfo.Name, dockerModule.Version, dockerModule.DesiredStatus, dockerModule.RestartPolicy, dockerReportedConfig, (int)moduleRuntimeInfo.ExitCode, moduleRuntimeInfo.Description, moduleRuntimeInfo.StartTime.GetOrElse(DateTime.MinValue), lastExitTime, moduleState.RestartCount, moduleState.LastRestartTimeUtc, moduleRuntimeStatus, dockerModule.ConfigurationInfo, dockerModule.Env); break; } modules.Add(module); } return(new ModuleSet(modules.ToDictionary(m => m.Name, m => m))); }