From 9f8cc39d5b36594416db58897c177c32f4bc850b Mon Sep 17 00:00:00 2001 From: David Xia Date: Thu, 16 Jul 2015 13:32:56 -0400 Subject: [PATCH] Fix deployment group status when no rolling-update --- .../protocol/DeploymentGroupStatusResponse.java | 7 ++++--- .../helios/master/ZooKeeperMasterModel.java | 14 +++++++++++++- .../master/resources/DeploymentGroupResource.java | 13 +++++-------- .../spotify/helios/system/DeploymentGroupTest.java | 8 ++++++++ 4 files changed, 30 insertions(+), 12 deletions(-) diff --git a/helios-client/src/main/java/com/spotify/helios/common/protocol/DeploymentGroupStatusResponse.java b/helios-client/src/main/java/com/spotify/helios/common/protocol/DeploymentGroupStatusResponse.java index 916454b57..23b717b5f 100644 --- a/helios-client/src/main/java/com/spotify/helios/common/protocol/DeploymentGroupStatusResponse.java +++ b/helios-client/src/main/java/com/spotify/helios/common/protocol/DeploymentGroupStatusResponse.java @@ -39,7 +39,8 @@ public class DeploymentGroupStatusResponse { public enum Status { ROLLING_OUT, ACTIVE, - FAILED + FAILED, + IDLE } public static class HostStatus { @@ -112,12 +113,12 @@ public DeploymentGroupStatusResponse( @JsonProperty("status") final Status status, @JsonProperty("error") final String error, @JsonProperty("hostStatuses") final List hostStatuses, - @JsonProperty("deploymentGroupStatus") final DeploymentGroupStatus deploymentGroupStatus) { + @JsonProperty("deploymentGroupStatus") @Nullable final DeploymentGroupStatus dgs) { this.deploymentGroup = deploymentGroup; this.status = status; this.error = error; this.hostStatuses = hostStatuses; - this.deploymentGroupStatus = deploymentGroupStatus; + this.deploymentGroupStatus = dgs; } public DeploymentGroup getDeploymentGroup() { diff --git a/helios-services/src/main/java/com/spotify/helios/master/ZooKeeperMasterModel.java b/helios-services/src/main/java/com/spotify/helios/master/ZooKeeperMasterModel.java index fff57ba0b..aa5a40a20 100644 --- a/helios-services/src/main/java/com/spotify/helios/master/ZooKeeperMasterModel.java +++ b/helios-services/src/main/java/com/spotify/helios/master/ZooKeeperMasterModel.java @@ -512,6 +512,12 @@ public void rollingUpdateStep(final DeploymentGroup deploymentGroup, final String statusPath = Paths.statusDeploymentGroup(deploymentGroup.getName()); final DeploymentGroupStatus status = getDeploymentGroupStatus(deploymentGroup.getName()); + if (status == null) { + // The rolling-update command hasn't been called yet for this deployment group. + // The deployment group status doesn't exist yet and there's nothing to do. + return; + } + final List operations = Lists.newArrayList(); if (status.getState().equals(PLANNING_ROLLOUT)) { @@ -785,7 +791,13 @@ public DeploymentGroupStatus getDeploymentGroupStatus(final String name) try { final Node node = client.getNode(Paths.statusDeploymentGroup(name)); - final DeploymentGroupStatus status = Json.read(node.getBytes(), DeploymentGroupStatus.class); + + final byte[] bytes = node.getBytes(); + if (bytes.length == 0) { + return null; + } + + final DeploymentGroupStatus status = Json.read(bytes, DeploymentGroupStatus.class); return status.toBuilder() .setVersion(node.getStat().getVersion()) .build(); diff --git a/helios-services/src/main/java/com/spotify/helios/master/resources/DeploymentGroupResource.java b/helios-services/src/main/java/com/spotify/helios/master/resources/DeploymentGroupResource.java index 9aa11938d..e06bd5b1d 100644 --- a/helios-services/src/main/java/com/spotify/helios/master/resources/DeploymentGroupResource.java +++ b/helios-services/src/main/java/com/spotify/helios/master/resources/DeploymentGroupResource.java @@ -183,10 +183,6 @@ public Response getDeploymentGroupStatus(@PathParam("name") @Valid final String final DeploymentGroup deploymentGroup = model.getDeploymentGroup(name); final DeploymentGroupStatus deploymentGroupStatus = model.getDeploymentGroupStatus(name); - if (deploymentGroupStatus == null) { - throw new DeploymentGroupDoesNotExistException(name); - } - final List hosts = model.getDeploymentGroupHosts(name); final List result = Lists.newArrayList(); @@ -213,7 +209,9 @@ public Response getDeploymentGroupStatus(@PathParam("name") @Valid final String } final DeploymentGroupStatusResponse.Status status; - if (deploymentGroupStatus.getState() == DeploymentGroupStatus.State.FAILED) { + if (deploymentGroupStatus == null) { + status = DeploymentGroupStatusResponse.Status.IDLE; + } else if (deploymentGroupStatus.getState() == DeploymentGroupStatus.State.FAILED) { status = DeploymentGroupStatusResponse.Status.FAILED; } else if (deploymentGroupStatus.getSuccessfulIterations() > 0) { status = DeploymentGroupStatusResponse.Status.ACTIVE; @@ -221,10 +219,9 @@ public Response getDeploymentGroupStatus(@PathParam("name") @Valid final String status = DeploymentGroupStatusResponse.Status.ROLLING_OUT; } + final String error = deploymentGroupStatus == null ? "" : deploymentGroupStatus.getError(); return Response.ok(new DeploymentGroupStatusResponse( - deploymentGroup, status, deploymentGroupStatus.getError(), - result, deploymentGroupStatus)) - .build(); + deploymentGroup, status, error, result, deploymentGroupStatus)).build(); } catch (final DeploymentGroupDoesNotExistException e) { return Response.status(Response.Status.NOT_FOUND).build(); } diff --git a/helios-system-tests/src/main/java/com/spotify/helios/system/DeploymentGroupTest.java b/helios-system-tests/src/main/java/com/spotify/helios/system/DeploymentGroupTest.java index 3690b3cfc..924c28552 100644 --- a/helios-system-tests/src/main/java/com/spotify/helios/system/DeploymentGroupTest.java +++ b/helios-system-tests/src/main/java/com/spotify/helios/system/DeploymentGroupTest.java @@ -176,6 +176,14 @@ public void testRollingUpdateGroupNotFound() throws Exception { RollingUpdateResponse.class).getStatus()); } + @Test + public void testStatusNoRollingUpdate() throws Exception { + cli("create-deployment-group", "--json", TEST_GROUP, "foo=bar", "baz=qux"); + assertEquals(DeploymentGroupStatusResponse.Status.IDLE, + OBJECT_MAPPER.readValue(cli("status-deployment-group", "--json", TEST_GROUP), + DeploymentGroupStatusResponse.class).getStatus()); + } + @Test public void testRollingUpdateMigrate() throws Exception { final String host = testHost();