private async Task <ResultVoid <TaskConfigError> > CheckContainers(TaskDefinition definition, TaskConfig config) { if (config.Containers == null) { return(ResultVoid <TaskConfigError> .Ok()); } var exist = new HashSet <string>(); var containers = new Dictionary <ContainerType, List <Container> >(); foreach (var container in config.Containers) { if (exist.Contains(container.Name.ContainerName)) { continue; } if (await _containers.FindContainer(container.Name, StorageType.Corpus) == null) { return(ResultVoid <TaskConfigError> .Error(new TaskConfigError($"missing container: {container.Name}"))); } exist.Add(container.Name.ContainerName); if (!containers.ContainsKey(container.Type)) { containers.Add(container.Type, new List <Container>()); } containers[container.Type].Add(container.Name); } foreach (var containerDef in definition.Containers) { var r = CheckContainer(containerDef.Compare, containerDef.Value, containerDef.Type, containers); if (!r.IsOk) { return(r); } } var containerTypes = definition.Containers.Select(x => x.Type).ToHashSet(); var missing = containers.Keys.Where(x => !containerTypes.Contains(x)).ToList(); if (missing.Any()) { var types = string.Join(", ", missing); return(ResultVoid <TaskConfigError> .Error(new TaskConfigError($"unsupported container types for this task: {types}"))); } if (definition.MonitorQueue != null) { if (!containerTypes.Contains(definition.MonitorQueue.Value)) { return(ResultVoid <TaskConfigError> .Error(new TaskConfigError($"unable to monitor container type as it is not used by this task: {definition.MonitorQueue}"))); } } return(ResultVoid <TaskConfigError> .Ok()); }