Beispiel #1
0
    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());
    }