@Test public void testHealthCheckWithTcp() throws Throwable { ComputeState unreachableHost = createComputeState("unreachable"); ContainerDescriptionService.FACTORY_LINK, "mockDescId"); ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = mockContainerDescriptionLink; containerDesc.healthConfig.port = serverSocket.getLocalPort(); containerDesc.healthConfig.healthyThreshold = 1; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerState container = createContainerStateNoAddress(mockContainerDescriptionLink); container.parentLink = unreachableHost.documentSelfLink; container.powerState = PowerState.RUNNING; container = doPost(container, ContainerFactoryService.SELF_LINK); verifyHealthFailureAfterThreshold(containerDesc.healthConfig.unhealthyThreshold, containerDesc, container); patch.parentLink = computeHost.documentSelfLink; URI uri = UriUtils.buildUri(host, container.documentSelfLink); doOperation(patch, uri, false, Action.PATCH); verifyHealthSuccessAfterThreshold(containerDesc.healthConfig.healthyThreshold, containerDesc, container); } finally {
private ContainerState createContainerStateNoAddress(String containerDescriptionLink) { return createContainerState(containerDescriptionLink, computeHost.documentSelfLink); }
private ContainerDescription createContainerDescription() { ContainerDescription containerDesc = new ContainerDescription(); containerDesc.image = "image:latest"; containerDesc.healthConfig = createHealthConfig(); return containerDesc; }
@Before public void setUp() throws Throwable { waitForServiceAvailability( ContainerDescriptionService.FACTORY_LINK, ComputeService.FACTORY_LINK); computeHost = createComputeState(host.getPreferredAddress()); }
private void verifyHealthSuccessAfterThreshold(int successThreshold, ContainerDescription containerDesc, ContainerState container) throws Throwable { final String containerLink = container.documentSelfLink; for (int i = 1; i <= successThreshold; i++) { // Do maintenance HealthChecker.getInstance().doHealthCheck(host, containerDesc.documentSelfLink); final int successCount = i; waitFor(() -> { ContainerStats containerStats = getContainerStats(containerLink); return containerStats.healthCheckSuccess != null && containerStats.healthCheckSuccess && containerStats.healthSuccessCount == successCount; }); } waitFor(() -> { ContainerState healthyContainer = getDocument(ContainerState.class, containerLink); return ContainerState.CONTAINER_RUNNING_STATUS.equals(healthyContainer.status) && PowerState.RUNNING == healthyContainer.powerState; }); }
@Test public void testHealthConfigIdempotentPost() throws Throwable { String id = UUID.randomUUID().toString(); ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = ContainerDescriptionService.FACTORY_LINK + "/" + id; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerDescription putConfig = createContainerDescription(); putConfig.documentSelfLink = ContainerDescriptionService.FACTORY_LINK + "/" + id; putConfig.healthConfig.urlPath = "/ping1"; doOperation(putConfig, UriUtils.buildUri(host, putConfig.documentSelfLink), false, Action.PUT); containerDesc = getDocument(ContainerDescription.class, containerDesc.documentSelfLink); assertEquals(putConfig.healthConfig.urlPath, containerDesc.healthConfig.urlPath); putConfig = createContainerDescription(); putConfig.documentSelfLink = ContainerDescriptionService.FACTORY_LINK + "/" + id; putConfig.healthConfig.urlPath = "/ping2"; containerDesc = doPost(putConfig, ContainerDescriptionService.FACTORY_LINK); containerDesc = getDocument(ContainerDescription.class, containerDesc.documentSelfLink); assertEquals(putConfig.healthConfig.urlPath, containerDesc.healthConfig.urlPath); delete(containerDesc.documentSelfLink); putConfig = createContainerDescription(); putConfig.documentSelfLink = ContainerDescriptionService.FACTORY_LINK + "/" + id; putConfig.healthConfig.urlPath = "/ping3"; containerDesc = doPost(putConfig, ContainerDescriptionService.FACTORY_LINK); containerDesc = getDocument(ContainerDescription.class, containerDesc.documentSelfLink); assertEquals(putConfig.healthConfig.urlPath, containerDesc.healthConfig.urlPath); }
@Test public void testHealthCheckSuccessWithHttpAndDefaultPort() throws Throwable { // Create health config and a container to check the health for String mockContainerDescriptionLink = UriUtils.buildUriPath( ContainerDescriptionService.FACTORY_LINK, "mockDescId"); ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = mockContainerDescriptionLink; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerState container = createContainerStateNoAddress(mockContainerDescriptionLink); container = doPost(container, ContainerFactoryService.SELF_LINK); // Start a test service to ping for health check TestHealthService pingService = new TestHealthService(); URI pingServiceUri = UriUtils.buildUri(host, TestHealthService.SELF_LINK); host.startService(Operation.createPost(pingServiceUri), pingService); waitForServiceAvailability(TestHealthService.SELF_LINK); verifyHealthSuccessAfterThreshold(containerDesc.healthConfig.healthyThreshold, containerDesc, container); }
@Test public void testContainerDescriptionServices() throws Throwable { verifyService( FactoryService.create(ContainerDescriptionService.class), ContainerDescription.class, (prefix, index) -> createContainerDescription(), (prefix, serviceDocument) -> { ContainerDescription contDesc = (ContainerDescription) serviceDocument; HealthConfig healthConfig = contDesc.healthConfig; assertEquals(healthConfig.protocol, RequestProtocol.HTTP); assertEquals(healthConfig.healthyThreshold, Integer.valueOf(2)); assertEquals(healthConfig.unhealthyThreshold, Integer.valueOf(2)); assertEquals(healthConfig.httpMethod, Action.GET); assertEquals(healthConfig.httpVersion, HttpVersion.HTTP_v1_1); assertEquals(healthConfig.urlPath, TestHealthService.SELF_LINK); assertEquals(healthConfig.timeoutMillis, Integer.valueOf(2000)); }); }
@Test public void testHealthCheckWithHttpAndDefaultPortThresholds() throws Throwable { // Create health config and a container to check the health for ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = UriUtils.buildUriPath( ContainerDescriptionService.FACTORY_LINK, "mockDescId"); containerDesc.healthConfig = new HealthConfig(); containerDesc.healthConfig.protocol = RequestProtocol.HTTP; containerDesc.healthConfig.httpMethod = Action.GET; containerDesc.healthConfig.urlPath = TestHealthService.SELF_LINK; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerState container = createContainerStateNoAddress(containerDesc.documentSelfLink); container.powerState = PowerState.RUNNING; container = doPost(container, ContainerFactoryService.SELF_LINK); verifyHealthFailureAfterThreshold(3, containerDesc, container); // Start a test service to ping for health check TestHealthService pingService = new TestHealthService(); URI pingServiceUri = UriUtils.buildUri(host, TestHealthService.SELF_LINK); host.startService(Operation.createPost(pingServiceUri), pingService); waitForServiceAvailability(TestHealthService.SELF_LINK); verifyHealthSuccessAfterThreshold(3, containerDesc, container); }
@Test public void testHealthConfigPatch() throws Throwable { ContainerDescription containerDesc = createContainerDescription(); containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerDescription patchConfig = new ContainerDescription(); patchConfig.healthConfig = new HealthConfig(); patchConfig.healthConfig.urlPath = "/ping"; patchConfig.healthConfig.protocol = RequestProtocol.TCP; doOperation(patchConfig, UriUtils.buildUri(host, containerDesc.documentSelfLink), false, Action.PATCH); ContainerDescription config = getDocument(ContainerDescription.class, containerDesc.documentSelfLink); assertEquals(patchConfig.healthConfig.urlPath, config.healthConfig.urlPath); }
waitFor(() -> { ContainerStats containerStats = getContainerStats(container.documentSelfLink); if (containerStats.healthCheckSuccess == null) { return false; waitFor(() -> { ContainerState containerWithError = getDocument(ContainerState.class, container.documentSelfLink);
ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = UriUtils.buildUriPath( ContainerDescriptionService.FACTORY_LINK, "mockDescId"); containerDesc.healthConfig.healthyThreshold = 1; containerDesc.healthConfig.unhealthyThreshold = 1; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerState container = createContainerStateNoAddress(containerDesc.documentSelfLink); container.powerState = PowerState.RUNNING; container = doPost(container, ContainerFactoryService.SELF_LINK); URI pingServiceUri = UriUtils.buildUri(host, TestHealthService.SELF_LINK); host.startService(Operation.createPost(pingServiceUri), pingService); waitForServiceAvailability(TestHealthService.SELF_LINK); verifyHealthSuccessAfterThreshold(containerDesc.healthConfig.healthyThreshold, containerDesc, container); doPatch(containerDesc, containerDesc.documentSelfLink); verifyHealthFailureAfterThreshold(containerDesc.healthConfig.unhealthyThreshold, containerDesc, container);
@Test public void testHealthCheckSuccessWithTcpAndPortBindings() throws Throwable { ComputeState containerHost = new ComputeState(); containerHost.address = host.getPreferredAddress(); containerHost.descriptionLink = UriUtils.buildUriPath(ComputeService.FACTORY_LINK, "mockId"); containerHost = doPost(containerHost, ComputeService.FACTORY_LINK); // Create health config and a container to check the health for String mockContainerDescriptionLink = UriUtils.buildUriPath( ContainerDescriptionService.FACTORY_LINK, "mockDescId"); ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = mockContainerDescriptionLink; containerDesc.healthConfig.protocol = RequestProtocol.TCP; containerDesc.healthConfig.port = 8085; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerState container = createContainerStateNoAddress(mockContainerDescriptionLink); container.parentLink = containerHost.documentSelfLink; PortBinding portBinding = new PortBinding(); portBinding.containerPort = "8085"; portBinding.hostPort = "8085"; container.ports = Arrays.asList(portBinding); container = doPost(container, ContainerFactoryService.SELF_LINK); try (ServerSocket socket = new ServerSocket(containerDesc.healthConfig.port)) { verifyHealthSuccessAfterThreshold(containerDesc.healthConfig.healthyThreshold, containerDesc, container); } }
@Test public void testHealthCheckWithCommand() throws Throwable { // Create health config and a container to check the health for String mockContainerDescriptionLink = UriUtils.buildUriPath( ContainerDescriptionService.FACTORY_LINK, "mockDescId"); ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = mockContainerDescriptionLink; containerDesc.healthConfig.healthyThreshold = 1; containerDesc.healthConfig.protocol = RequestProtocol.COMMAND; containerDesc.healthConfig.command = "echo"; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerState container = createContainerStateNoAddress(mockContainerDescriptionLink); container.adapterManagementReference = UriUtils.buildPublicUri(host, MockDockerAdapterService.SELF_LINK); container.powerState = PowerState.RUNNING; container = doPost(container, ContainerFactoryService.SELF_LINK); verifyHealthFailureAfterThreshold(containerDesc.healthConfig.unhealthyThreshold, containerDesc, container); MockDockerAdapterService dockerAdapterService = new MockDockerAdapterService(); host.startService(Operation.createPost(UriUtils.buildUri(host, MockDockerAdapterService.class)), dockerAdapterService); waitForServiceAvailability(MockDockerAdapterService.SELF_LINK); verifyHealthSuccessAfterThreshold(containerDesc.healthConfig.healthyThreshold, containerDesc, container); }
@Test public void testHealthCheckSuccessWithHttpAndPortBindings() throws Throwable { ComputeState containerHost = new ComputeState(); containerHost.address = host.getPreferredAddress(); containerHost.descriptionLink = UriUtils.buildUriPath(ComputeService.FACTORY_LINK, "mockId"); containerHost = doPost(containerHost, ComputeService.FACTORY_LINK); // Create health config and a container to check the health for String mockContainerDescriptionLink = UriUtils.buildUriPath( ContainerDescriptionService.FACTORY_LINK, "mockDescId"); ContainerDescription containerDesc = createContainerDescription(); containerDesc.documentSelfLink = mockContainerDescriptionLink; containerDesc.healthConfig.port = 85; containerDesc = doPost(containerDesc, ContainerDescriptionService.FACTORY_LINK); ContainerState container = createContainerStateNoAddress(mockContainerDescriptionLink); container.parentLink = containerHost.documentSelfLink; PortBinding portBinding = new PortBinding(); portBinding.containerPort = "85"; portBinding.hostPort = String.valueOf(host.getPort()); container.ports = Arrays.asList(portBinding); container = doPost(container, ContainerFactoryService.SELF_LINK); // Start a test service to ping for health check TestHealthService pingService = new TestHealthService(); URI pingServiceUri = UriUtils.buildUri(host, TestHealthService.SELF_LINK); host.startService(Operation.createPost(pingServiceUri), pingService); waitForServiceAvailability(TestHealthService.SELF_LINK); verifyHealthSuccessAfterThreshold(containerDesc.healthConfig.healthyThreshold, containerDesc, container); }