diff options
author | Harald Musum <musum@verizonmedia.com> | 2020-09-24 21:35:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-24 21:35:56 +0200 |
commit | 89c10e4c4f314b3dcf7231f861aebd31e353cfcd (patch) | |
tree | 329ab605bf9172192db9adb84ef2ad7059bba853 | |
parent | 1b52adf3d915d8bb6ffbac2b6f5fbd58bbfd18ba (diff) | |
parent | 8309eba80f9e2869e2d095588b0f0e2c1e930f82 (diff) |
Merge pull request #14541 from vespa-engine/freva/log-restarts
Log internal restarts
23 files changed, 116 insertions, 242 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 fb981eb1c67..bd704611bcb 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 @@ -24,7 +24,6 @@ import com.yahoo.docproc.jdisc.metric.NullMetric; import com.yahoo.io.IOUtils; import com.yahoo.jdisc.Metric; import com.yahoo.path.Path; -import com.yahoo.slime.Slime; import com.yahoo.transaction.NestedTransaction; import com.yahoo.transaction.Transaction; import com.yahoo.vespa.config.server.application.Application; @@ -285,15 +284,14 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye LocalSession session = getLocalSession(tenant, sessionId); ApplicationId applicationId = prepareParams.getApplicationId(); Optional<ApplicationSet> currentActiveApplicationSet = getCurrentActiveApplicationSet(tenant, applicationId); - Slime deployLog = createDeployLog(); - DeployLogger logger = new DeployHandlerLogger(deployLog.get().setArray("log"), prepareParams.isVerbose(), applicationId); + DeployHandlerLogger logger = DeployHandlerLogger.forApplication(applicationId, prepareParams.isVerbose()); try (ActionTimer timer = timerFor(applicationId, "deployment.prepareMillis")) { SessionRepository sessionRepository = tenant.getSessionRepository(); ConfigChangeActions actions = sessionRepository.prepareLocalSession(session, logger, prepareParams, currentActiveApplicationSet, tenant.getPath(), now); logConfigChangeActions(actions, logger); log.log(Level.INFO, TenantRepository.logPre(applicationId) + "Session " + sessionId + " prepared successfully. "); - return new PrepareResult(sessionId, actions, deployLog); + return new PrepareResult(sessionId, actions, logger); } } @@ -329,8 +327,11 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye .collect(Collectors.toUnmodifiableSet()); hostProvisioner.get().restart(applicationId, HostFilter.from(hostnames, Set.of(), Set.of(), Set.of())); + result.deployLogger().log(Level.INFO, String.format("Scheduled service restart of %d nodes: %s", + hostnames.size(), hostnames.stream().sorted().collect(Collectors.joining(", ")))); + ConfigChangeActions newActions = new ConfigChangeActions(new RestartActions(), result.configChangeActions().getRefeedActions()); - return new PrepareResult(result.sessionId(), newActions, result.deployLog()); + return new PrepareResult(result.sessionId(), newActions, result.deployLogger()); } return result; @@ -1072,12 +1073,6 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye .getPort(); } - public Slime createDeployLog() { - Slime deployLog = new Slime(); - deployLog.setObject(); - return deployLog; - } - public Zone zone() { return new Zone(SystemName.from(configserverConfig.system()), Environment.from(configserverConfig.environment()), diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java index c33c5ff9f57..b6cd22d78b4 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLogger.java @@ -4,6 +4,7 @@ package com.yahoo.vespa.config.server.deploy; import com.yahoo.config.application.api.DeployLogger; import com.yahoo.config.provision.ApplicationId; +import com.yahoo.config.provision.TenantName; import com.yahoo.log.LogLevel; import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; @@ -22,25 +23,24 @@ public class DeployHandlerLogger implements DeployLogger { private static final Logger log = Logger.getLogger(DeployHandlerLogger.class.getName()); - private final Cursor logroot; + private final String prefix; private final boolean verbose; - private final ApplicationId app; + private final Slime slime; + private final Cursor logroot; - public DeployHandlerLogger(Cursor root, boolean verbose, ApplicationId app) { - logroot = root; + private DeployHandlerLogger(String prefix, boolean verbose) { + this.prefix = prefix; this.verbose = verbose; - this.app = app; + this.slime = new Slime(); + this.logroot = slime.setObject().setArray("log"); } @Override public void log(Level level, String message) { - if ((level == Level.FINE || - level == LogLevel.DEBUG || - level == LogLevel.SPAM) && - !verbose) { + if ((level == Level.FINE || level == LogLevel.DEBUG || level == LogLevel.SPAM) && !verbose) return; - } - String fullMsg = TenantRepository.logPre(app) + message; + + String fullMsg = prefix + message; Cursor entry = logroot.addObject(); entry.setLong("time", System.currentTimeMillis()); entry.setString("level", level.getName()); @@ -49,4 +49,15 @@ public class DeployHandlerLogger implements DeployLogger { log.log(Level.FINE, fullMsg); } + public Slime slime() { + return slime; + } + + public static DeployHandlerLogger forApplication(ApplicationId app, boolean verbose) { + return new DeployHandlerLogger(TenantRepository.logPre(app), verbose); + } + + public static DeployHandlerLogger forTenant(TenantName tenantName, boolean verbose) { + return new DeployHandlerLogger(TenantRepository.logPre(tenantName), verbose); + } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/ContentHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/ContentHandler.java index 7112c7d3e23..bbbc8764122 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/ContentHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/ContentHandler.java @@ -3,6 +3,7 @@ package com.yahoo.vespa.config.server.http; import com.yahoo.config.application.api.ApplicationFile; import com.yahoo.container.jdisc.HttpResponse; +import com.yahoo.restapi.SlimeJsonResponse; import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; @@ -102,6 +103,6 @@ public class ContentHandler { Slime slime = new Slime(); Cursor root = slime.setObject(); root.setString("prepared", request.getUrlBase("/prepared")); - return new SessionResponse(slime, root); + return new SlimeJsonResponse(slime); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentListResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentListResponse.java index f761f5f6b6e..57095772b26 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentListResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentListResponse.java @@ -2,12 +2,9 @@ package com.yahoo.vespa.config.server.http; import com.yahoo.config.application.api.ApplicationFile; +import com.yahoo.restapi.SlimeJsonResponse; import com.yahoo.slime.Cursor; -import com.yahoo.slime.JsonFormat; -import com.yahoo.slime.Slime; -import java.io.IOException; -import java.io.OutputStream; import java.util.List; /** @@ -16,19 +13,13 @@ import java.util.List; * @author Ulf Lilleengen * @since 5.1 */ -class SessionContentListResponse extends SessionResponse { - private final Slime slime = new Slime(); +class SessionContentListResponse extends SlimeJsonResponse { public SessionContentListResponse(String urlBase, List<ApplicationFile> files) { - super(); Cursor array = slime.setArray(); for (ApplicationFile file : files) { array.addString(urlBase + file.getPath() + (file.isDirectory() ? "/" : "")); } } - @Override - public void render(OutputStream outputStream) throws IOException { - new JsonFormat(true).encode(outputStream, slime); - } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusListResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusListResponse.java index 075b4bc329b..08cda869111 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusListResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusListResponse.java @@ -3,12 +3,10 @@ package com.yahoo.vespa.config.server.http; import com.yahoo.config.application.api.ApplicationFile; import java.util.logging.Level; + +import com.yahoo.restapi.SlimeJsonResponse; import com.yahoo.slime.Cursor; -import com.yahoo.slime.JsonFormat; -import com.yahoo.slime.Slime; -import java.io.IOException; -import java.io.OutputStream; import java.util.*; /** @@ -16,14 +14,11 @@ import java.util.*; * * @author hmusum */ -class SessionContentStatusListResponse extends SessionResponse { +class SessionContentStatusListResponse extends SlimeJsonResponse { private static final java.util.logging.Logger log = java.util.logging.Logger.getLogger("SessionContentStatusListResponse"); - private final Slime slime = new Slime(); - public SessionContentStatusListResponse(String urlBase, List<ApplicationFile> files) { - super(); Cursor array = slime.setArray(); for (ApplicationFile f : files) { Cursor element = array.addObject(); @@ -34,9 +29,4 @@ class SessionContentStatusListResponse extends SessionResponse { } } - @Override - public void render(OutputStream outputStream) throws IOException { - new JsonFormat(true).encode(outputStream, slime); - } - } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusResponse.java index bd182093e99..e6909e32985 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionContentStatusResponse.java @@ -1,28 +1,19 @@ // Copyright 2017 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; -import com.fasterxml.jackson.databind.ObjectMapper; import com.yahoo.config.application.api.ApplicationFile; +import com.yahoo.restapi.SlimeJsonResponse; +import com.yahoo.slime.Cursor; -import java.io.*; /** * Represents a response for a request to show the status and md5sum of a file in the application package. * * @author hmusum */ -public class SessionContentStatusResponse extends SessionResponse { - - private final ApplicationFile file; - private final String urlBase; - private final ApplicationFile.MetaData metaData; - private final ObjectMapper mapper = new ObjectMapper(); +public class SessionContentStatusResponse extends SlimeJsonResponse { public SessionContentStatusResponse(ApplicationFile file, String urlBase) { - super(); - this.file = file; - this.urlBase = urlBase; - ApplicationFile.MetaData metaData; if (file == null) { metaData = new ApplicationFile.MetaData(ApplicationFile.ContentStatusDeleted, ""); @@ -32,24 +23,11 @@ public class SessionContentStatusResponse extends SessionResponse { if (metaData == null) { throw new IllegalArgumentException("Could not find status for '" + file.getPath() + "'"); } - this.metaData = metaData; - } - @Override - public void render(OutputStream outputStream) throws IOException { - mapper.writeValue(outputStream, new ResponseData(metaData.status, metaData.md5, urlBase + file.getPath())); - } - - private static class ResponseData { - public final String status; - public final String md5; - public final String name; - - private ResponseData(String status, String md5, String name) { - this.status = status; - this.md5 = md5; - this.name = name; - } + Cursor element = slime.setObject(); + element.setString("status", metaData.getStatus()); + element.setString("md5", metaData.getMd5()); + element.setString("name", urlBase + file.getPath()); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java index 59d12e037e9..fcac023eec3 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionHandler.java @@ -1,12 +1,9 @@ // Copyright 2017 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; -import com.yahoo.config.provision.ApplicationId; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.jdisc.application.BindingMatch; -import com.yahoo.slime.Slime; import com.yahoo.vespa.config.server.ApplicationRepository; -import com.yahoo.vespa.config.server.deploy.DeployHandlerLogger; import com.yahoo.vespa.config.server.TimeoutBudget; import java.time.Clock; @@ -67,14 +64,6 @@ public class SessionHandler extends HttpHandler { return new TimeoutBudget(Clock.systemUTC(), getRequestTimeout(request, defaultTimeout)); } - public static DeployHandlerLogger createLogger(Slime deployLog, HttpRequest request, ApplicationId app) { - return createLogger(deployLog, request.getBooleanProperty("verbose"), app); - } - - public static DeployHandlerLogger createLogger(Slime deployLog, boolean verbose, ApplicationId app) { - return new DeployHandlerLogger(deployLog.get().setArray("log"), verbose, app); - } - /** * True if this request should ignore activation failure because the session was made from an active session that is not active now * @param request a {@link com.yahoo.container.jdisc.HttpRequest} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionResponse.java deleted file mode 100644 index ad658e3848a..00000000000 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/SessionResponse.java +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright 2017 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; - -import com.yahoo.container.jdisc.HttpResponse; -import com.yahoo.slime.Cursor; -import com.yahoo.slime.JsonFormat; -import com.yahoo.slime.Slime; - -import java.io.IOException; -import java.io.OutputStream; - -import static com.yahoo.jdisc.http.HttpResponse.Status.OK; - -/** - * Superclass for responses from session HTTP handlers. Implements the - * render method. - * - * @author hmusum - * @since 5.1.14 - */ -public class SessionResponse extends HttpResponse { - private final Slime slime; - protected final Cursor root; - - public SessionResponse() { - super(OK); - slime = new Slime(); - root = slime.setObject(); - } - - public SessionResponse(Slime slime, Cursor root) { - super(OK); - this.slime = slime; - this.root = root; - } - - @Override - public void render(OutputStream outputStream) throws IOException { - new JsonFormat(true).encode(outputStream, slime); - } - - @Override - public String getContentType() { - return HttpConfigResponse.JSON_CONTENT_TYPE; - } -} diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListTenantsResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListTenantsResponse.java index 95a71881b47..3789939429c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListTenantsResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/ListTenantsResponse.java @@ -3,26 +3,19 @@ package com.yahoo.vespa.config.server.http.v2; import com.google.common.collect.ImmutableSet; import com.yahoo.config.provision.TenantName; +import com.yahoo.restapi.SlimeJsonResponse; import com.yahoo.slime.Cursor; -import com.yahoo.vespa.config.server.http.HttpConfigResponse; -import com.yahoo.vespa.config.server.http.SessionResponse; /** * Tenant list response * * @author vegardh */ -public class ListTenantsResponse extends SessionResponse { +public class ListTenantsResponse extends SlimeJsonResponse { ListTenantsResponse(ImmutableSet<TenantName> tenants) { - super(); - Cursor tenantArray = this.root.setArray("tenants"); + Cursor tenantArray = slime.setObject().setArray("tenants"); tenants.forEach(tenantName -> tenantArray.addString(tenantName.value())); } - @Override - public String getContentType() { - return HttpConfigResponse.JSON_CONTENT_TYPE; - } - } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/PrepareResult.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/PrepareResult.java index bb2b57ba45c..24bdfd81f1c 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/PrepareResult.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/PrepareResult.java @@ -1,8 +1,8 @@ // 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.yahoo.slime.Slime; import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; +import com.yahoo.vespa.config.server.deploy.DeployHandlerLogger; /** * Encapsulates the result from preparing an application @@ -13,12 +13,12 @@ public class PrepareResult { private final long sessionId; private final ConfigChangeActions configChangeActions; - private final Slime deployLog; + private final DeployHandlerLogger logger; - public PrepareResult(long sessionId, ConfigChangeActions configChangeActions, Slime deployLog) { + public PrepareResult(long sessionId, ConfigChangeActions configChangeActions, DeployHandlerLogger logger) { this.sessionId = sessionId; this.configChangeActions = configChangeActions; - this.deployLog = deployLog; + this.logger = logger; } public long sessionId() { @@ -29,8 +29,8 @@ public class PrepareResult { return configChangeActions; } - public Slime deployLog() { - return deployLog; + public DeployHandlerLogger deployLogger() { + return logger; } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveResponse.java index 334dbe88614..9c0fbdf2613 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionActiveResponse.java @@ -4,16 +4,19 @@ package com.yahoo.vespa.config.server.http.v2; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.HttpRequest; +import com.yahoo.restapi.SlimeJsonResponse; +import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.vespa.config.server.http.SessionResponse; -public class SessionActiveResponse extends SessionResponse { +public class SessionActiveResponse extends SlimeJsonResponse { public SessionActiveResponse(Slime metaData, HttpRequest request, ApplicationId applicationId, long sessionId, Zone zone) { - super(metaData, metaData.get()); + super(metaData); TenantName tenantName = applicationId.tenant(); String message = "Session " + sessionId + " for tenant '" + tenantName.value() + "' activated."; + Cursor root = metaData.get(); + root.setString("tenant", tenantName.value()); root.setString("message", message); root.setString("url", "http://" + request.getHost() + ":" + request.getPort() + 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 5aee711b379..b0468f5e608 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 @@ -3,7 +3,6 @@ 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.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.InstanceName; @@ -11,7 +10,6 @@ import com.yahoo.config.provision.TenantName; import com.yahoo.container.jdisc.HttpRequest; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.jdisc.application.UriPattern; -import com.yahoo.slime.Slime; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.deploy.DeployHandlerLogger; import com.yahoo.vespa.config.server.TimeoutBudget; @@ -45,22 +43,25 @@ public class SessionCreateHandler extends SessionHandler { @Override protected HttpResponse handlePOST(HttpRequest request) { - Slime deployLog = applicationRepository.createDeployLog(); final TenantName tenantName = Utils.getTenantNameFromSessionRequest(request); Utils.checkThatTenantExists(applicationRepository.tenantRepository(), tenantName); TimeoutBudget timeoutBudget = SessionHandler.getTimeoutBudget(request, zookeeperBarrierTimeout); - DeployLogger logger = createLogger(request, deployLog, tenantName); + boolean verbose = request.getBooleanProperty("verbose"); + + DeployHandlerLogger logger; long sessionId; if (request.hasProperty("from")) { ApplicationId applicationId = getFromApplicationId(request); + logger = DeployHandlerLogger.forApplication(applicationId, verbose); sessionId = applicationRepository.createSessionFromExisting(applicationId, logger, false, timeoutBudget); } else { validateDataAndHeader(request); + logger = DeployHandlerLogger.forTenant(tenantName, verbose); // TODO: Avoid using application id here at all ApplicationId applicationId = ApplicationId.from(tenantName, ApplicationName.defaultName(), InstanceName.defaultName()); sessionId = applicationRepository.createSession(applicationId, timeoutBudget, request.getData(), request.getHeader(ApplicationApiHandler.contentTypeHeader)); } - return createResponse(request, tenantName, deployLog, sessionId); + return new SessionCreateResponse(logger.slime(), tenantName, request.getHost(), request.getPort(), sessionId); } static ApplicationId getFromApplicationId(HttpRequest request) { @@ -82,11 +83,6 @@ public class SessionCreateHandler extends SessionHandler { .instanceName(match.group(6)).build(); } - private static DeployHandlerLogger createLogger(HttpRequest request, Slime deployLog, TenantName tenant) { - return SessionHandler.createLogger(deployLog, request, - new ApplicationId.Builder().tenant(tenant).applicationName("-").build()); - } - static void validateDataAndHeader(HttpRequest request) { if (request.getData() == null) { throw new BadRequestException("Request contains no data"); @@ -99,9 +95,4 @@ public class SessionCreateHandler extends SessionHandler { ApplicationApiHandler.APPLICATION_X_GZIP + "' and '" + ApplicationApiHandler.APPLICATION_ZIP + "' are supported"); } } - - private HttpResponse createResponse(HttpRequest request, TenantName tenantName, Slime deployLog, long sessionId) { - return new SessionCreateResponse(tenantName, deployLog, deployLog.get()) - .createResponse(request.getHost(), request.getPort(), sessionId); - } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateResponse.java index 7d08ea94ce6..33c8f54b1f6 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionCreateResponse.java @@ -2,10 +2,9 @@ package com.yahoo.vespa.config.server.http.v2; import com.yahoo.config.provision.TenantName; -import com.yahoo.container.jdisc.HttpResponse; +import com.yahoo.restapi.SlimeJsonResponse; import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; -import com.yahoo.vespa.config.server.http.SessionResponse; /** * Creates a response for SessionCreateHandler. @@ -13,22 +12,17 @@ import com.yahoo.vespa.config.server.http.SessionResponse; * @author hmusum * @since 5.1.27 */ -public class SessionCreateResponse extends SessionResponse { - private final TenantName tenantName; +public class SessionCreateResponse extends SlimeJsonResponse { - public SessionCreateResponse(TenantName tenantName, Slime deployLog, Cursor root) { - super(deployLog, root); - this.tenantName = tenantName; - } - - public HttpResponse createResponse(String hostName, int port, long sessionId) { + public SessionCreateResponse(Slime deployLog, TenantName tenantName, String hostName, int port, long sessionId) { + super(deployLog); String path = "http://" + hostName + ":" + port + "/application/v2/tenant/" + tenantName.value() + "/session/" + sessionId; + Cursor root = deployLog.get(); - this.root.setString("tenant", tenantName.value()); - this.root.setString("session-id", Long.toString(sessionId)); - this.root.setString("prepared", path + "/prepared"); - this.root.setString("content", path + "/content/"); - this.root.setString("message", "Session " + sessionId + " for tenant '" + tenantName.value() + "' created."); - return this; + root.setString("tenant", tenantName.value()); + root.setString("session-id", Long.toString(sessionId)); + root.setString("prepared", path + "/prepared"); + root.setString("content", path + "/content/"); + root.setString("message", "Session " + sessionId + " for tenant '" + tenantName.value() + "' created."); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareAndActivateResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareAndActivateResponse.java index 7d9a0b11c28..7bace4749a8 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareAndActivateResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareAndActivateResponse.java @@ -5,21 +5,25 @@ import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.HttpRequest; +import com.yahoo.restapi.SlimeJsonResponse; +import com.yahoo.slime.Cursor; import com.yahoo.vespa.config.server.configchange.ConfigChangeActionsSlimeConverter; -import com.yahoo.vespa.config.server.http.SessionResponse; /** * Creates a response for SessionPrepareHandler. * * @author hmusum */ -class SessionPrepareAndActivateResponse extends SessionResponse { +class SessionPrepareAndActivateResponse extends SlimeJsonResponse { SessionPrepareAndActivateResponse(PrepareResult result, HttpRequest request, ApplicationId applicationId, Zone zone) { - super(result.deployLog(), result.deployLog().get()); + super(result.deployLogger().slime()); + TenantName tenantName = applicationId.tenant(); String message = "Session " + result.sessionId() + " for tenant '" + tenantName.value() + "' prepared and activated."; - this.root.setString("tenant", tenantName.value()); + Cursor root = slime.get(); + + root.setString("tenant", tenantName.value()); root.setString("url", "http://" + request.getHost() + ":" + request.getPort() + "/application/v2/tenant/" + tenantName + "/application/" + applicationId.application().value() + 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 c0789a9c828..4cb07e37f28 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 @@ -51,7 +51,7 @@ public class SessionPrepareHandler extends SessionHandler { long sessionId = getSessionIdV2(request); applicationRepository.validateThatSessionIsNotActive(tenant, sessionId); applicationRepository.validateThatSessionIsPrepared(tenant, sessionId); - return new SessionPrepareResponse(applicationRepository.createDeployLog(), tenant.getName(), request, sessionId); + return new SessionPrepareResponse(tenant.getName(), request, sessionId); } @Override diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareResponse.java index 6d2aa426036..a97cd37d3b4 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareResponse.java @@ -3,33 +3,36 @@ package com.yahoo.vespa.config.server.http.v2; import com.yahoo.config.provision.TenantName; import com.yahoo.container.jdisc.HttpRequest; +import com.yahoo.restapi.SlimeJsonResponse; +import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; +import com.yahoo.slime.Type; import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; import com.yahoo.vespa.config.server.configchange.ConfigChangeActionsSlimeConverter; -import com.yahoo.vespa.config.server.http.SessionResponse; /** * Creates a response for SessionPrepareHandler. * * @author hmusum */ -class SessionPrepareResponse extends SessionResponse { +class SessionPrepareResponse extends SlimeJsonResponse { - SessionPrepareResponse(Slime deployLog, TenantName tenantName, HttpRequest request, long sessionId) { - this(deployLog, tenantName, request, sessionId, new ConfigChangeActions()); + SessionPrepareResponse(TenantName tenantName, HttpRequest request, long sessionId) { + this(new Slime(), tenantName, request, sessionId, new ConfigChangeActions()); } SessionPrepareResponse(PrepareResult result, TenantName tenantName, HttpRequest request) { - this(result.deployLog(), tenantName, request, result.sessionId(), result.configChangeActions()); + this(result.deployLogger().slime(), tenantName, request, result.sessionId(), result.configChangeActions()); } private SessionPrepareResponse(Slime deployLog, TenantName tenantName, HttpRequest request, long sessionId, ConfigChangeActions actions) { - super(deployLog, deployLog.get()); - String message = "Session " + sessionId + " for tenant '" + tenantName.value() + "' prepared."; - this.root.setString("tenant", tenantName.value()); - this.root.setString("activate", "http://" + request.getHost() + ":" + request.getPort() + + super(deployLog); + + Cursor root = deployLog.get().type() != Type.NIX ? deployLog.get() : deployLog.setObject(); + root.setString("tenant", tenantName.value()); + root.setString("activate", "http://" + request.getHost() + ":" + request.getPort() + "/application/v2/tenant/" + tenantName.value() + "/session/" + sessionId + "/active"); - root.setString("message", message); + root.setString("message", "Session " + sessionId + " for tenant '" + tenantName.value() + "' prepared."); new ConfigChangeActionsSlimeConverter(actions).toSlime(root); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantCreateResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantCreateResponse.java index 2850698ea87..6ff2b30075d 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantCreateResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantCreateResponse.java @@ -2,8 +2,7 @@ package com.yahoo.vespa.config.server.http.v2; import com.yahoo.config.provision.TenantName; -import com.yahoo.vespa.config.server.http.HttpConfigResponse; -import com.yahoo.vespa.config.server.http.SessionResponse; +import com.yahoo.restapi.MessageResponse; /** * Response for tenant create @@ -11,16 +10,10 @@ import com.yahoo.vespa.config.server.http.SessionResponse; * @author vegardh * */ -public class TenantCreateResponse extends SessionResponse { +public class TenantCreateResponse extends MessageResponse { public TenantCreateResponse(TenantName tenant) { - super(); - this.root.setString("message", "Tenant "+tenant+" created."); - } - - @Override - public String getContentType() { - return HttpConfigResponse.JSON_CONTENT_TYPE; + super("Tenant " + tenant + " created."); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantDeleteResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantDeleteResponse.java index 3ba61f84270..d21584c8cdc 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantDeleteResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantDeleteResponse.java @@ -1,8 +1,7 @@ // Copyright 2017 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.yahoo.config.provision.TenantName; -import com.yahoo.vespa.config.server.http.HttpConfigResponse; -import com.yahoo.vespa.config.server.http.SessionResponse; +import com.yahoo.restapi.MessageResponse; /** * Response for tenant delete @@ -10,16 +9,10 @@ import com.yahoo.vespa.config.server.http.SessionResponse; * @author vegardh * */ -public class TenantDeleteResponse extends SessionResponse { +public class TenantDeleteResponse extends MessageResponse { public TenantDeleteResponse(TenantName tenant) { - super(); - this.root.setString("message", "Tenant "+tenant+" deleted."); - } - - @Override - public String getContentType() { - return HttpConfigResponse.JSON_CONTENT_TYPE; + super("Tenant " + tenant + " deleted."); } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantGetResponse.java b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantGetResponse.java index 183fcd9b3c1..b918cab7828 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantGetResponse.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/http/v2/TenantGetResponse.java @@ -2,24 +2,17 @@ package com.yahoo.vespa.config.server.http.v2; import com.yahoo.config.provision.TenantName; -import com.yahoo.vespa.config.server.http.HttpConfigResponse; -import com.yahoo.vespa.config.server.http.SessionResponse; +import com.yahoo.restapi.MessageResponse; /** * Response for tenant create * * @author hmusum */ -public class TenantGetResponse extends SessionResponse { +public class TenantGetResponse extends MessageResponse { public TenantGetResponse(TenantName tenant) { - super(); - this.root.setString("message", "Tenant '" + tenant + "' exists."); - } - - @Override - public String getContentType() { - return HttpConfigResponse.JSON_CONTENT_TYPE; + super("Tenant '" + tenant + "' exists."); } } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLoggerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLoggerTest.java index 6aa72e3e672..3ac9e681604 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLoggerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployHandlerLoggerTest.java @@ -6,9 +6,7 @@ import com.yahoo.config.provision.ApplicationId; import java.util.logging.Level; import com.yahoo.log.LogLevel; -import com.yahoo.slime.Cursor; import com.yahoo.slime.JsonFormat; -import com.yahoo.slime.Slime; import org.junit.Test; @@ -33,13 +31,11 @@ public class DeployHandlerLoggerTest { } private void testLogging(boolean verbose, String expectedPattern) throws IOException { - Slime slime = new Slime(); - Cursor array = slime.setArray(); - DeployLogger logger = new DeployHandlerLogger(array, verbose, new ApplicationId.Builder() - .tenant("testtenant").applicationName("testapp").build()); + DeployHandlerLogger logger = DeployHandlerLogger.forApplication( + new ApplicationId.Builder().tenant("testtenant").applicationName("testapp").build(), verbose); logMessages(logger); ByteArrayOutputStream baos = new ByteArrayOutputStream(); - new JsonFormat(true).encode(baos, slime); + new JsonFormat(true).encode(baos, logger.slime()); assertTrue(Pattern.matches(expectedPattern, baos.toString())); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java index e2eeb68a565..748c43bafeb 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java @@ -8,18 +8,17 @@ import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; -import java.time.Clock; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.ApplicationName; import com.yahoo.config.provision.InstanceName; import com.yahoo.config.provision.TenantName; +import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.http.SessionHandlerTest; -import com.yahoo.vespa.config.server.http.SessionResponse; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -157,7 +156,7 @@ public class TenantHandlerTest { return (TenantCreateResponse) handler.handlePUT(testRequest); } - private void assertResponseEquals(SessionResponse response, String payload) throws IOException { + private void assertResponseEquals(HttpResponse response, String payload) throws IOException { ByteArrayOutputStream baos = new ByteArrayOutputStream(); response.render(baos); assertEquals(baos.toString(StandardCharsets.UTF_8), payload); 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 c1698718ad1..95cdccf4cb8 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 @@ -28,7 +28,6 @@ import com.yahoo.security.KeyUtils; import com.yahoo.security.SignatureAlgorithm; import com.yahoo.security.X509CertificateBuilder; import com.yahoo.security.X509CertificateUtils; -import com.yahoo.slime.Slime; import com.yahoo.transaction.NestedTransaction; import com.yahoo.vespa.config.server.MockSecretStore; import com.yahoo.vespa.config.server.TestComponentRegistry; @@ -388,8 +387,8 @@ public class SessionPreparerTest { } private DeployHandlerLogger getLogger() { - return new DeployHandlerLogger(new Slime().get(), false /*verbose */, - new ApplicationId.Builder().tenant("testtenant").applicationName("testapp").build()); + return DeployHandlerLogger.forApplication( + new ApplicationId.Builder().tenant("testtenant").applicationName("testapp").build(), false /*verbose */); } diff --git a/container-core/src/main/java/com/yahoo/restapi/SlimeJsonResponse.java b/container-core/src/main/java/com/yahoo/restapi/SlimeJsonResponse.java index 2473da3578d..a0f8b58fb6a 100644 --- a/container-core/src/main/java/com/yahoo/restapi/SlimeJsonResponse.java +++ b/container-core/src/main/java/com/yahoo/restapi/SlimeJsonResponse.java @@ -15,7 +15,11 @@ import java.io.OutputStream; */ public class SlimeJsonResponse extends HttpResponse { - private final Slime slime; + protected final Slime slime; + + public SlimeJsonResponse() { + this(new Slime()); + } public SlimeJsonResponse(Slime slime) { super(200); |