public static Task Wait(WaitForDockerConfig config)
        {
            config = config ?? new WaitForDockerConfig();
            var composeYaml  = DockerFilesReader.ReadComposeContent(config.DockerComposeDirPath, config.ComposeFileName);
            var composeJson  = new JsonComposeConverter().Convert(composeYaml);
            var servicePorts = new JsonComposeServicesPortsExtractor().ExtractServicePorts(composeJson).ToArray();

            var killCommand = DockerCommandBuilder.BuildDockerKillCommand(config, servicePorts);

            ShellExecutorFactory.GetShellExecutor(config.Logger).Execute(killCommand, DockerConsts.DockerComposeKill);
            return(Task.CompletedTask);
        }
示例#2
0
        public override async Task <bool> IsHealthy()
        {
            var fullDockerCommand = DockerCommandBuilder.BuildDockerExecCommand(_composeProjectName, ServiceName, _command);

            Logger.Log($"Command health check of {ServiceName} with command {fullDockerCommand} has been started.");
            var startInfo = GetProcessStartInfo(fullDockerCommand);
            var sp        = new Stopwatch();
            var attempts  = 1;

            while (sp.Elapsed.Seconds < TimeoutInSeconds)
            {
                sp.Start();
                using (var process = Process.Start(startInfo))
                {
                    if (process == null)
                    {
                        throw new WaitForDockerException("Unable to create process");
                    }

                    process.WaitForExit();
                    var processExitCode = process.ExitCode;
                    Logger.Log($"Attempt number {attempts} of {ServiceName} command health check exited with  exit code: {processExitCode.ToString()} and following output \r\n " +
                               $"Output: \r\n {process.StandardOutput.ReadToEnd()} \r\n" +
                               $"Errors: \r\n{process.StandardError.ReadToEnd()}");
                    Logger.Log(string.Empty);

                    if (processExitCode == SuccessExitCode)
                    {
                        Logger.Log($"Command health check of {ServiceName} return success exit code {processExitCode.ToString()}");
                        return(true);
                    }
                }

                sp.Stop();
                await Task.Delay(100);

                attempts++;
            }

            var exceptionMessage = $"Health check failed! Service {ServiceName} was not returning success http status code after {TimeoutInSeconds} seconds.";

            Logger.Log(exceptionMessage);

            throw new WaitForDockerException(exceptionMessage);
        }
示例#3
0
        public static async Task Wait(WaitForDockerConfig config)
        {
            config = config ?? new WaitForDockerConfig();
            var logger = config.Logger;

            logger.Log("Wait for docker has been started..");
            var composeYaml  = DockerFilesReader.ReadComposeContent(config.DockerComposeDirPath, config.ComposeFileName);
            var composeJson  = new JsonComposeConverter().Convert(composeYaml);
            var servicePorts = new JsonComposeServicesPortsExtractor().ExtractServicePorts(composeJson).ToArray();

            logger.Log($"Checking is any port is already occupied before {DockerConsts.DockerCompose} execution..");
            await DockerHealthCheckRunner.RunPreComposeHealthChecks(servicePorts, config.Logger);

            config.ExtendWithDefaultHealthChecks(servicePorts);
            var composeCommand = DockerCommandBuilder.BuildComposeCommand(config);

            ShellExecutorFactory.GetShellExecutor(config.Logger).Execute(composeCommand, DockerConsts.DockerCompose);

            await DockerHealthCheckRunner.RunPostComposeHealthChecks(config.HealthCheckers);

            logger.Log("All health checks returns success.");
            logger.Log("Wait for docker has been finished..");
        }