in edge-agent/src/Microsoft.Azure.Devices.Edge.Agent.Docker/DockerEnvironment.cs [49:158]
public async Task<ModuleSet> GetModulesAsync(CancellationToken token)
{
IEnumerable<ModuleRuntimeInfo> moduleStatuses = await this.moduleStatusProvider.GetModules(token);
var modules = new List<IModule>();
string image;
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))
{
// This is given the highest priority so that it's removal is prioritized first before other known modules are processed.
dockerModule = new DockerModule(dockerRuntimeInfo.Name, string.Empty, ModuleStatus.Unknown, Core.RestartPolicy.Unknown, new DockerConfig(Constants.UnknownImage, new CreateContainerParameters(), Option.None<string>()), ImagePullPolicy.OnCreate, Core.Constants.HighestPriority, 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 = dockerModule.DesiredStatus == ModuleStatus.Running
? this.restartManager.ComputeModuleStatusFromRestartPolicy(moduleRuntimeInfo.ModuleStatus, dockerModule.RestartPolicy, moduleState.RestartCount, lastExitTime)
: moduleRuntimeInfo.ModuleStatus;
// Check to see if the originalImage label is set by the iotedege daemon. This label is set for content trust feature where the image is pulled by digest.
// OriginalImageLabelStr contains the image with tag and it is used to handle the mismatch of image with digest during reconcilation.
var labels = dockerRuntimeInfo.Config.CreateOptions?.Labels ?? new Dictionary<string, string>();
labels.TryGetValue(Core.Constants.Labels.OriginalImage, out string originalImageLabelStr);
if (!string.IsNullOrWhiteSpace(originalImageLabelStr))
{
image = originalImageLabelStr;
}
else
{
image = !string.IsNullOrWhiteSpace(dockerRuntimeInfo.Config.Image) ? dockerRuntimeInfo.Config.Image : dockerModule.Config.Image;
}
var dockerReportedConfig = new DockerReportedConfig(image, dockerModule.Config.CreateOptions, dockerRuntimeInfo.Config.ImageHash, dockerModule.Config.Digest);
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.ImagePullPolicy,
dockerModule.StartupOrder,
dockerModule.ConfigurationInfo,
dockerModule.Env,
dockerModule.Version);
break;
case Core.Constants.EdgeAgentModuleName:
var env = labels.TryGetValue(Core.Constants.Labels.Env, out string envStr)
? JsonConvert.DeserializeObject<Dictionary<string, EnvVal>>(envStr)
: new Dictionary<string, EnvVal>();
dockerReportedConfig = new DockerReportedConfig(image, dockerRuntimeInfo.Config.CreateOptions, dockerRuntimeInfo.Config.ImageHash, dockerRuntimeInfo.Config.Digest);
module = new EdgeAgentDockerRuntimeModule(
dockerReportedConfig,
moduleRuntimeStatus,
(int)dockerRuntimeInfo.ExitCode,
dockerRuntimeInfo.Description,
dockerRuntimeInfo.StartTime.GetOrElse(DateTime.MinValue),
lastExitTime,
dockerModule.ImagePullPolicy,
dockerModule.ConfigurationInfo,
env,
dockerModule.Version);
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.ImagePullPolicy,
dockerModule.StartupOrder,
dockerModule.ConfigurationInfo,
dockerModule.Env);
break;
}
modules.Add(module);
}
return new ModuleSet(modules.ToDictionary(m => m.Name, m => m));
}