diff options
author | Harald Musum <musum@oath.com> | 2018-02-05 18:08:40 +0100 |
---|---|---|
committer | Harald Musum <musum@oath.com> | 2018-02-05 18:08:40 +0100 |
commit | a9a026959ec298e0cfe111273329d31b82b95b3a (patch) | |
tree | 5d1330e25cedb141e2a11445edeb25232f7ee7f7 /configserver | |
parent | 9da3356c15e5c4f9f148716a1d773a35435df5ae (diff) |
Add
Diffstat (limited to 'configserver')
-rw-r--r-- | configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java | 96 |
1 files changed, 96 insertions, 0 deletions
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 new file mode 100644 index 00000000000..4d99137e5aa --- /dev/null +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationApiHandler.java @@ -0,0 +1,96 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.config.server.http.v2; + +import com.google.inject.Inject; +import com.yahoo.cloud.config.ConfigserverConfig; +import com.yahoo.config.application.api.DeployLogger; +import com.yahoo.config.provision.TenantName; +import com.yahoo.config.provision.Zone; +import com.yahoo.container.jdisc.HttpRequest; +import com.yahoo.container.jdisc.HttpResponse; +import com.yahoo.slime.Slime; +import com.yahoo.vespa.config.server.ApplicationRepository; +import com.yahoo.vespa.config.server.TimeoutBudget; +import com.yahoo.vespa.config.server.http.SessionHandler; +import com.yahoo.vespa.config.server.http.Utils; +import com.yahoo.vespa.config.server.session.PrepareParams; +import com.yahoo.vespa.config.server.tenant.Tenant; +import com.yahoo.vespa.config.server.tenant.Tenants; + +import java.time.Duration; +import java.time.Instant; + +/** + * * The implementation of the /application/v2 API. + * + * + * @author hmusum + */ +// TODO: only handles 'prepareandactive' for now, merge other handlers into this one +public class ApplicationApiHandler extends SessionHandler { + + public final static String APPLICATION_X_GZIP = "application/x-gzip"; + public final static String APPLICATION_ZIP = "application/zip"; + public final static String contentTypeHeader = "Content-Type"; + private final Tenants tenants; + private final Duration zookeeperBarrierTimeout; + private final Zone zone; + + @Inject + public ApplicationApiHandler(Context ctx, + ApplicationRepository applicationRepository, + Tenants tenants, + ConfigserverConfig configserverConfig, + Zone zone) { + super(ctx, applicationRepository); + this.tenants = tenants; + this.zookeeperBarrierTimeout = Duration.ofSeconds(configserverConfig.zookeeper().barrierTimeout()); + this.zone = zone; + } + + @Override + protected HttpResponse handlePUT(HttpRequest request) { + Tenant tenant = getExistingTenant(request); + TenantName tenantName = tenant.getName(); + long sessionId = getSessionIdV2(request); + PrepareParams prepareParams = PrepareParams.fromHttpRequest(request, tenantName, zookeeperBarrierTimeout); + + PrepareResult result = applicationRepository.prepareAndActivate(tenant, sessionId, prepareParams, + shouldIgnoreLockFailure(request), + shouldIgnoreSessionStaleFailure(request), + Instant.now()); + return new SessionPrepareAndActivateResponse(result, tenantName, request, prepareParams.getApplicationId(), zone); + } + + @Override + protected HttpResponse handlePOST(HttpRequest request) { + Tenant tenant = getExistingTenant(request); + TenantName tenantName = tenant.getName(); + TimeoutBudget timeoutBudget = SessionHandler.getTimeoutBudget(request, zookeeperBarrierTimeout); + PrepareParams prepareParams = PrepareParams.fromHttpRequest(request, tenantName, zookeeperBarrierTimeout); + Slime deployLog = createDeployLog(); + DeployLogger logger = SessionCreateHandler.createLogger(request, deployLog, tenantName); + String name = SessionCreateHandler.getNameProperty(request, logger); + SessionCreateHandler.validateDataAndHeader(request); + + PrepareResult result = + applicationRepository.createSessionAndPrepareAndActivate(tenant, request.getData(), + request.getHeader(contentTypeHeader), + timeoutBudget, name, prepareParams, + shouldIgnoreLockFailure(request), shouldIgnoreSessionStaleFailure(request), + Instant.now()); + return new SessionPrepareAndActivateResponse(result, tenantName, request, prepareParams.getApplicationId(), zone); + } + + @Override + public Duration getTimeout() { + return zookeeperBarrierTimeout.plus(Duration.ofSeconds(10)); + } + + private Tenant getExistingTenant(HttpRequest request) { + TenantName tenantName = Utils.getTenantNameFromSessionRequest(request); + Utils.checkThatTenantExists(tenants, tenantName); + return tenants.getTenant(tenantName); + } + +} |