Search in sources :

Example 1 with RollingUpdateResponse

use of com.spotify.helios.common.protocol.RollingUpdateResponse in project helios by spotify.

the class DeploymentGroupResource method rollingUpdate.

@POST
@Path("/{name}/rolling-update")
@Produces(APPLICATION_JSON)
@Timed
@ExceptionMetered
public Response rollingUpdate(@PathParam("name") @Valid final String name, @Valid final RollingUpdateRequest args) {
    try {
        final DeploymentGroup deploymentGroup = model.getDeploymentGroup(name);
        model.rollingUpdate(deploymentGroup, args.getJob(), args.getRolloutOptions());
        return Response.ok(new RollingUpdateResponse(RollingUpdateResponse.Status.OK)).build();
    } catch (DeploymentGroupDoesNotExistException e) {
        return Response.ok(new RollingUpdateResponse(RollingUpdateResponse.Status.DEPLOYMENT_GROUP_NOT_FOUND)).build();
    } catch (JobDoesNotExistException e) {
        return Response.ok(new RollingUpdateResponse(RollingUpdateResponse.Status.JOB_NOT_FOUND)).build();
    }
}
Also used : JobDoesNotExistException(com.spotify.helios.master.JobDoesNotExistException) RollingUpdateResponse(com.spotify.helios.common.protocol.RollingUpdateResponse) DeploymentGroupDoesNotExistException(com.spotify.helios.master.DeploymentGroupDoesNotExistException) DeploymentGroup(com.spotify.helios.common.descriptors.DeploymentGroup) Path(javax.ws.rs.Path) POST(javax.ws.rs.POST) Produces(javax.ws.rs.Produces) Timed(com.codahale.metrics.annotation.Timed) ExceptionMetered(com.codahale.metrics.annotation.ExceptionMetered)

Example 2 with RollingUpdateResponse

use of com.spotify.helios.common.protocol.RollingUpdateResponse in project helios by spotify.

the class RollingUpdateCommandTest method testRollingUpdateOverlapJson.

@Test
public void testRollingUpdateOverlapJson() throws Exception {
    when(client.rollingUpdate(anyString(), any(JobId.class), any(RolloutOptions.class))).thenReturn(immediateFuture(new RollingUpdateResponse(RollingUpdateResponse.Status.OK)));
    when(client.deploymentGroupStatus(GROUP_NAME)).then(new ResponseAnswer(statusResponse(DeploymentGroupStatusResponse.Status.ACTIVE, null, makeHostStatus("host1", JOB_ID, TaskStatus.State.RUNNING))));
    when(options.getBoolean("overlap")).thenReturn(true);
    final int ret = command.runWithJobId(options, client, out, true, JOB_ID, null);
    final String output = baos.toString();
    // Verify that rollingUpdate() was called with migrate=true
    verify(client).rollingUpdate(GROUP_NAME, JOB_ID, new RolloutOptions(TIMEOUT, PARALLELISM, false, true, TOKEN));
    assertEquals(0, ret);
    assertJsonOutputEquals(output, ImmutableMap.<String, Object>builder().put("status", "DONE").put("duration", 0.00).put("parallelism", PARALLELISM).put("timeout", TIMEOUT).put("overlap", true).put("token", TOKEN).build());
}
Also used : RolloutOptions(com.spotify.helios.common.descriptors.RolloutOptions) RollingUpdateResponse(com.spotify.helios.common.protocol.RollingUpdateResponse) Matchers.anyString(org.mockito.Matchers.anyString) JobId(com.spotify.helios.common.descriptors.JobId) Test(org.junit.Test)

Example 3 with RollingUpdateResponse

use of com.spotify.helios.common.protocol.RollingUpdateResponse in project helios by spotify.

the class RollingUpdateCommandTest method testRollingUpdateFailsIfJobIdChangedDuringRolloutJson.

@Test
public void testRollingUpdateFailsIfJobIdChangedDuringRolloutJson() throws Exception {
    when(client.rollingUpdate(anyString(), any(JobId.class), any(RolloutOptions.class))).thenReturn(immediateFuture(new RollingUpdateResponse(RollingUpdateResponse.Status.OK)));
    when(client.deploymentGroupStatus(GROUP_NAME)).then(new ResponseAnswer(statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, null, makeHostStatus("host1", null, null), makeHostStatus("host2", OLD_JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host3", OLD_JOB_ID, TaskStatus.State.RUNNING)), statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, NEW_JOB_ID, null, makeHostStatus("host1", JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host2", JOB_ID, TaskStatus.State.STARTING), makeHostStatus("host3", OLD_JOB_ID, TaskStatus.State.RUNNING))));
    final int ret = command.runWithJobId(options, client, out, true, JOB_ID, null);
    final String output = baos.toString();
    verify(client).rollingUpdate(GROUP_NAME, JOB_ID, new RolloutOptions(TIMEOUT, PARALLELISM, false, false, TOKEN));
    assertEquals(1, ret);
    assertJsonOutputEquals(output, ImmutableMap.<String, Object>builder().put("status", "FAILED").put("error", "Deployment-group job id changed during rolling-update").put("duration", 1.00).put("parallelism", PARALLELISM).put("timeout", TIMEOUT).put("overlap", false).put("token", TOKEN).build());
}
Also used : RolloutOptions(com.spotify.helios.common.descriptors.RolloutOptions) RollingUpdateResponse(com.spotify.helios.common.protocol.RollingUpdateResponse) Matchers.anyString(org.mockito.Matchers.anyString) JobId(com.spotify.helios.common.descriptors.JobId) Test(org.junit.Test)

Example 4 with RollingUpdateResponse

use of com.spotify.helios.common.protocol.RollingUpdateResponse in project helios by spotify.

