diff options
author | Håkon Hallingstad <hakon@yahoo-inc.com> | 2017-06-12 01:13:05 +0200 |
---|---|---|
committer | Håkon Hallingstad <hakon@yahoo-inc.com> | 2017-06-12 01:13:05 +0200 |
commit | 29f331a02b091d1dbd958a95c8b562165326d76a (patch) | |
tree | 37f3cff32b20137af09f131d80f5fecea2e6b945 /orchestrator/src/test | |
parent | 3d0f44f63919702713908b8da56434a5260f18df (diff) |
Orchestrator support for setting host status
Directly setting the host status can be useful for an operator, e.g. to break a
deadlock.
Unfortunately, some code use the term "host status" while others use "host
state". I haven't settled yet on which is preferred, e.g. 'state' is used in
REST APIs, but 'status' is the original term and slightly more used. This PR
maintains the local use of the terms, meaning it adds 'state' where that's
normally used and 'status' other places.
Setting the deadlock is done with a PATCH request, which is defined in
jaxrs_utils. jaxrs_utils only defines PATCH, and that's not used anywhere else
except in jaxrs_client_utils tests. So I remove this module as a dependency a
couple of places.
Diffstat (limited to 'orchestrator/src/test')
-rw-r--r-- | orchestrator/src/test/java/com/yahoo/vespa/orchestrator/OrchestratorImplTest.java | 9 | ||||
-rw-r--r-- | orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/HostResourceTest.java | 49 |
2 files changed, 58 insertions, 0 deletions
diff --git a/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/OrchestratorImplTest.java b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/OrchestratorImplTest.java index ccee70630af..448ae78a21a 100644 --- a/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/OrchestratorImplTest.java +++ b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/OrchestratorImplTest.java @@ -218,6 +218,15 @@ public class OrchestratorImplTest { } @Test + public void testSetNodeState() throws OrchestrationException { + assertEquals(HostStatus.NO_REMARKS, orchestrator.getNodeStatus(app1_host1)); + orchestrator.setNodeStatus(app1_host1, HostStatus.ALLOWED_TO_BE_DOWN); + assertEquals(HostStatus.ALLOWED_TO_BE_DOWN, orchestrator.getNodeStatus(app1_host1)); + orchestrator.setNodeStatus(app1_host1, HostStatus.NO_REMARKS); + assertEquals(HostStatus.NO_REMARKS, orchestrator.getNodeStatus(app1_host1)); + } + + @Test public void rollbackWorks() throws Exception { // A spy is preferential because suspendAll() relies on delegating the hard work to suspend() and resume(). OrchestratorImpl orchestrator = spy(this.orchestrator); diff --git a/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/HostResourceTest.java b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/HostResourceTest.java index 3d3117f9e07..aecfd79e505 100644 --- a/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/HostResourceTest.java +++ b/orchestrator/src/test/java/com/yahoo/vespa/orchestrator/resources/HostResourceTest.java @@ -7,6 +7,8 @@ import com.yahoo.vespa.applicationmodel.ApplicationInstanceReference; import com.yahoo.vespa.applicationmodel.HostName; import com.yahoo.vespa.applicationmodel.TenantId; import com.yahoo.vespa.orchestrator.InstanceLookupService; +import com.yahoo.vespa.orchestrator.OrchestrationException; +import com.yahoo.vespa.orchestrator.Orchestrator; import com.yahoo.vespa.orchestrator.OrchestratorImpl; import com.yahoo.vespa.orchestrator.controller.ClusterControllerClientFactoryMock; import com.yahoo.vespa.orchestrator.model.ApplicationApi; @@ -14,6 +16,8 @@ import com.yahoo.vespa.orchestrator.policy.HostStateChangeDeniedException; import com.yahoo.vespa.orchestrator.policy.Policy; import com.yahoo.vespa.orchestrator.restapi.wire.BatchHostSuspendRequest; import com.yahoo.vespa.orchestrator.restapi.wire.BatchOperationResult; +import com.yahoo.vespa.orchestrator.restapi.wire.PatchHostRequest; +import com.yahoo.vespa.orchestrator.restapi.wire.PatchHostResponse; import com.yahoo.vespa.orchestrator.restapi.wire.UpdateHostResponse; import com.yahoo.vespa.orchestrator.status.ApplicationInstanceStatus; import com.yahoo.vespa.orchestrator.status.HostStatus; @@ -22,6 +26,8 @@ import com.yahoo.vespa.orchestrator.status.StatusService; import com.yahoo.vespa.service.monitor.ServiceMonitorStatus; import org.junit.Test; +import javax.ws.rs.BadRequestException; +import javax.ws.rs.InternalServerErrorException; import javax.ws.rs.WebApplicationException; import java.util.Arrays; import java.util.Collections; @@ -31,9 +37,13 @@ import java.util.Set; import static com.yahoo.vespa.orchestrator.TestUtil.makeServiceClusterSet; import static org.fest.assertions.Assertions.assertThat; import static org.fest.assertions.Fail.fail; +import static org.junit.Assert.assertEquals; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; public class HostResourceTest { @@ -262,4 +272,43 @@ public class HostResourceTest { assertThat(w.getResponse().getStatus()).isEqualTo(409); } } + + @Test(expected = BadRequestException.class) + public void patch_state_may_throw_bad_request() { + Orchestrator orchestrator = mock(Orchestrator.class); + HostResource hostResource = new HostResource(orchestrator); + + String hostNameString = "hostname"; + PatchHostRequest request = new PatchHostRequest(); + request.state = "bad state"; + + hostResource.patch(hostNameString, request); + } + + @Test + public void patch_works() throws OrchestrationException { + Orchestrator orchestrator = mock(Orchestrator.class); + HostResource hostResource = new HostResource(orchestrator); + + String hostNameString = "hostname"; + PatchHostRequest request = new PatchHostRequest(); + request.state = "NO_REMARKS"; + + PatchHostResponse response = hostResource.patch(hostNameString, request); + assertEquals(response.description, "ok"); + verify(orchestrator, times(1)).setNodeStatus(new HostName(hostNameString), HostStatus.NO_REMARKS); + } + + @Test(expected = InternalServerErrorException.class) + public void patch_handles_exception_in_orchestrator() throws OrchestrationException { + Orchestrator orchestrator = mock(Orchestrator.class); + HostResource hostResource = new HostResource(orchestrator); + + String hostNameString = "hostname"; + PatchHostRequest request = new PatchHostRequest(); + request.state = "NO_REMARKS"; + + doThrow(new OrchestrationException("error")).when(orchestrator).setNodeStatus(new HostName(hostNameString), HostStatus.NO_REMARKS); + hostResource.patch(hostNameString, request); + } } |