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(); } }