コード例 #1
0
        private static async Task <bool> runCompetetionInsideReusableContainer(Gene gene, string mapPath, DirectoryInfo rootDirectory, CancellationToken cancellationToken = default)
        {
            var hasFinished = true;

            //await initializeCompeteionDirectory(gene, 7099, mapPath, rootDirectory, overWriteFiles: true, cancellationToken: cancellationToken);

            var containerInfo = await ContainerRepository.GetAFreeContainer(cancellationToken);

            try
            {
                //foreach (var file in rootDirectory.GetFiles())
                //{
                //    file.CopyTo(Path.Combine(containerInfo.FilesDirectory.FullName, file.Name), true);
                //}

                await initializeCompeteionDirectory(gene, 7099, mapPath, containerInfo.FilesDirectory, overWriteFiles : true, cancellationToken : cancellationToken);

                await DockerService.StartContainer(containerInfo.Id, cancellationToken);

                var startTime = DateTime.Now;
                while (await DockerService.IsContainerRunningAsync(containerInfo.Id, cancellationToken))
                {
                    if ((DateTime.Now - startTime) > _maximumAllowedRunTime)
                    {
                        //Console.WriteLine($"gene {geneId} didn't finish");
                        hasFinished = false;
                        break;
                    }
                    await Task.Delay(1000, cancellationToken);
                }

                containerInfo.FilesDirectory.CopyContentsTo(rootDirectory);

                if (hasFinished)
                {
                    var defenderClientOutputPath = ClientManager.GetClientOutputPath(rootDirectory, ClientMode.defend);
                    var attackerClientOutputPath = ClientManager.GetClientOutputPath(rootDirectory, ClientMode.attack);

                    hasFinished = File.Exists(defenderClientOutputPath) && File.Exists(attackerClientOutputPath);
                }

                var containerInfoPath = Path.Combine(rootDirectory.FullName, "container.info");
                await File.AppendAllLinesAsync(containerInfoPath, await DockerService.GetContainerInfo(containerInfo.Id, showAll: true, cancellationToken: cancellationToken), cancellationToken);

                var containerInspect = Path.Combine(rootDirectory.FullName, "container.inspect.json");
                await File.WriteAllTextAsync(containerInspect, await DockerService.GetContainerInspect(containerInfo.Id, cancellationToken: cancellationToken), cancellationToken);

                var containerLogPath = Path.Combine(rootDirectory.FullName, "container.log");
                await File.WriteAllTextAsync(containerLogPath, await DockerService.ContainerLogAsync(containerInfo.Id, cancellationToken), cancellationToken);

                return(hasFinished);
            }
            finally
            {
                containerInfo.Release();
            }
        }