diff options
author | Jon Marius Venstad <jonmv@users.noreply.github.com> | 2020-09-09 13:19:36 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-09 13:19:36 +0200 |
commit | 95197a41a32a6d28c016c0e7c12b53705283a669 (patch) | |
tree | 0bb55c19d495ef9d77d305575563768ca2e81886 | |
parent | 1fa9e7b77d2779397dc7c57ecca65876c0d73eb4 (diff) | |
parent | 932e9000b4f99971966764f4049e6d8aa2e0f611 (diff) |
Merge pull request #14331 from vespa-engine/hmusum/add-force-param-to-PrepareParams
Add force request property to PrepareParams
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; } |