summaryrefslogtreecommitdiffstats
path: root/configserver
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2019-08-01 19:18:24 +0200
committerHarald Musum <musum@verizonmedia.com>2019-08-01 19:18:24 +0200
commitf5fb694068351f2357f522db40946b6d3c1960d0 (patch)
tree50a204c4b4f3693f6fc2a3fe62a907f79ab3d355 /configserver
parentd7681022d05a5929b4fb4935538b122eb00767ee (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')
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpErrorResponse.java7
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/HttpHandler.java3
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/session/SessionPreparerTest.java34
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) { }
+
+ }
+
}