aboutsummaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
authorJon Marius Venstad <jvenstad@yahoo-inc.com>2019-04-11 15:12:05 +0200
committerJon Marius Venstad <jvenstad@yahoo-inc.com>2019-04-11 15:12:05 +0200
commita57d2f852e19c3b272c3a196e6f7da219b871577 (patch)
treed944888536bded704e030ddb322b7bd1984ea6af /controller-server
parent6eeee2c63c6a0ee9d033b6fff6b3f3cbae45c814 (diff)
Copy Vespa logs before deactivating test deployments
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java31
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java16
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java34
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java7
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs.json2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview.json7
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/system-test-job.json1
8 files changed, 95 insertions, 7 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
index d612ffb6930..12290adbc12 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunner.java
@@ -12,6 +12,8 @@ import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.AthenzDomain;
import com.yahoo.config.provision.AthenzService;
import com.yahoo.config.provision.SystemName;
+import com.yahoo.io.IOUtils;
+import com.yahoo.log.LogLevel;
import com.yahoo.slime.Cursor;
import com.yahoo.slime.Slime;
import com.yahoo.vespa.config.SlimeUtils;
@@ -21,6 +23,7 @@ import com.yahoo.vespa.hosted.controller.api.ActivateResult;
import com.yahoo.vespa.hosted.controller.api.application.v4.model.DeployOptions;
import com.yahoo.vespa.hosted.controller.api.identifiers.DeploymentId;
import com.yahoo.vespa.hosted.controller.api.identifiers.Hostname;
+import com.yahoo.vespa.hosted.controller.api.integration.LogEntry;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.ConfigServerException;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.Node;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.PrepareResponse;
@@ -45,6 +48,7 @@ import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.time.Duration;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -115,6 +119,7 @@ public class InternalStepRunner implements StepRunner {
case installTester: return installTester(id, logger);
case startTests: return startTests(id, logger);
case endTests: return endTests(id, logger);
+ case copyVespaLogs: return copyVespaLogs(id, logger);
case deactivateReal: return deactivateReal(id, logger);
case deactivateTester: return deactivateTester(id, logger);
case report: return report(id, logger);
@@ -416,6 +421,32 @@ public class InternalStepRunner implements StepRunner {
}
}
+ private Optional<RunStatus> copyVespaLogs(RunId id, DualLogger logger) {
+ ZoneId zone = id.type().zone(controller.system());
+ logger.log("Copying Vespa log from nodes of " + id.application() + " in " + zone + " ...");
+ try {
+ List<LogEntry> entries = new ArrayList<>();
+ String logs = IOUtils.readAll(controller.configServer().getLogStream(new DeploymentId(id.application(), zone),
+ Collections.emptyMap()), // Get all logs.
+ StandardCharsets.UTF_8);
+ for (String line : logs.split("\n")) {
+ String[] parts = line.split("\t");
+ if (parts.length != 7) continue;
+ entries.add(new LogEntry(0,
+ (long) (Double.parseDouble(parts[0]) * 1000),
+ LogEntry.typeOf(LogLevel.parse(parts[5])),
+ parts[1] + '\t' + parts[3] + '\t' + parts[4] + '\n' +
+ parts[6].replaceAll("\\\\n", "\n")
+ .replaceAll("\\\\t", "\t")));
+ }
+ controller.jobController().log(id, Step.copyVespaLogs, entries);
+ }
+ catch (Exception e) {
+ logger.log(INFO, "Failure getting vespa logs for " + id, e);
+ }
+ return Optional.of(running); // Don't let failure here stop cleanup.
+ }
+
private Optional<RunStatus> deactivateReal(RunId id, DualLogger logger) {
logger.log("Deactivating deployment of " + id.application() + " in " + id.type().zone(controller.system()) + " ...");
controller.applications().deactivate(id.application(), id.type().zone(controller.system()));
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
index c8ba3f31316..5bff581c4ce 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java
@@ -109,18 +109,22 @@ public class JobController {
}
}
- /** Stores the given log records for the given run and step. */
- public void log(RunId id, Step step, Level level, List<String> messages) {
+ /** Stores the given log entries for the given run and step. */
+ public void log(RunId id, Step step, List<LogEntry> entries) {
locked(id, __ -> {
- List<LogEntry> entries = messages.stream()
- .map(message -> new LogEntry(0, controller.clock().millis(), LogEntry.typeOf(level), message))
- .collect(toList());
logs.append(id.application(), id.type(), step, entries);
return __;
});
}
- /** Stores the given log record for the given run and step. */
+ /** Stores the given log messages for the given run and step. */
+ public void log(RunId id, Step step, Level level, List<String> messages) {
+ log(id, step, messages.stream()
+ .map(message -> new LogEntry(0, controller.clock().millis(), LogEntry.typeOf(level), message))
+ .collect(toList()));
+ }
+
+ /** Stores the given log message for the given run and step. */
public void log(RunId id, Step step, Level level, String message) {
log(id, step, level, Collections.singletonList(message));
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java
index f606d904c5e..41f57a80ffd 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java
@@ -36,6 +36,7 @@ import java.util.Optional;
import static com.yahoo.vespa.hosted.controller.api.integration.LogEntry.Type.debug;
import static com.yahoo.vespa.hosted.controller.api.integration.LogEntry.Type.error;
import static com.yahoo.vespa.hosted.controller.api.integration.LogEntry.Type.info;
+import static com.yahoo.vespa.hosted.controller.api.integration.LogEntry.Type.warning;
import static com.yahoo.vespa.hosted.controller.deployment.InternalDeploymentTester.appId;
import static com.yahoo.vespa.hosted.controller.deployment.InternalDeploymentTester.testerId;
import static com.yahoo.vespa.hosted.controller.deployment.Step.Status.failed;
@@ -286,10 +287,43 @@ public class InternalStepRunnerTest {
mailer.inbox("b@a").get(0).subject());
}
+ @Test
+ public void vespaLogIsCopied() {
+ RunId id = tester.startSystemTestTests();
+ tester.cloud().set(TesterCloud.Status.ERROR);
+ tester.configServer().setLogStream(vespaLog);
+ long lastId = tester.jobs().details(id).get().lastId().getAsLong();
+ tester.runner().run();
+ assertEquals(failed, tester.jobs().run(id).get().steps().get(Step.endTests));
+ assertTestLogEntries(id, Step.copyVespaLogs,
+ new LogEntry(lastId + 2, tester.clock().millis(), debug, "Copying Vespa log from nodes of tenant.application in zone test.us-east-1 in default ..."),
+ new LogEntry(lastId + 3, 1554970337084L, info,
+ "17480180-v6-3.ostk.bm2.prod.ne1.yahoo.com\tcontainer\tContainer.com.yahoo.container.jdisc.ConfiguredApplication\n" +
+ "Switching to the latest deployed set of configurations and components. Application switch number: 2"),
+ new LogEntry(lastId + 4, 1554970337935L, info,
+ "17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\tcontainer\tstdout\n" +
+ "ERROR: Bundle canary-application [71] Unable to get module class path. (java.lang.NullPointerException)"),
+ new LogEntry(lastId + 5, 1554970337947L, info,
+ "17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\tcontainer\tstdout\n" +
+ "ERROR: Bundle canary-application [71] Unable to get module class path. (java.lang.NullPointerException)"),
+ new LogEntry(lastId + 6, 1554970337947L, info,
+ "17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\tcontainer\tstdout\n" +
+ "ERROR: Bundle canary-application [71] Unable to get module class path. (java.lang.NullPointerException)"),
+ new LogEntry(lastId + 7, 1554970337947L, warning,
+ "17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\tcontainer\tstderr\n" +
+ "java.lang.NullPointerException\n\tat org.apache.felix.framework.BundleRevisionImpl.calculateContentPath(BundleRevisionImpl.java:438)\n\tat org.apache.felix.framework.BundleRevisionImpl.initializeContentPath(BundleRevisionImpl.java:371)"));
+ }
+
private void assertTestLogEntries(RunId id, Step step, LogEntry... entries) {
assertEquals(List.of(entries), tester.jobs().details(id).get().get(step));
}
+ private static final String vespaLog = "1554970337.084804\t17480180-v6-3.ostk.bm2.prod.ne1.yahoo.com\t5549/832\tcontainer\tContainer.com.yahoo.container.jdisc.ConfiguredApplication\tinfo\tSwitching to the latest deployed set of configurations and components. Application switch number: 2\n" +
+ "1554970337.935104\t17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\t5480\tcontainer\tstdout\tinfo\tERROR: Bundle canary-application [71] Unable to get module class path. (java.lang.NullPointerException)\n" +
+ "1554970337.947777\t17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\t5480\tcontainer\tstdout\tinfo\tERROR: Bundle canary-application [71] Unable to get module class path. (java.lang.NullPointerException)\n" +
+ "1554970337.947820\t17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\t5480\tcontainer\tstdout\tinfo\tERROR: Bundle canary-application [71] Unable to get module class path. (java.lang.NullPointerException)\n" +
+ "1554970337.947844\t17491290-v6-1.ostk.bm2.prod.ne1.yahoo.com\t5480\tcontainer\tstderr\twarning\tjava.lang.NullPointerException\\n\\tat org.apache.felix.framework.BundleRevisionImpl.calculateContentPath(BundleRevisionImpl.java:438)\\n\\tat org.apache.felix.framework.BundleRevisionImpl.initializeContentPath(BundleRevisionImpl.java:371)";
+
@Test
public void generates_correct_services_xml_test() {
assertFile("test_runner_services.xml-cd", new String(InternalStepRunner.servicesXml(SystemName.cd, Optional.of("d-2-12-75"))));
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java
index 927596ca9ab..1222ae30c8a 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/integration/ConfigServerMock.java
@@ -63,6 +63,7 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer
private Version lastPrepareVersion = null;
private RuntimeException prepareException = null;
private ConfigChangeActions configChangeActions = null;
+ private String log = "INFO - All good";
@Inject
public ConfigServerMock(ZoneRegistryMock zoneRegistry) {
@@ -361,7 +362,11 @@ public class ConfigServerMock extends AbstractComponent implements ConfigServer
@Override
public InputStream getLogStream(DeploymentId deployment, Map<String, String> queryParameters) {
- return IOUtils.toInputStream("INFO - All good");
+ return IOUtils.toInputStream(log);
+ }
+
+ public void setLogStream(String log) {
+ this.log = log;
}
@Override
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs.json
index 1c8da68e138..5ac896e2753 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/jobs.json
@@ -57,6 +57,7 @@
"installTester": "unfinished",
"startTests": "unfinished",
"endTests": "unfinished",
+ "copyVespaLogs": "unfinished",
"deactivateReal": "unfinished",
"deactivateTester": "unfinished",
"report": "unfinished"
@@ -94,6 +95,7 @@
"installTester": "unfinished",
"startTests": "unfinished",
"endTests": "unfinished",
+ "copyVespaLogs": "unfinished",
"deactivateReal": "unfinished",
"deactivateTester": "unfinished",
"report": "unfinished"
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview.json
index c7580d869b0..84866650afc 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/overview.json
@@ -116,6 +116,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -159,6 +160,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -192,6 +194,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -269,6 +272,7 @@
"installTester": "unfinished",
"startTests": "unfinished",
"endTests": "unfinished",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -310,6 +314,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -355,6 +360,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -390,6 +396,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json
index 8c5e5253482..68599618ab4 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/staging-runs.json
@@ -23,6 +23,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -68,6 +69,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -113,6 +115,7 @@
"installTester": "succeeded",
"startTests": "succeeded",
"endTests": "succeeded",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
@@ -158,6 +161,7 @@
"installTester": "unfinished",
"startTests": "unfinished",
"endTests": "unfinished",
+ "copyVespaLogs": "succeeded",
"deactivateReal": "succeeded",
"deactivateTester": "succeeded",
"report": "succeeded"
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/system-test-job.json b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/system-test-job.json
index 71f647ead11..2f5c6e489bd 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/system-test-job.json
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/restapi/application/responses/system-test-job.json
@@ -20,6 +20,7 @@
"installTester": "unfinished",
"startTests": "unfinished",
"endTests": "unfinished",
+ "copyVespaLogs": "unfinished",
"deactivateReal": "unfinished",
"deactivateTester": "unfinished",
"report": "unfinished"