コード例 #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();
            }
        }
コード例 #2
0
        private static async Task <bool> runCompetitionInsideContainer(Gene gene, string mapPath, DirectoryInfo rootDirectory, CancellationToken cancellationToken = default)
        {
            await initializeCompeteionDirectory(gene, 7099, mapPath, rootDirectory, cancellationToken : cancellationToken);

            var containerId = await DockerService.RunArenaAsync(Program.DockerImageName, rootDirectory.FullName, cancellationToken);

            var startTime   = DateTime.Now;
            var hasFinished = true;

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

            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(containerId, showAll: true, cancellationToken: cancellationToken),
                                           cancellationToken);

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

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

            await DockerService.StopAndRemoveContainerAsync(containerId, cancellationToken);

            return(hasFinished);
        }