diff options
author | Harald Musum <musum@yahoo-inc.com> | 2016-12-11 10:11:02 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-12-11 10:11:02 +0100 |
commit | de5aae2629450ebfd5ae2c50b404749b0d5286b1 (patch) | |
tree | 0cae4f96cc0acc3bb130b1eb01a960ef1d0d5c93 | |
parent | f0b529841383c7fc24fbb6ed84ab0c1b57a88a9d (diff) | |
parent | 21ef211263adaa197da80805318d85f3728b114d (diff) |
Merge pull request #1289 from yahoo/hmusum/http-handlers-refactoring-part-5
Move tenant checking out of http layer
13 files changed, 92 insertions, 91 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 91b0fdc207b..f46ed8b0aef 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 @@ -5,6 +5,7 @@ import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.HostFilter; import com.yahoo.config.provision.Provisioner; +import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; @@ -17,6 +18,7 @@ import com.yahoo.vespa.config.server.application.TenantApplications; import com.yahoo.vespa.config.server.deploy.Deployment; import com.yahoo.vespa.config.server.http.ContentHandler; import com.yahoo.vespa.config.server.http.NotFoundException; +import com.yahoo.vespa.config.server.http.Utils; import com.yahoo.vespa.config.server.http.v2.ApplicationContentRequest; import com.yahoo.vespa.config.server.provision.HostProvisionerProvider; import com.yahoo.vespa.config.server.session.LocalSession; @@ -33,6 +35,7 @@ import java.io.IOException; import java.net.URI; import java.time.Clock; import java.time.Duration; +import java.util.List; import java.util.Optional; import java.util.logging.Logger; @@ -195,4 +198,20 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye hostProvisioner.get().restart(applicationId, hostFilter); } + public Tenant verifyTenantAndApplication(ApplicationId applicationId) { + final TenantName tenantName = applicationId.tenant(); + Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = tenants.getTenant(tenantName); + List<ApplicationId> applicationIds = listApplicationIds(tenant); + if (!applicationIds.contains(applicationId)) { + throw new IllegalArgumentException("No such application id: " + applicationId); + } + return tenant; + } + + private List<ApplicationId> listApplicationIds(Tenant tenant) { + TenantApplications applicationRepo = tenant.getApplicationRepo(); + return applicationRepo.listApplications(); + } + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/Utils.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/Utils.java index b21dcf18a0e..28730a08e56 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/Utils.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/Utils.java @@ -43,30 +43,22 @@ public class Utils { return request.getUri().getScheme() + "://" + request.getHost() + ":" + request.getPort() + pathPrefix; } - public static Tenant checkThatTenantExists(Tenants tenants, TenantName tenant) { - if (!tenants.tenantsCopy().containsKey(tenant)) { - throw new NotFoundException("Tenant '" + tenant + "' was not found."); - } - return tenants.tenantsCopy().get(tenant); - } - - public static void checkThatTenantDoesNotExist(Tenants tenants, TenantName tenant) { - if (tenants.tenantsCopy().containsKey(tenant)) { - throw new BadRequestException("There already exists a tenant '" + tenant + "'"); - } + public static void checkThatTenantExists(Tenants tenants, TenantName tenantName) { + if ( ! tenants.checkThatTenantExists(tenantName)) + throw new NotFoundException("Tenant '" + tenantName + "' was not found."); } - public static TenantName getTenantFromRequest(HttpRequest request) { + public static TenantName getTenantNameFromRequest(HttpRequest request) { BindingMatch<?> bm = getBindingMatch(request, "http://*/application/v2/tenant/*"); return TenantName.from(bm.group(2)); } - public static TenantName getTenantFromSessionRequest(HttpRequest request) { + public static TenantName getTenantNameFromSessionRequest(HttpRequest request) { BindingMatch<?> bm = getBindingMatch(request, "http://*/application/v2/tenant/*/session*"); return TenantName.from(bm.group(2)); } - public static TenantName getTenantFromApplicationsRequest(HttpRequest request) { + public static TenantName getTenantNameFromApplicationsRequest(HttpRequest request) { BindingMatch<?> bm = getBindingMatch(request, "http://*/application/v2/tenant/*/application*"); return TenantName.from(bm.group(2)); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java index 18a3b8fb207..21e97cf0fa8 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandler.java @@ -13,22 +13,18 @@ import com.yahoo.jdisc.Response; import com.yahoo.jdisc.application.BindingMatch; import com.yahoo.vespa.config.server.http.HttpConfigResponse; import com.yahoo.vespa.config.server.tenant.Tenant; -import com.yahoo.vespa.config.server.tenant.Tenants; import com.yahoo.vespa.config.server.TimeoutBudget; -import com.yahoo.vespa.config.server.application.TenantApplications; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.HttpHandler; import com.yahoo.vespa.config.server.http.JSONResponse; import com.yahoo.vespa.config.server.http.NotFoundException; -import com.yahoo.vespa.config.server.http.Utils; import java.io.IOException; import java.io.OutputStream; import java.nio.charset.StandardCharsets; import java.time.Clock; import java.time.Duration; -import java.util.List; import java.util.concurrent.Executor; /** @@ -41,17 +37,15 @@ import java.util.concurrent.Executor; public class ApplicationHandler extends HttpHandler { private static final String REQUEST_PROPERTY_TIMEOUT = "timeout"; - private final Tenants tenants; private final Zone zone; private final ApplicationRepository applicationRepository; - public ApplicationHandler(Executor executor, AccessLog accessLog, - Tenants tenants, + public ApplicationHandler(Executor executor, + AccessLog accessLog, Zone zone, ApplicationRepository applicationRepository) { super(executor, accessLog); - this.tenants = tenants; this.zone = zone; this.applicationRepository = applicationRepository; } @@ -87,7 +81,7 @@ public class ApplicationHandler extends HttpHandler { } } if (isServiceConvergeListRequest(request)) { - return applicationRepository.listConfigConvergence(tenant, applicationId, request.getUri()); + return applicationRepository.listConfigConvergence(tenant, applicationId, request.getUri()); } return new GetApplicationResponse(Response.Status.OK, applicationRepository.getApplicationGeneration(tenant, applicationId)); } @@ -137,12 +131,11 @@ public class ApplicationHandler extends HttpHandler { } private Tenant verifyTenantAndApplication(ApplicationId applicationId) { - Tenant tenant = Utils.checkThatTenantExists(tenants, applicationId.tenant()); - List<ApplicationId> applicationIds = listApplicationIds(tenant); - if ( ! applicationIds.contains(applicationId)) { - throw new NotFoundException("No such application id: " + applicationId); + try { + return applicationRepository.verifyTenantAndApplication(applicationId); + } catch (IllegalArgumentException e) { + throw new NotFoundException(e.getMessage()); } - return tenant; } private Duration durationFromRequestTimeout(HttpRequest request) { @@ -153,12 +146,6 @@ public class ApplicationHandler extends HttpHandler { return Duration.ofSeconds(timeoutInSeconds); } - - private List<ApplicationId> listApplicationIds(Tenant tenant) { - TenantApplications applicationRepo = tenant.getApplicationRepo(); - return applicationRepo.listApplications(); - } - // Note: Update src/main/resources/configserver-app/services.xml if you do any changes to the bindings private static BindingMatch<?> getBindingMatch(HttpRequest request) { return HttpConfigRequests.getBindingMatch(request, @@ -187,7 +174,6 @@ public class ApplicationHandler extends HttpHandler { request.getUri().getPath().contains("/serviceconverge/"); } - private static boolean isContentRequest(HttpRequest request) { return getBindingMatch(request).groupCount() > 7; } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandler.java index 8b7c138642a..aaf10db3991 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListApplicationsHandler.java @@ -37,7 +37,7 @@ public class ListApplicationsHandler extends HttpHandler { @Override public HttpResponse handleGET(HttpRequest request) { - TenantName tenantName = Utils.getTenantFromApplicationsRequest(request); + TenantName tenantName = Utils.getTenantNameFromApplicationsRequest(request); final String urlBase = Utils.getUrlBase(request, "/application/v2/tenant/" + tenantName + "/application/"); List<ApplicationId> applicationIds = listApplicationIds(tenantName); @@ -51,7 +51,8 @@ public class ListApplicationsHandler extends HttpHandler { } private List<ApplicationId> listApplicationIds(TenantName tenantName) { - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); + Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = tenants.getTenant(tenantName); TenantApplications applicationRepo = tenant.getApplicationRepo(); return applicationRepo.listApplications(); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandler.java index a3793237fc6..135ddef4e6a 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandler.java @@ -9,7 +9,6 @@ import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.container.logging.AccessLog; -import com.yahoo.log.LogLevel; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.config.server.tenant.Tenants; @@ -44,9 +43,9 @@ public class SessionActiveHandler extends SessionActiveHandlerBase { @Override protected HttpResponse handlePUT(HttpRequest request) { TimeoutBudget timeoutBudget = getTimeoutBudget(request, SessionHandler.DEFAULT_ACTIVATE_TIMEOUT); - TenantName tenantName = Utils.getTenantFromSessionRequest(request); - log.log(LogLevel.DEBUG, "Found tenant '" + tenantName + "' in request"); - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); + final TenantName tenantName = Utils.getTenantNameFromSessionRequest(request); + Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = tenants.getTenant(tenantName); LocalSession localSession = applicationRepository.getLocalSession(tenant, getSessionIdV2(request)); activate(request, tenant.getLocalSessionRepo(), tenant.getActivateLock(), timeoutBudget, localSession); return new SessionActiveResponse(localSession.getMetaData().getSlime(), tenantName, request, localSession, zone); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandler.java index 27ffbfd2d71..7b55fdea11a 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandler.java @@ -6,16 +6,13 @@ import com.yahoo.config.provision.TenantName; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.container.logging.AccessLog; -import com.yahoo.log.LogLevel; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.config.server.tenant.Tenants; import com.yahoo.vespa.config.server.http.ContentHandler; -import com.yahoo.vespa.config.server.http.NotFoundException; import com.yahoo.vespa.config.server.http.SessionHandler; import com.yahoo.vespa.config.server.http.Utils; import com.yahoo.vespa.config.server.session.LocalSession; -import com.yahoo.vespa.config.server.session.LocalSessionRepo; import java.util.concurrent.Executor; @@ -41,28 +38,27 @@ public class SessionContentHandler extends SessionHandler { @Override public HttpResponse handleGET(HttpRequest request) { - TenantName tenantName = Utils.getTenantFromSessionRequest(request); - log.log(LogLevel.DEBUG, "Found tenant '" + tenantName + "' in request"); - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); - LocalSession session = applicationRepository.getLocalSession(tenant, getSessionIdV2(request)); + LocalSession session = validateRequestAndGetSession(request); return contentHandler.get(SessionContentRequestV2.create(request, session)); } @Override public HttpResponse handlePUT(HttpRequest request) { - TenantName tenantName = Utils.getTenantFromSessionRequest(request); - log.log(LogLevel.DEBUG, "Found tenant '" + tenantName + "' in request"); - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); - LocalSession session = applicationRepository.getLocalSession(tenant, getSessionIdV2(request)); + LocalSession session = validateRequestAndGetSession(request); return contentHandler.put(SessionContentRequestV2.create(request, session)); } @Override public HttpResponse handleDELETE(HttpRequest request) { - TenantName tenantName = Utils.getTenantFromSessionRequest(request); - log.log(LogLevel.DEBUG, "Found tenant '" + tenantName + "' in request"); - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); - LocalSession session = applicationRepository.getLocalSession(tenant, getSessionIdV2(request)); + LocalSession session = validateRequestAndGetSession(request); return contentHandler.delete(SessionContentRequestV2.create(request, session)); } + + private LocalSession validateRequestAndGetSession(HttpRequest request) { + final TenantName tenantName = Utils.getTenantNameFromSessionRequest(request); + Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = tenants.getTenant(tenantName); + return applicationRepository.getLocalSession(tenant, getSessionIdV2(request)); + } + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentRequestV2.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentRequestV2.java index 1bdd37dd685..30af00dd4d1 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentRequestV2.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionContentRequestV2.java @@ -27,7 +27,7 @@ class SessionContentRequestV2 extends ContentRequest { } static ContentRequest create(HttpRequest request, LocalSession session) { - return new SessionContentRequestV2(request, session, Utils.getTenantFromSessionRequest(request)); + return new SessionContentRequestV2(request, session, Utils.getTenantNameFromSessionRequest(request)); } @Override diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandler.java index b7bbe171f9e..e33cf6dcda0 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandler.java @@ -9,7 +9,6 @@ import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.container.logging.AccessLog; import com.yahoo.jdisc.application.UriPattern; -import com.yahoo.log.LogLevel; import com.yahoo.slime.Slime; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.tenant.Tenant; @@ -25,7 +24,6 @@ import com.yahoo.vespa.config.server.session.LocalSession; import java.net.URI; import java.time.Duration; import java.util.concurrent.Executor; -import java.util.logging.Logger; /** * A handler that is able to create a session from an application package, @@ -36,7 +34,6 @@ import java.util.logging.Logger; * @since 5.1 */ public class SessionCreateHandler extends SessionHandler { - private static final Logger log = Logger.getLogger(SessionCreateHandler.class.getName()); private final Tenants tenants; private static final String fromPattern = "http://*/application/v2/tenant/*/application/*/environment/*/region/*/instance/*"; private final ConfigserverConfig configserverConfig; @@ -55,9 +52,9 @@ public class SessionCreateHandler extends SessionHandler { @Override protected HttpResponse handlePOST(HttpRequest request) { Slime deployLog = createDeployLog(); - TenantName tenantName = Utils.getTenantFromSessionRequest(request); - log.log(LogLevel.DEBUG, "Found tenant '" + tenantName + "' in request"); - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); + final TenantName tenantName = Utils.getTenantNameFromSessionRequest(request); + Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = tenants.getTenant(tenantName); final SessionCreate sessionCreate = new SessionCreate(tenant.getSessionFactory(), tenant.getLocalSessionRepo(), new SessionCreateResponseV2(tenant, deployLog, deployLog.get())); TimeoutBudget timeoutBudget = SessionHandler.getTimeoutBudget(request, Duration.ofSeconds(configserverConfig.zookeeper().barrierTimeout())); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java index 2da3b07aeb2..9ae2966c425 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandler.java @@ -56,10 +56,10 @@ public class SessionPrepareHandler extends SessionHandler { @Override protected HttpResponse handlePUT(HttpRequest request) { - TenantName tenantName = Utils.getTenantFromSessionRequest(request); - Tenant tenantContext = Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = getExistingTenant(request); + TenantName tenantName = tenant.getName(); long sessionId = getSessionIdV2(request); - LocalSession session = applicationRepository.getLocalSession(tenantContext, getSessionIdV2(request)); + LocalSession session = applicationRepository.getLocalSession(tenant, getSessionIdV2(request)); if (Session.Status.ACTIVATE.equals(session.getStatus())) { throw new IllegalArgumentException("Session is active: " + sessionId); } @@ -72,11 +72,11 @@ public class SessionPrepareHandler extends SessionHandler { DeployLogger logger = createLogger(rawDeployLog, verbose, appId); ConfigChangeActions actions = session.prepare(logger, prepParams, - getCurrentActiveApplicationSet(tenantContext, appId), - tenantContext.getPath()); + getCurrentActiveApplicationSet(tenant, appId), + tenant.getPath()); logConfigChangeActions(actions, logger); log.log(LogLevel.INFO, Tenants.logPre(appId) + "Session " + sessionId + " prepared successfully. "); - return new SessionPrepareResponse(rawDeployLog, tenantContext, request, session, actions); + return new SessionPrepareResponse(rawDeployLog, tenant, request, session, actions); } private static void logConfigChangeActions(ConfigChangeActions actions, DeployLogger logger) { @@ -94,9 +94,7 @@ public class SessionPrepareHandler extends SessionHandler { @Override protected HttpResponse handleGET(HttpRequest request) { - TenantName tenantName = Utils.getTenantFromSessionRequest(request); - log.log(LogLevel.DEBUG, "Found tenant '" + tenantName + "' in request"); - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = getExistingTenant(request); long sessionId = getSessionIdV2(request); RemoteSession session = applicationRepository.getRemoteSession(tenant, getSessionIdV2(request)); if (Session.Status.ACTIVATE.equals(session.getStatus())) @@ -120,4 +118,10 @@ public class SessionPrepareHandler extends SessionHandler { } return currentActiveApplicationSet; } + + private Tenant getExistingTenant(HttpRequest request) { + TenantName tenantName = Utils.getTenantNameFromSessionRequest(request); + Utils.checkThatTenantExists(tenants, tenantName); + return tenants.getTenant(tenantName); + } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantHandler.java index e409181f4c6..04cb9a038c5 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantHandler.java @@ -35,13 +35,13 @@ public class TenantHandler extends HttpHandler { @Override protected HttpResponse handlePUT(HttpRequest request) { - TenantName tenant = getAndValidateTenantFromRequest(request); + TenantName tenantName = getAndValidateTenantFromRequest(request); try { - tenants.writeTenantPath(tenant); + tenants.writeTenantPath(tenantName); } catch (Exception e) { throw new InternalServerException(Exceptions.toMessageString(e)); } - return new TenantCreateResponse(tenant); + return new TenantCreateResponse(tenantName); } /** @@ -51,10 +51,10 @@ public class TenantHandler extends HttpHandler { * @return tenant name */ private TenantName getAndValidateTenantFromRequest(HttpRequest request) { - TenantName tenant = Utils.getTenantFromRequest(request); - Utils.checkThatTenantDoesNotExist(tenants, tenant); - validateTenantName(tenant); - return tenant; + final TenantName tenantName = Utils.getTenantNameFromRequest(request); + checkThatTenantDoesNotExist(tenantName); + validateTenantName(tenantName); + return tenantName; } private void validateTenantName(TenantName tenant) { @@ -65,14 +65,16 @@ public class TenantHandler extends HttpHandler { @Override protected HttpResponse handleGET(HttpRequest request) { - TenantName tenant = getExistingTenant(request); - return new TenantGetResponse(tenant); + final TenantName tenantName = Utils.getTenantNameFromRequest(request); + Utils.checkThatTenantExists(tenants, tenantName); + return new TenantGetResponse(tenantName); } @Override protected HttpResponse handleDELETE(HttpRequest request) { - TenantName tenantName = getExistingTenant(request); - Tenant tenant = Utils.checkThatTenantExists(tenants, tenantName); + final TenantName tenantName = Utils.getTenantNameFromRequest(request); + Utils.checkThatTenantExists(tenants, tenantName); + Tenant tenant = tenants.getTenant(tenantName); TenantApplications applicationRepo = tenant.getApplicationRepo(); final List<ApplicationId> activeApplications = applicationRepo.listApplications(); if (activeApplications.isEmpty()) { @@ -88,9 +90,9 @@ public class TenantHandler extends HttpHandler { return new TenantDeleteResponse(tenantName); } - private TenantName getExistingTenant(HttpRequest request) { - TenantName tenant = Utils.getTenantFromRequest(request); - Utils.checkThatTenantExists(tenants, tenant); - return tenant; + private void checkThatTenantDoesNotExist(TenantName tenantName) { + if (tenants.checkThatTenantExists(tenantName)) + throw new BadRequestException("There already exists a tenant '" + tenantName + "'"); } + } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java index 5402b14a337..42fce5e4d3b 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/tenant/Tenants.java @@ -19,7 +19,6 @@ import org.apache.curator.framework.state.ConnectionState; import org.apache.curator.framework.state.ConnectionStateListener; import org.apache.zookeeper.KeeperException; -import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -53,6 +52,7 @@ import java.util.logging.Logger; * @author lulf * @since 5.1.26 */ +//TODO Rename to TenantRepository public class Tenants implements ConnectionStateListener, PathChildrenCacheListener { private static final Logger log = Logger.getLogger(Tenants.class.getName()); @@ -345,6 +345,14 @@ public class Tenants implements ConnectionStateListener, PathChildrenCacheListen } } + public boolean checkThatTenantExists(TenantName tenant) { + return tenantsCopy().containsKey(tenant); + } + + public Tenant getTenant(TenantName tenantName) { + return tenantsCopy().get(tenantName); + } + private static int redeployProgress(Tenant tenant, int applicationsRedeployed, int totalNumberOfApplications) { int size = tenant.getApplicationRepo().listApplications().size(); if (size > 0) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java index c629765f8fe..81ade07fd5a 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java @@ -57,7 +57,6 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase { testTenantBuilder.tenants().get(tenant2).getApplicationRepo().createPutApplicationTransaction(idTenant2, 3l).commit(); handler = new ApplicationHandler(command -> command.run(), AccessLog.voidAccessLog(), - testTenantBuilder.createTenants(), Zone.defaultZone(), new ApplicationRepository(testTenantBuilder.createTenants(), HostProvisionerProvider.empty(), diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java index 7a73e975e23..c4090c96f04 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java @@ -96,7 +96,6 @@ public class ApplicationHandlerTest { return new ApplicationHandler( Runnable::run, AccessLog.voidAccessLog(), - tenants, Zone.defaultZone(), new ApplicationRepository(tenants, HostProvisionerProvider.withProvisioner(provisioner), @@ -109,7 +108,6 @@ public class ApplicationHandlerTest { return new ApplicationHandler( Runnable::run, AccessLog.voidAccessLog(), - tenants, Zone.defaultZone(), new ApplicationRepository(tenants, HostProvisionerProvider.withProvisioner(provisioner), |