diff options
author | Harald Musum <musum@verizonmedia.com> | 2019-08-01 19:18:24 +0200 |
---|---|---|
committer | Harald Musum <musum@verizonmedia.com> | 2019-08-01 19:18:24 +0200 |
commit | f5fb694068351f2357f522db40946b6d3c1960d0 (patch) | |
tree | 50a204c4b4f3693f6fc2a3fe62a907f79ab3d355 /configserver | |
parent | d7681022d05a5929b4fb4935538b122eb00767ee (diff) |
Return 409 with error code LOAD_BALANCER_NOT_READY if deployment fails due to that
Move LoadBalancerServiceException to config-provisioning so that it can be used from
config server as well.
Return 409 and LOAD_BALANCER_NOT_READY as error code if we get a LoadBalancerServiceException.
Retry deploy on LOAD_BALANCER_NOT_READY.
Diffstat (limited to 'configserver')
3 files changed, 43 insertions, 1 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpErrorResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpErrorResponse.java index 3d2ecd4a2ca..6559292645c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpErrorResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpErrorResponse.java @@ -49,7 +49,8 @@ public class HttpErrorResponse extends HttpResponse { REQUEST_TIMEOUT, UNKNOWN_VESPA_VERSION, PARENT_HOST_NOT_READY, - CERTIFICATE_NOT_READY + CERTIFICATE_NOT_READY, + LOAD_BALANCER_NOT_READY } public static HttpErrorResponse notFoundError(String msg) { @@ -100,6 +101,10 @@ public class HttpErrorResponse extends HttpResponse { return new HttpErrorResponse(CONFLICT, errorCodes.CERTIFICATE_NOT_READY.name(), msg); } + public static HttpErrorResponse loadBalancerNotReady(String msg) { + return new HttpErrorResponse(CONFLICT, errorCodes.LOAD_BALANCER_NOT_READY.name(), msg); + } + @Override public void render(OutputStream stream) throws IOException { new JsonFormat(true).encode(stream, slime); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java index 20ee77be9fe..7cdb8d3a60c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.config.server.http; import com.yahoo.config.provision.ApplicationLockException; import com.yahoo.config.provision.CertificateNotReadyException; import com.yahoo.config.provision.ParentHostUnavailableException; +import com.yahoo.config.provision.exception.LoadBalancerServiceException; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.container.jdisc.LoggingRequestHandler; @@ -67,6 +68,8 @@ public class HttpHandler extends LoggingRequestHandler { return HttpErrorResponse.parentHostNotReady(getMessage(e, request)); } catch (CertificateNotReadyException e) { return HttpErrorResponse.certificateNotReady(getMessage(e, request)); + } catch (LoadBalancerServiceException e) { + return HttpErrorResponse.loadBalancerNotReady(getMessage(e, request)); } catch (Exception e) { log.log(LogLevel.WARNING, "Unexpected exception handling a config server request", e); return HttpErrorResponse.internalServerError(getMessage(e, request)); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java index 651dde375ee..e219c516f95 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java @@ -9,14 +9,22 @@ import com.yahoo.config.model.application.provider.BaseDeployLogger; import com.yahoo.config.model.application.provider.FilesApplicationPackage; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; +import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.CertificateNotReadyException; +import com.yahoo.config.provision.ClusterSpec; +import com.yahoo.config.provision.HostFilter; +import com.yahoo.config.provision.HostSpec; import com.yahoo.config.provision.InstanceName; +import com.yahoo.config.provision.ProvisionLogger; +import com.yahoo.config.provision.Provisioner; import com.yahoo.config.provision.Rotation; import com.yahoo.config.provision.TenantName; +import com.yahoo.config.provision.exception.LoadBalancerServiceException; import com.yahoo.io.IOUtils; import com.yahoo.log.LogLevel; import com.yahoo.path.Path; import com.yahoo.slime.Slime; +import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.config.server.MockReloadHandler; import com.yahoo.vespa.config.server.MockSecretStore; import com.yahoo.vespa.config.server.TestComponentRegistry; @@ -45,6 +53,7 @@ import java.io.File; import java.io.IOException; import java.time.Instant; import java.util.Arrays; +import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Optional; @@ -294,6 +303,13 @@ public class SessionPreparerTest { prepare(new File("src/test/resources/deploy/hosted-app"), params); } + @Test(expected = LoadBalancerServiceException.class) + public void require_that_conflict_is_returned_when_creating_load_balancer_fails() throws IOException { + preparer = createPreparer(HostProvisionerProvider.withProvisioner(new FailWithTransientExceptionProvisioner())); + var params = new PrepareParams.Builder().applicationId(applicationId("test")).build(); + prepare(new File("src/test/resources/deploy/hosted-app"), params); + } + private void prepare(File app) throws IOException { prepare(app, new PrepareParams.Builder().build()); } @@ -327,4 +343,22 @@ public class SessionPreparerTest { ApplicationName.from(applicationName), InstanceName.defaultName()); } + private static class FailWithTransientExceptionProvisioner implements Provisioner { + + @Override + public List<HostSpec> prepare(ApplicationId applicationId, ClusterSpec cluster, Capacity capacity, int groups, ProvisionLogger logger) { + throw new LoadBalancerServiceException("Unable to create load balancer", new Exception("some internal exception")); + } + + @Override + public void activate(NestedTransaction transaction, ApplicationId application, Collection<HostSpec> hosts) { } + + @Override + public void remove(NestedTransaction transaction, ApplicationId application) { } + + @Override + public void restart(ApplicationId application, HostFilter filter) { } + + } + } |