the class RollingUpdateCommandTest method testRollingUpdateFailsOnRolloutTimeoutJson.

@Test
public void testRollingUpdateFailsOnRolloutTimeoutJson() throws Exception {
    when(client.rollingUpdate(anyString(), any(JobId.class), any(RolloutOptions.class))).thenReturn(immediateFuture(new RollingUpdateResponse(RollingUpdateResponse.Status.OK)));
    when(client.deploymentGroupStatus(GROUP_NAME)).then(new ResponseAnswer(statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, null, makeHostStatus("host1", null, null), makeHostStatus("host2", null, null)), statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, null, makeHostStatus("host1", JOB_ID, TaskStatus.State.PULLING_IMAGE), makeHostStatus("host2", null, null))));
    final int ret = command.runWithJobId(options, client, out, true, JOB_ID, null);
    final String output = baos.toString();
    verify(client).rollingUpdate(GROUP_NAME, JOB_ID, new RolloutOptions(TIMEOUT, PARALLELISM, false, false, TOKEN));
    assertEquals(1, ret);
    assertJsonOutputEquals(output, ImmutableMap.<String, Object>builder().put("status", "TIMEOUT").put("duration", 601.00).put("parallelism", PARALLELISM).put("timeout", TIMEOUT).put("overlap", false).put("token", TOKEN).build());
}
Also used : RolloutOptions(com.spotify.helios.common.descriptors.RolloutOptions) RollingUpdateResponse(com.spotify.helios.common.protocol.RollingUpdateResponse) Matchers.anyString(org.mockito.Matchers.anyString) JobId(com.spotify.helios.common.descriptors.JobId) Test(org.junit.Test)

Example 5 with RollingUpdateResponse

use of com.spotify.helios.common.protocol.RollingUpdateResponse in project helios by spotify.

the class RollingUpdateCommandTest method testRollingUpdate.

@Test
public void testRollingUpdate() throws Exception {
    when(client.rollingUpdate(anyString(), any(JobId.class), any(RolloutOptions.class))).thenReturn(immediateFuture(new RollingUpdateResponse(RollingUpdateResponse.Status.OK)));
    when(client.deploymentGroupStatus(GROUP_NAME)).then(new ResponseAnswer(statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, null), statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, null, makeHostStatus("host1", null, null), makeHostStatus("host2", OLD_JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host3", OLD_JOB_ID, TaskStatus.State.RUNNING)), statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, null, makeHostStatus("host1", JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host2", JOB_ID, TaskStatus.State.PULLING_IMAGE), makeHostStatus("host3", OLD_JOB_ID, TaskStatus.State.RUNNING)), statusResponse(DeploymentGroupStatusResponse.Status.ROLLING_OUT, null, makeHostStatus("host1", JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host2", JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host3", JOB_ID, TaskStatus.State.CREATING)), statusResponse(DeploymentGroupStatusResponse.Status.ACTIVE, null, makeHostStatus("host1", JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host2", JOB_ID, TaskStatus.State.RUNNING), makeHostStatus("host3", JOB_ID, TaskStatus.State.RUNNING))));
    final int ret = command.runWithJobId(options, client, out, false, JOB_ID, null);
    final String output = baos.toString();
    verify(client).rollingUpdate(GROUP_NAME, JOB_ID, new RolloutOptions(TIMEOUT, PARALLELISM, false, false, TOKEN));
    assertEquals(0, ret);
    final String expected = ("Rolling update started: my_group -> foo:2:1212121 (parallelism=1, timeout=300, " + "overlap=false, token=" + TOKEN + ")\n" + "\n" + "host1 -> RUNNING (1/3)\n" + "host2 -> RUNNING (2/3)\n" + "host3 -> RUNNING (3/3)\n" + "\n" + "Done.\n" + "Duration: 4.00 s\n");
    assertEquals(expected, output.replaceAll("\\p{Blank}+|(?:\\p{Blank})$", " "));
}
Also used : RolloutOptions(com.spotify.helios.common.descriptors.RolloutOptions) RollingUpdateResponse(com.spotify.helios.common.protocol.RollingUpdateResponse) Matchers.anyString(org.mockito.Matchers.anyString) JobId(com.spotify.helios.common.descriptors.JobId) Test(org.junit.Test)

Aggregations

RollingUpdateResponse (com.spotify.helios.common.protocol.RollingUpdateResponse)16 JobId (com.spotify.helios.common.descriptors.JobId)15 RolloutOptions (com.spotify.helios.common.descriptors.RolloutOptions)15 Test (org.junit.Test)14 Matchers.anyString (org.mockito.Matchers.anyString)12 DeploymentGroup (com.spotify.helios.common.descriptors.DeploymentGroup)3 CreateDeploymentGroupResponse (com.spotify.helios.common.protocol.CreateDeploymentGroupResponse)2 RemoveDeploymentGroupResponse (com.spotify.helios.common.protocol.RemoveDeploymentGroupResponse)2 RollingUpdateRequest (com.spotify.helios.common.protocol.RollingUpdateRequest)2 DeploymentGroupDoesNotExistException (com.spotify.helios.master.DeploymentGroupDoesNotExistException)2 JobDoesNotExistException (com.spotify.helios.master.JobDoesNotExistException)2 Response (javax.ws.rs.core.Response)2 ExceptionMetered (com.codahale.metrics.annotation.ExceptionMetered)1 Timed (com.codahale.metrics.annotation.Timed)1 TaskStatus (com.spotify.helios.common.descriptors.TaskStatus)1 DeploymentGroupStatusResponse (com.spotify.helios.common.protocol.DeploymentGroupStatusResponse)1 POST (javax.ws.rs.POST)1 Path (javax.ws.rs.Path)1 Produces (javax.ws.rs.Produces)1