diff --git a/src/Runner.Worker/ContainerOperationProvider.cs b/src/Runner.Worker/ContainerOperationProvider.cs index 2fc59730888..761c8f09123 100644 --- a/src/Runner.Worker/ContainerOperationProvider.cs +++ b/src/Runner.Worker/ContainerOperationProvider.cs @@ -108,9 +108,9 @@ public async Task RunContainersHealthcheck(IExecutionContext executionContext, L var unhealthyContainers = new List(); foreach (var container in containers.Where(c => !c.IsJobContainer)) { - var healthcheck = await ContainerHealthcheck(executionContext, container); + var healthy_container = await ContainerHealthcheck(executionContext, container); - if (!string.Equals(healthcheck, "healthy", StringComparison.OrdinalIgnoreCase)) + if (!healthy_container) { unhealthyContainers.Add(container); } @@ -330,13 +330,13 @@ private async Task StopContainerAsync(IExecutionContext executionContext, Contai { if (!container.IsJobContainer && !container.FailedInitialization) { - executionContext.Output($"Print service container logs: {container.ContainerDisplayName}"); + executionContext.Output($"Print service container logs: {container.ContainerDisplayName}"); - int logsExitCode = await _dockerManager.DockerLogs(executionContext, container.ContainerId); - if (logsExitCode != 0) - { - executionContext.Warning($"Docker logs fail with exit code {logsExitCode}"); - } + int logsExitCode = await _dockerManager.DockerLogs(executionContext, container.ContainerId); + if (logsExitCode != 0) + { + executionContext.Warning($"Docker logs fail with exit code {logsExitCode}"); + } } executionContext.Output($"Stop and remove container: {container.ContainerDisplayName}"); @@ -423,14 +423,14 @@ private async Task RemoveContainerNetworkAsync(IExecutionContext executionContex } } - private async Task ContainerHealthcheck(IExecutionContext executionContext, ContainerInfo container) + private async Task ContainerHealthcheck(IExecutionContext executionContext, ContainerInfo container) { string healthCheck = "--format=\"{{if .Config.Healthcheck}}{{print .State.Health.Status}}{{end}}\""; string serviceHealth = (await _dockerManager.DockerInspect(context: executionContext, dockerObject: container.ContainerId, options: healthCheck)).FirstOrDefault(); if (string.IsNullOrEmpty(serviceHealth)) { // Container has no HEALTHCHECK - return String.Empty; + return true; } var retryCount = 0; while (string.Equals(serviceHealth, "starting", StringComparison.OrdinalIgnoreCase)) @@ -441,7 +441,7 @@ private async Task ContainerHealthcheck(IExecutionContext executionConte serviceHealth = (await _dockerManager.DockerInspect(context: executionContext, dockerObject: container.ContainerId, options: healthCheck)).FirstOrDefault(); retryCount++; } - return serviceHealth; + return serviceHealth == "healthy"; } private async Task ContainerRegistryLogin(IExecutionContext executionContext, ContainerInfo container) diff --git a/src/Test/L0/Worker/ContainerOperationProviderL0.cs b/src/Test/L0/Worker/ContainerOperationProviderL0.cs index bfc09f343ac..e0819511bc7 100644 --- a/src/Test/L0/Worker/ContainerOperationProviderL0.cs +++ b/src/Test/L0/Worker/ContainerOperationProviderL0.cs @@ -23,6 +23,7 @@ public sealed class ContainerOperationProviderL0 private Mock serverQueue; private Mock pagingLogger; private List healthyDockerStatus = new List { "healthy" }; + private List emptyDockerStatus = new List { string.Empty }; private List unhealthyDockerStatus = new List { "unhealthy" }; private List dockerLogs = new List { "log1", "log2", "log3" }; @@ -81,6 +82,23 @@ public async void RunServiceContainersHealthcheck_healthyServiceContainer_Assert } + [Fact] + [Trait("Level", "L0")] + [Trait("Category", "Worker")] + public async void RunServiceContainersHealthcheck_healthyServiceContainerWithoutHealthcheck_AssertSucceededTask() + { + //Arrange + Setup(); + _dockerManager.Setup(x => x.DockerInspect(_ec.Object, It.IsAny(), It.IsAny())).Returns(Task.FromResult(emptyDockerStatus)); + + //Act + await containerOperationProvider.RunContainersHealthcheck(_ec.Object, containers); + + //Assert + Assert.Equal(TaskResult.Succeeded, _ec.Object.Result ?? TaskResult.Succeeded); + + } + private void Setup([CallerMemberName] string testName = "") { containers.Add(new ContainerInfo() { ContainerImage = "ubuntu:16.04" });