summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Musum <musum@verizonmedia.com>2020-09-10 09:44:14 +0200
committerGitHub <noreply@github.com>2020-09-10 09:44:14 +0200
commit2f804d532d1b7944a24a8edb7dfd49e2ed6701d7 (patch)
tree271a19becaf37ebc5d860f2dabf85def5ed3eaa8
parent59d5701e59700d78854d5e994dca63dc414443f6 (diff)
parent788a499bf734f05853954c6c96b19c9e8e28c7f2 (diff)
Merge pull request #14358 from vespa-engine/revert-14350-revert-14331-hmusum/add-force-param-to-PrepareParams
Reapply "Add force request property to PrepareParams"
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java29
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java18
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java13
-rw-r--r--configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java16
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java2
-rw-r--r--configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java5
7 files changed, 43 insertions, 42 deletions
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
index eb13baf3e6b..fb07bf626f3 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java
@@ -285,12 +285,11 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
}
}
- public PrepareResult deploy(CompressedApplicationInputStream in, PrepareParams prepareParams,
- boolean ignoreSessionStaleFailure, Instant now) {
+ public PrepareResult deploy(CompressedApplicationInputStream in, PrepareParams prepareParams, Instant now) {
File tempDir = uncheck(() -> Files.createTempDirectory("deploy")).toFile();
PrepareResult prepareResult;
try {
- prepareResult = deploy(decompressApplication(in, tempDir), prepareParams, ignoreSessionStaleFailure, now);
+ prepareResult = deploy(decompressApplication(in, tempDir), prepareParams, now);
} finally {
cleanupTempDirectory(tempDir);
}
@@ -298,16 +297,15 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
}
public PrepareResult deploy(File applicationPackage, PrepareParams prepareParams) {
- return deploy(applicationPackage, prepareParams, false, Instant.now());
+ return deploy(applicationPackage, prepareParams, Instant.now());
}
- public PrepareResult deploy(File applicationPackage, PrepareParams prepareParams,
- boolean ignoreSessionStaleFailure, Instant now) {
+ public PrepareResult deploy(File applicationPackage, PrepareParams prepareParams, Instant now) {
ApplicationId applicationId = prepareParams.getApplicationId();
long sessionId = createSession(applicationId, prepareParams.getTimeoutBudget(), applicationPackage);
Tenant tenant = getTenant(applicationId);
PrepareResult result = prepare(tenant, sessionId, prepareParams, now);
- activate(tenant, sessionId, prepareParams.getTimeoutBudget(), ignoreSessionStaleFailure);
+ activate(tenant, sessionId, prepareParams.getTimeoutBudget(), prepareParams.force());
return result;
}
@@ -386,23 +384,22 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
public ApplicationId activate(Tenant tenant,
long sessionId,
TimeoutBudget timeoutBudget,
- boolean ignoreSessionStaleFailure) {
+ boolean force) {
LocalSession localSession = getLocalSession(tenant, sessionId);
- Deployment deployment = deployFromPreparedSession(localSession, tenant, timeoutBudget.timeLeft());
- deployment.setIgnoreSessionStaleFailure(ignoreSessionStaleFailure);
+ Deployment deployment = deployment(localSession, tenant, timeoutBudget.timeLeft(), force);
deployment.activate();
return localSession.getApplicationId();
}
- private Deployment deployFromPreparedSession(LocalSession session, Tenant tenant, Duration timeout) {
- return Deployment.prepared(session, this, hostProvisioner, tenant, timeout, clock, false);
+ private Deployment deployment(LocalSession session, Tenant tenant, Duration timeout, boolean force) {
+ return Deployment.prepared(session, this, hostProvisioner, tenant, timeout, clock, false, force);
}
- public Transaction deactivateCurrentActivateNew(Session active, LocalSession prepared, boolean ignoreStaleSessionFailure) {
+ public Transaction deactivateCurrentActivateNew(Session active, LocalSession prepared, boolean force) {
Tenant tenant = tenantRepository.getTenant(prepared.getTenantName());
Transaction transaction = tenant.getSessionRepository().createActivateTransaction(prepared);
if (active != null) {
- checkIfActiveHasChanged(prepared, active, ignoreStaleSessionFailure);
+ checkIfActiveHasChanged(prepared, active, force);
checkIfActiveIsNewerThanSessionToBeActivated(prepared.getSessionId(), active.getSessionId());
transaction.add(active.createDeactivateTransaction().operations());
}
@@ -742,10 +739,10 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye
- public CompletionWaiter activate(LocalSession session, Session previousActiveSession, ApplicationId applicationId, boolean ignoreSessionStaleFailure) {
+ public CompletionWaiter activate(LocalSession session, Session previousActiveSession, ApplicationId applicationId, boolean force) {
CompletionWaiter waiter = session.getSessionZooKeeperClient().createActiveWaiter();
NestedTransaction transaction = new NestedTransaction();
- transaction.add(deactivateCurrentActivateNew(previousActiveSession, session, ignoreSessionStaleFailure));
+ transaction.add(deactivateCurrentActivateNew(previousActiveSession, session, force));
hostProvisioner.ifPresent(provisioner -> provisioner.activate(transaction, applicationId, session.getAllocatedHosts().getHosts()));
transaction.commit();
return waiter;
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
index 11ce659625d..6ce17f859b5 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/Deployment.java
@@ -67,11 +67,12 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
/** Whether this model should be validated (only takes effect if prepared=false) */
private final boolean validate;
- private boolean ignoreSessionStaleFailure = false;
+ /** Whether activation of this model should be forced */
+ private final boolean force;
private Deployment(LocalSession session, ApplicationRepository applicationRepository,
Optional<Provisioner> hostProvisioner, Tenant tenant, Duration timeout,
- Clock clock, boolean prepared, boolean validate, boolean isBootstrap) {
+ Clock clock, boolean prepared, boolean validate, boolean isBootstrap, boolean force) {
this.session = session;
this.applicationRepository = applicationRepository;
this.hostProvisioner = hostProvisioner;
@@ -84,24 +85,21 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
this.version = session.getVespaVersion();
this.isBootstrap = isBootstrap;
this.athenzDomain = session.getAthenzDomain();
+ this.force = force;
}
public static Deployment unprepared(LocalSession session, ApplicationRepository applicationRepository,
Optional<Provisioner> hostProvisioner, Tenant tenant,
Duration timeout, Clock clock, boolean validate, boolean isBootstrap) {
return new Deployment(session, applicationRepository, hostProvisioner, tenant, timeout, clock, false,
- validate, isBootstrap);
+ validate, isBootstrap, false);
}
public static Deployment prepared(LocalSession session, ApplicationRepository applicationRepository,
Optional<Provisioner> hostProvisioner, Tenant tenant,
- Duration timeout, Clock clock, boolean isBootstrap) {
+ Duration timeout, Clock clock, boolean isBootstrap, boolean force) {
return new Deployment(session, applicationRepository, hostProvisioner, tenant,
- timeout, clock, true, true, isBootstrap);
- }
-
- public void setIgnoreSessionStaleFailure(boolean ignoreSessionStaleFailure) {
- this.ignoreSessionStaleFailure = ignoreSessionStaleFailure;
+ timeout, clock, true, true, isBootstrap, force);
}
/** Prepares this. This does nothing if this is already prepared */
@@ -142,7 +140,7 @@ public class Deployment implements com.yahoo.config.provision.Deployment {
CompletionWaiter waiter;
try (Lock lock = tenant.getApplicationRepo().lock(applicationId)) {
previousActiveSession = applicationRepository.getActiveSession(applicationId);
- waiter = applicationRepository.activate(session, previousActiveSession, applicationId, ignoreSessionStaleFailure);
+ waiter = applicationRepository.activate(session, previousActiveSession, applicationId, force);
}
catch (RuntimeException e) {
throw e;
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java
index dedd96da6f3..d6badb8a9a2 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java
@@ -53,13 +53,10 @@ public class ApplicationApiHandler extends SessionHandler {
@Override
protected HttpResponse handlePOST(HttpRequest request) {
validateDataAndHeader(request);
- Tenant tenant = validateTenant(request);
- PrepareParams prepareParams = PrepareParams.fromHttpRequest(request, tenant.getName(), zookeeperBarrierTimeout);
+ TenantName tenantName = validateTenant(request);
+ PrepareParams prepareParams = PrepareParams.fromHttpRequest(request, tenantName, zookeeperBarrierTimeout);
CompressedApplicationInputStream compressedStream = createFromCompressedStream(request.getData(), request.getHeader(contentTypeHeader));
- PrepareResult result = applicationRepository.deploy(compressedStream,
- prepareParams,
- shouldIgnoreSessionStaleFailure(request),
- Instant.now());
+ PrepareResult result = applicationRepository.deploy(compressedStream, prepareParams, Instant.now());
return new SessionPrepareAndActivateResponse(result, request, prepareParams.getApplicationId(), zone);
}
@@ -68,10 +65,10 @@ public class ApplicationApiHandler extends SessionHandler {
return zookeeperBarrierTimeout.plus(Duration.ofSeconds(10));
}
- private Tenant validateTenant(HttpRequest request) {
+ private TenantName validateTenant(HttpRequest request) {
TenantName tenantName = getTenantNameFromRequest(request);
checkThatTenantExists(tenantRepository, tenantName);
- return tenantRepository.getTenant(tenantName);
+ return tenantName;
}
public static TenantName getTenantNameFromRequest(HttpRequest request) {
diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java
index 1fea966503b..d962218b63a 100644
--- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java
+++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/PrepareParams.java
@@ -44,6 +44,7 @@ public final class PrepareParams {
static final String APPLICATION_HOST_ROLE = "applicationHostRole";
static final String APPLICATION_CONTAINER_ROLE = "applicationContainerRole";
static final String QUOTA_PARAM_NAME = "quota";
+ static final String FORCE_PARAM_NAME = "force";
private final ApplicationId applicationId;
private final TimeoutBudget timeoutBudget;
@@ -51,6 +52,7 @@ public final class PrepareParams {
private final boolean dryRun;
private final boolean verbose;
private final boolean isBootstrap;
+ private final boolean force;
private final Optional<Version> vespaVersion;
private final List<ContainerEndpoint> containerEndpoints;
private final Optional<String> tlsSecretsKeyName;
@@ -65,7 +67,7 @@ public final class PrepareParams {
List<ContainerEndpoint> containerEndpoints, Optional<String> tlsSecretsKeyName,
Optional<EndpointCertificateMetadata> endpointCertificateMetadata,
Optional<DockerImage> dockerImageRepository, Optional<AthenzDomain> athenzDomain,
- Optional<ApplicationRoles> applicationRoles, Optional<Quota> quota) {
+ Optional<ApplicationRoles> applicationRoles, Optional<Quota> quota, boolean force) {
this.timeoutBudget = timeoutBudget;
this.applicationId = Objects.requireNonNull(applicationId);
this.ignoreValidationErrors = ignoreValidationErrors;
@@ -80,6 +82,7 @@ public final class PrepareParams {
this.athenzDomain = athenzDomain;
this.applicationRoles = applicationRoles;
this.quota = quota;
+ this.force = force;
}
public static class Builder {
@@ -88,6 +91,7 @@ public final class PrepareParams {
private boolean dryRun = false;
private boolean verbose = false;
private boolean isBootstrap = false;
+ private boolean force = false;
private ApplicationId applicationId = null;
private TimeoutBudget timeoutBudget = new TimeoutBudget(Clock.systemUTC(), Duration.ofSeconds(60));
private Optional<Version> vespaVersion = Optional.empty();
@@ -199,11 +203,16 @@ public final class PrepareParams {
return this;
}
+ public Builder force(boolean force) {
+ this.force = force;
+ return this;
+ }
+
public PrepareParams build() {
return new PrepareParams(applicationId, timeoutBudget, ignoreValidationErrors, dryRun,
verbose, isBootstrap, vespaVersion, containerEndpoints, tlsSecretsKeyName,
endpointCertificateMetadata, dockerImageRepository, athenzDomain,
- applicationRoles, quota);
+ applicationRoles, quota, force);
}
}
@@ -221,6 +230,7 @@ public final class PrepareParams {
.athenzDomain(request.getProperty(ATHENZ_DOMAIN))
.applicationRoles(ApplicationRoles.fromString(request.getProperty(APPLICATION_HOST_ROLE), request.getProperty(APPLICATION_CONTAINER_ROLE)))
.quota(request.getProperty(QUOTA_PARAM_NAME))
+ .force(request.getBooleanProperty(FORCE_PARAM_NAME))
.build();
}
@@ -270,6 +280,8 @@ public final class PrepareParams {
public boolean isBootstrap() { return isBootstrap; }
+ public boolean force() { return force; }
+
public TimeoutBudget getTimeoutBudget() {
return timeoutBudget;
}
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
index f879f6c2a2a..4770b0797eb 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java
@@ -704,7 +704,7 @@ public class ApplicationRepositoryTest {
}
private PrepareResult prepareAndActivate(File application) {
- return applicationRepository.deploy(application, prepareParams(), false, Instant.now());
+ return applicationRepository.deploy(application, prepareParams(), Instant.now());
}
private PrepareResult deployApp(File applicationPackage) {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
index e69fe21dd92..d92245bf5c1 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java
@@ -215,7 +215,7 @@ public class DeployTester {
paramsBuilder.applicationId(applicationId)
.timeoutBudget(new TimeoutBudget(clock, Duration.ofSeconds(60)));
- return applicationRepository.deploy(new File(applicationPath), paramsBuilder.build(), false, now);
+ return applicationRepository.deploy(new File(applicationPath), paramsBuilder.build(), now);
}
public AllocatedHosts getAllocatedHostsOf(ApplicationId applicationId) {
diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
index 7999f9280c0..78d69b75d59 100644
--- a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
+++ b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java
@@ -67,10 +67,7 @@ class MaintainerTester {
}
void deployApp(File applicationPath, PrepareParams.Builder prepareParams) {
- applicationRepository.deploy(applicationPath,
- prepareParams.ignoreValidationErrors(true).build(),
- false,
- clock.instant());
+ applicationRepository.deploy(applicationPath, prepareParams.ignoreValidationErrors(true).build(), clock.instant());
}
Curator curator() { return curator; }