summaryrefslogtreecommitdiffstats
path: root/controller-server
diff options
context:
space:
mode:
Diffstat (limited to 'controller-server')
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java17
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ZipEntries.java1
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java5
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/JobController.java14
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/NameServiceDispatcher.java4
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java7
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java4
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersion.java2
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java19
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java1
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java9
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java4
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/InternalStepRunnerTest.java1
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveUriUpdaterTest.java2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/TrafficShareUpdaterTest.java8
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java59
-rw-r--r--controller-server/src/test/resources/test_runner_services.xml-cd1
-rw-r--r--controller-server/src/test/resources/test_runner_services_with_legacy_tests.xml-cd40
19 files changed, 149 insertions, 57 deletions
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java
index 0c9ff7863bd..5b20c57fcca 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackage.java
@@ -25,6 +25,8 @@ import com.yahoo.yolean.Exceptions;
import javax.security.auth.x500.X500Principal;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.UncheckedIOException;
import java.math.BigInteger;
import java.security.KeyPair;
import java.security.cert.X509Certificate;
@@ -81,8 +83,9 @@ public class TestPackage {
entries.put("tests/.ignore-" + UUID.randomUUID(), new byte[0]);
entries.put(servicesFile,
- servicesXml( ! isPublicSystem,
+ servicesXml(! isPublicSystem,
certificateValidFrom != null,
+ hasLegacyTests(testPackage),
testerResourcesFor(id.type().zone(), spec.requireInstance(id.application().instance())),
testerApp));
@@ -114,6 +117,12 @@ public class TestPackage {
this.applicationPackage = new ApplicationPackage(buffer.toByteArray());
}
+ static boolean hasLegacyTests(byte[] testPackage) {
+ return ZipEntries.from(testPackage, __ -> true, 0, false).asList().stream()
+ .anyMatch(file -> file.name().startsWith("artifacts/") && file.name().endsWith("-tests.jar"));
+
+ }
+
public ApplicationPackage asApplicationPackage() {
return applicationPackage;
}
@@ -210,9 +219,9 @@ public class TestPackage {
}
/** Returns the generated services.xml content for the tester application. */
- public static byte[] servicesXml(boolean systemUsesAthenz, boolean useTesterCertificate,
+ public static byte[] servicesXml(boolean systemUsesAthenz, boolean useTesterCertificate, boolean hasLegacyTests,
NodeResources resources, ControllerConfig.Steprunner.Testerapp config) {
- int jdiscMemoryGb = 2; // 2Gb memory for tester application (excessive?).
+ int jdiscMemoryGb = 2; // 2Gb memory for tester application which uses Maven.
int jdiscMemoryPct = (int) Math.ceil(100 * jdiscMemoryGb / resources.memoryGb());
// Of the remaining memory, split 50/50 between Surefire running the tests and the rest
@@ -260,7 +269,7 @@ public class TestPackage {
" </component>\n" +
"\n" +
" <nodes count=\"1\">\n" +
- " <jvm allocated-memory=\"" + jdiscMemoryPct + "%\"/>\n" +
+ (hasLegacyTests ? " <jvm allocated-memory=\"" + jdiscMemoryPct + "%\"/>\n" : "" ) +
" " + resourceString + "\n" +
" </nodes>\n" +
" </container>\n" +
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ZipEntries.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ZipEntries.java
index 8392a77bad5..6bbcd551924 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ZipEntries.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/application/pkg/ZipEntries.java
@@ -67,6 +67,7 @@ public class ZipEntries {
/** Read ZIP entries from inputStream */
public static ZipEntries from(byte[] zip, Predicate<String> entryNameMatcher, int maxEntrySizeInBytes, boolean throwIfEntryExceedsMaxSize) {
+
Options options = Options.standard()
.pathPredicate(entryNameMatcher)
.maxSize(2 * (long) Math.pow(1024, 3)) // 2 GB
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java
index 3a6a8e67a75..52eeaae1297 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentStatus.java
@@ -542,7 +542,10 @@ public class DeploymentStatus {
existingRevision = Optional.of(target.targetRevision());
}
List<Job> toRun = new ArrayList<>();
- List<Change> changes = deployingCompatibilityChange ? List.of(change) : changes(job, step, change);
+ List<Change> changes = deployingCompatibilityChange
+ || allJobs.get(job).flatMap(status -> status.lastCompleted()).isEmpty()
+ ? List.of(change)
+ : changes(job, step, change);
for (Change partial : changes) {
Job jobToRun = new Job(job.type(),
Versions.from(partial, application, existingPlatform, existingRevision, fallbackPlatform(partial, job)),
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 6a4975c3458..31c78f0cc60 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
@@ -70,6 +70,7 @@ import java.util.logging.Logger;
import java.util.stream.Stream;
import static com.yahoo.collections.Iterables.reversed;
+import static com.yahoo.vespa.hosted.controller.deployment.RunStatus.aborted;
import static com.yahoo.vespa.hosted.controller.deployment.RunStatus.reset;
import static com.yahoo.vespa.hosted.controller.deployment.RunStatus.running;
import static com.yahoo.vespa.hosted.controller.deployment.Step.Status.succeeded;
@@ -537,6 +538,9 @@ public class JobController {
/** Marks the given run as aborted; no further normal steps will run, but run-always steps will try to succeed. */
public void abort(RunId id, String reason) {
locked(id, run -> {
+ if (run.status() == aborted)
+ return run;
+
run.stepStatuses().entrySet().stream()
.filter(entry -> entry.getValue() == unfinished)
.forEach(entry -> log(id, entry.getKey(), INFO, "Aborting run: " + reason));
@@ -685,6 +689,10 @@ public class JobController {
if ( ! controller.zoneRegistry().hasZone(type.zone()))
throw new IllegalArgumentException(type.zone() + " is not present in this system");
+ VersionStatus versionStatus = controller.readVersionStatus();
+ if (platform.isPresent() && versionStatus.deployableVersions().stream().map(VespaVersion::versionNumber).noneMatch(platform.get()::equals))
+ throw new IllegalArgumentException("platform version " + platform.get() + " is not present in this system");
+
controller.applications().lockApplicationOrThrow(TenantAndApplicationId.from(id), application -> {
if ( ! application.get().instances().containsKey(id.instance()))
application = controller.applications().withNewInstance(application, id);
@@ -706,7 +714,7 @@ public class JobController {
byte[] diff = getDiff(applicationPackage, deploymentId, lastRun);
controller.applications().lockApplicationOrThrow(TenantAndApplicationId.from(id), application -> {
- Version targetPlatform = platform.orElseGet(() -> findTargetPlatform(applicationPackage, deploymentId, application.get().get(id.instance())));
+ Version targetPlatform = platform.orElseGet(() -> findTargetPlatform(applicationPackage, deploymentId, application.get().get(id.instance()), versionStatus));
if ( ! allowOutdatedPlatform
&& ! controller.readVersionStatus().isOnCurrentMajor(targetPlatform)
&& runs(id, type).values().stream().noneMatch(run -> run.versions().targetPlatform().getMajor() == targetPlatform.getMajor()))
@@ -742,9 +750,8 @@ public class JobController {
.orElseGet(() -> ApplicationPackageDiff.diffAgainstEmpty(applicationPackage));
}
- private Version findTargetPlatform(ApplicationPackage applicationPackage, DeploymentId id, Optional<Instance> instance) {
+ private Version findTargetPlatform(ApplicationPackage applicationPackage, DeploymentId id, Optional<Instance> instance, VersionStatus versionStatus) {
// Prefer previous platform if possible. Candidates are all deployable, ascending, with existing version appended; then reversed.
- VersionStatus versionStatus = controller.readVersionStatus();
Version systemVersion = controller.systemVersion(versionStatus);
List<Version> versions = new ArrayList<>(List.of(systemVersion));
@@ -755,6 +762,7 @@ public class JobController {
instance.map(Instance::deployments)
.map(deployments -> deployments.get(id.zoneId()))
.map(Deployment::version)
+ .filter(versions::contains) // Don't deploy versions that are no longer known.
.ifPresent(versions::add);
if (versions.isEmpty())
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/NameServiceDispatcher.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/NameServiceDispatcher.java
index 078a0dfc685..19616f862ab 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/NameServiceDispatcher.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/maintenance/NameServiceDispatcher.java
@@ -31,7 +31,9 @@ public class NameServiceDispatcher extends ControllerMaintainer {
@Override
protected double maintain() {
- int requestCount = trueIntervalInSeconds(); // Dispatch 1 request per second
+ // Dispatch 1 request per second on average. Note that this is not entirely accurate because a NameService
+ // implementation may need to perform multiple API-specific requests to execute a single NameServiceRequest
+ int requestCount = trueIntervalInSeconds();
try (var lock = db.lockNameServiceQueue()) {
var queue = db.readNameServiceQueue();
var instant = clock.instant();
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
index 76925241c1e..3000c37ad1e 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/restapi/deployment/DeploymentApiHandler.java
@@ -1,6 +1,7 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.restapi.deployment;
+import com.yahoo.component.Version;
import com.yahoo.config.application.api.DeploymentInstanceSpec;
import com.yahoo.config.application.api.DeploymentSpec;
import com.yahoo.config.provision.ApplicationId;
@@ -96,9 +97,9 @@ public class DeploymentApiHandler extends ThreadedHttpRequestHandler {
var versionStatus = controller.readVersionStatus();
ApplicationList applications = ApplicationList.from(controller.applications().asList()).withJobs();
var deploymentStatuses = controller.jobController().deploymentStatuses(applications, versionStatus);
- var deploymentStatistics = DeploymentStatistics.compute(versionStatus.versions().stream().map(VespaVersion::versionNumber).collect(toList()),
- deploymentStatuses)
- .stream().collect(toMap(DeploymentStatistics::version, identity()));
+ Map<Version, DeploymentStatistics> deploymentStatistics = DeploymentStatistics.compute(versionStatus.versions().stream().map(VespaVersion::versionNumber).collect(toList()),
+ deploymentStatuses)
+ .stream().collect(toMap(DeploymentStatistics::version, identity()));
for (VespaVersion version : versionStatus.versions()) {
Cursor versionObject = platformArray.addObject();
versionObject.setString("version", version.versionNumber().toString());
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java
index 04f5d9866f8..707fa85b6b6 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/NodeVersion.java
@@ -38,7 +38,9 @@ public record NodeVersion(HostName hostname,
@Override
public String toString() {
- return hostname + ": " + currentVersion + " -> " + wantedVersion + " [zone=" + zone + ", suspendedAt=" + suspendedAt.map(Instant::toString).orElse("<not suspended>") + "]";
+ return hostname + ": " + currentVersion.toFullString() + " -> " + wantedVersion.toFullString() +
+ " [zone=" + zone + ", suspendedAt=" + suspendedAt.map(Instant::toString)
+ .orElse("<not suspended>") + "]";
}
/** Returns whether this is upgrading */
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersion.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersion.java
index 30a88733ed3..6ed716bb4bf 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersion.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/OsVersion.java
@@ -24,7 +24,7 @@ public record OsVersion(Version version, CloudName cloud) implements Comparable<
@Override
public String toString() {
- return "version " + version + " for " + cloud + " cloud";
+ return "version " + version.toFullString() + " for " + cloud + " cloud";
}
@Override
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java
index b0a37474af7..4002da4699a 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java
@@ -1,14 +1,15 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.versions;
-import ai.vespa.validation.Validation;
-import com.yahoo.collections.Iterables;
import com.yahoo.component.Version;
import com.yahoo.config.provision.HostName;
+import com.yahoo.vespa.hosted.controller.Application;
import com.yahoo.vespa.hosted.controller.Controller;
+import com.yahoo.vespa.hosted.controller.Instance;
import com.yahoo.vespa.hosted.controller.api.identifiers.ControllerVersion;
import com.yahoo.vespa.hosted.controller.api.integration.configserver.NodeFilter;
import com.yahoo.vespa.hosted.controller.application.ApplicationList;
+import com.yahoo.vespa.hosted.controller.application.Deployment;
import com.yahoo.vespa.hosted.controller.application.SystemApplication;
import com.yahoo.vespa.hosted.controller.maintenance.SystemUpgrader;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion.Confidence;
@@ -17,6 +18,7 @@ import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
@@ -122,10 +124,10 @@ public record VersionStatus(List<VespaVersion> versions) {
.orElse(newSystemVersion);
if (newSystemVersion.isBefore(systemVersion)) {
log.warning("Refusing to lower system version from " +
- systemVersion +
+ systemVersion.toFullString() +
" to " +
- newSystemVersion +
- ", nodes on " + newSystemVersion + ": " +
+ newSystemVersion.toFullString() +
+ ", nodes on " + newSystemVersion.toFullString() + ": " +
infrastructureVersions.get(newSystemVersion).stream()
.map(HostName::value)
.collect(Collectors.joining(", ")));
@@ -133,8 +135,13 @@ public record VersionStatus(List<VespaVersion> versions) {
systemVersion = newSystemVersion;
}
+ Set<Version> allVersions = new HashSet<>(infrastructureVersions.keySet());
+ for (Application application : controller.applications().asList())
+ for (Instance instance : application.instances().values())
+ for (Deployment deployment : instance.deployments().values())
+ allVersions.add(deployment.version());
- List<DeploymentStatistics> deploymentStatistics = DeploymentStatistics.compute(infrastructureVersions.keySet(),
+ List<DeploymentStatistics> deploymentStatistics = DeploymentStatistics.compute(allVersions,
controller.jobController().deploymentStatuses(ApplicationList.from(controller.applications().asList())
.withProjectId()
.withJobs()));
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
index dede0c8dec8..554bf2a57b4 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java
@@ -743,6 +743,7 @@ public class ControllerTest {
var context = tester.newDeploymentContext();
tester.controllerTester().flagSource().withListFlag(PermanentFlags.INCOMPATIBLE_VERSIONS.id(), List.of("8"), String.class);
tester.controllerTester().upgradeSystem(version2);
+ tester.newDeploymentContext("keep", "v2", "alive").submit().deploy(); // TODO jonmv: remove
ZoneId zone = ZoneId.from("dev", "us-east-1");
context.runJob(zone, new ApplicationPackageBuilder().compileVersion(version1).build());
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java
index 5bc1c386134..bff0ccc8ae1 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/application/pkg/TestPackageTest.java
@@ -147,8 +147,17 @@ public class TestPackageTest {
@Test
void generates_correct_services_xml() throws IOException {
assertEquals(Files.readString(Paths.get("src/test/resources/test_runner_services.xml-cd")),
+ new String(TestPackage.servicesXml(true,
+ false,
+ false,
+ new NodeResources(2, 12, 75, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.local),
+ new ControllerConfig.Steprunner.Testerapp.Builder().build()),
+ UTF_8));
+
+ assertEquals(Files.readString(Paths.get("src/test/resources/test_runner_services_with_legacy_tests.xml-cd")),
new String(TestPackage.servicesXml(true,
false,
+ true,
new NodeResources(2, 12, 75, 1, NodeResources.DiskSpeed.fast, NodeResources.StorageType.local),
new ControllerConfig.Steprunner.Testerapp.Builder().build()),
UTF_8));
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
index f0402eb764b..bd43a9dafbc 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/deployment/DeploymentContext.java
@@ -209,8 +209,8 @@ public class DeploymentContext {
public DeploymentContext deployPlatform(Version version) {
assertEquals(instance().change().platform().get(), version);
assertFalse(application().instances().values().stream()
- .anyMatch(instance -> instance.deployments().values().stream()
- .anyMatch(deployment -> deployment.version().equals(version))));
+ .anyMatch(instance -> instance.deployments().values().stream()
+ .anyMatch(deployment -> deployment.version().equals(version))));
assertEquals(version, instance().change().platform().get());
assertFalse(instance().change().revision().isPresent());
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 784ea284de5..8810e09dd40 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
@@ -398,6 +398,7 @@ public class InternalStepRunnerTest {
assertEquals(unfinished, tester.jobs().run(id).stepStatuses().get(Step.installReal));
Version version = new Version("7.8.9");
+ tester.controllerTester().upgradeSystem(version);
Future<?> concurrentDeployment = Executors.newSingleThreadExecutor().submit(() -> {
tester.jobs().deploy(app.instanceId(), DeploymentContext.devUsEast1, Optional.of(version), applicationPackage());
});
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveUriUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveUriUpdaterTest.java
index cb5a84654d0..8c44b39691c 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveUriUpdaterTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/ArchiveUriUpdaterTest.java
@@ -80,7 +80,7 @@ public class ArchiveUriUpdaterTest {
}
private void deploy(DeploymentContext application, ZoneId zone) {
- application.runJob(JobType.deploymentTo(zone), new ApplicationPackage(new byte[0]), Version.fromString("7.1"));
+ application.runJob(JobType.deploymentTo(zone), new ApplicationPackage(new byte[0]));
}
}
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
index 6ac0509c0f8..3bd4be3bb23 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/DeploymentMetricsMaintainerTest.java
@@ -36,8 +36,10 @@ public class DeploymentMetricsMaintainerTest {
@Test
void updates_metrics() {
+ Version version1 = Version.fromString("7.1");
+ tester.controllerTester().upgradeSystem(version1);
var application = tester.newDeploymentContext();
- application.runJob(DeploymentContext.devUsEast1, new ApplicationPackage(new byte[0]), Version.fromString("7.1"));
+ application.runJob(DeploymentContext.devUsEast1, new ApplicationPackage(new byte[0]), version1);
DeploymentMetricsMaintainer maintainer = maintainer(tester.controller());
Supplier<Application> app = application::application;
@@ -51,7 +53,9 @@ public class DeploymentMetricsMaintainerTest {
assertFalse(deployment.get().activity().lastWritten().isPresent(), "Never received any writes");
// Metrics are gathered and saved to application
- application.runJob(DeploymentContext.devUsEast1, new ApplicationPackage(new byte[0]), Version.fromString("7.5.5"));
+ Version version2 = Version.fromString("7.5.5");
+ tester.controllerTester().upgradeSystem(version2);
+ application.runJob(DeploymentContext.devUsEast1, new ApplicationPackage(new byte[0]), version2);
var metrics0 = Map.of(ClusterMetrics.QUERIES_PER_SECOND, 1D,
ClusterMetrics.FEED_PER_SECOND, 2D,
ClusterMetrics.DOCUMENT_COUNT, 3D,
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/TrafficShareUpdaterTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/TrafficShareUpdaterTest.java
index 07ea04b4c84..75e2bbb06e7 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/TrafficShareUpdaterTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/maintenance/TrafficShareUpdaterTest.java
@@ -27,13 +27,15 @@ public class TrafficShareUpdaterTest {
@Test
void testTrafficUpdater() {
DeploymentTester tester = new DeploymentTester();
+ Version version = Version.fromString("7.1");
+ tester.controllerTester().upgradeSystem(version);
var application = tester.newDeploymentContext();
var deploymentMetricsMaintainer = new DeploymentMetricsMaintainer(tester.controller(), Duration.ofDays(1));
var updater = new TrafficShareUpdater(tester.controller(), Duration.ofDays(1));
ZoneId prod1 = ZoneId.from("prod", "ap-northeast-1");
ZoneId prod2 = ZoneId.from("prod", "us-east-3");
ZoneId prod3 = ZoneId.from("prod", "us-west-1");
- application.runJob(DeploymentContext.productionApNortheast1, new ApplicationPackage(new byte[0]), Version.fromString("7.1"));
+ application.runJob(DeploymentContext.productionApNortheast1, new ApplicationPackage(new byte[0]), version);
// Single zone
setQpsMetric(50.0, application.application().id().defaultInstance(), prod1, tester);
@@ -42,7 +44,7 @@ public class TrafficShareUpdaterTest {
assertTrafficFraction(1.0, 1.0, application.instanceId(), prod1, tester);
// Two zones
- application.runJob(DeploymentContext.productionUsEast3, new ApplicationPackage(new byte[0]), Version.fromString("7.1"));
+ application.runJob(DeploymentContext.productionUsEast3, new ApplicationPackage(new byte[0]), version);
// - one cold
setQpsMetric(50.0, application.application().id().defaultInstance(), prod1, tester);
setQpsMetric(0.0, application.application().id().defaultInstance(), prod2, tester);
@@ -59,7 +61,7 @@ public class TrafficShareUpdaterTest {
assertTrafficFraction(0.47, 1.0, application.instanceId(), prod2, tester);
// Three zones
- application.runJob(DeploymentContext.productionUsWest1, new ApplicationPackage(new byte[0]), Version.fromString("7.1"));
+ application.runJob(DeploymentContext.productionUsWest1, new ApplicationPackage(new byte[0]), version);
// - one cold
setQpsMetric(53.0, application.application().id().defaultInstance(), prod1, tester);
setQpsMetric(47.0, application.application().id().defaultInstance(), prod2, tester);
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java
index a0e3c63e58b..ab262a1a3c5 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java
@@ -5,6 +5,7 @@ import com.yahoo.component.Version;
import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.HostName;
import com.yahoo.config.provision.zone.ZoneApi;
+import com.yahoo.config.provision.zone.ZoneId;
import com.yahoo.vespa.hosted.controller.Controller;
import com.yahoo.vespa.hosted.controller.ControllerTester;
import com.yahoo.vespa.hosted.controller.api.identifiers.ControllerVersion;
@@ -132,6 +133,10 @@ public class VersionStatusTest {
DeploymentTester tester = new DeploymentTester();
ApplicationPackage applicationPackage = applicationPackage("default");
+ Version version0 = new Version("6.1");
+ tester.controllerTester().upgradeSystem(version0);
+ var context0 = tester.newDeploymentContext("tenant1", "app0", "default").runJob(JobType.dev("us-east-1"), applicationPackage);
+
Version version1 = new Version("6.2");
Version version2 = new Version("6.3");
tester.controllerTester().upgradeSystem(version1);
@@ -158,8 +163,13 @@ public class VersionStatusTest {
tester.triggerJobs();
tester.controllerTester().computeVersionStatus();
+ VersionStatus status = tester.controller().readVersionStatus();
+ assertEquals(3, status.versions().size(), "The three versions above exist");
+
+ tester.controller().applications().deactivate(context0.instanceId(), JobType.dev("us-east-1").zone());
+ tester.controllerTester().computeVersionStatus();
List<VespaVersion> versions = tester.controller().readVersionStatus().versions();
- assertEquals(2, versions.size(), "The two versions above exist");
+ assertEquals(2, versions.size(), "The two last versions above exist after dev deployment is gone");
VespaVersion v1 = versions.get(0);
assertEquals(version1, v1.versionNumber());
@@ -265,13 +275,13 @@ public class VersionStatusTest {
.submit(conservativePolicy)
.deploy();
+ var devApp = tester.newDeploymentContext("dev", "app", "on-version-1");
// Applications that do not affect confidence calculation:
// Application without deployment
var ignored0 = tester.newDeploymentContext("tenant1", "ignored0", "default");
- assertEquals(
- Confidence.high, confidence(tester.controller(), version0), "All applications running on this version: High");
+ assertEquals(Confidence.high, confidence(tester.controller(), version0), "All applications running on this version: High");
// New version is released
Version version1 = new Version("6.3");
@@ -279,31 +289,32 @@ public class VersionStatusTest {
tester.upgrader().maintain();
tester.triggerJobs();
- // Canaries upgrade to new versions and fail
+ // Dev app deploys to the new versions, and canaries also upgrade, and fail.
+ devApp.runJob(JobType.dev("us-east-1"), canaryApplicationPackage);
+ tester.controllerTester().computeVersionStatus();
+ assertEquals(Confidence.low, confidence(tester.controller(), version1), "Just the dev app: Low");
+
canary0.deployPlatform(version1);
canary1.runJob(systemTest)
.runJob(stagingTest)
.failDeployment(productionUsWest1);
+
tester.controllerTester().computeVersionStatus();
- assertEquals(
- Confidence.broken, confidence(tester.controller(), version1), "One canary failed: Broken");
+ assertEquals(Confidence.broken, confidence(tester.controller(), version1), "One canary failed: Broken");
// New version is released
Version version2 = new Version("6.4");
tester.controllerTester().upgradeSystem(version2);
tester.upgrader().maintain();
tester.triggerJobs();
- assertEquals(
- Confidence.low, confidence(tester.controller(), version2), "Confidence defaults to low for version with no applications");
+ assertEquals(Confidence.low, confidence(tester.controller(), version2), "Confidence defaults to low for version with no applications");
// All canaries upgrade successfully
canary0.deployPlatform(version2);
canary1.deployPlatform(version2);
- assertEquals(
- Confidence.broken, confidence(tester.controller(), version1), "Confidence for remains unchanged for version1: Broken");
- assertEquals(
- Confidence.low, confidence(tester.controller(), version2), "Nothing has failed but not all canaries have upgraded: Low");
+ assertEquals(Confidence.broken, confidence(tester.controller(), version1), "Confidence remains unchanged for version1: Broken");
+ assertEquals(Confidence.low, confidence(tester.controller(), version2), "Nothing has failed but not all canaries have upgraded: Low");
// Remaining canary upgrades to version2 which raises confidence to normal and more apps upgrade
canary2.triggerJobs().jobAborted(systemTest).jobAborted(stagingTest);
@@ -312,8 +323,7 @@ public class VersionStatusTest {
tester.controllerTester().computeVersionStatus();
tester.upgrader().maintain();
tester.triggerJobs();
- assertEquals(
- Confidence.normal, confidence(tester.controller(), version2), "Canaries have upgraded: Normal");
+ assertEquals(Confidence.normal, confidence(tester.controller(), version2), "Canaries have upgraded: Normal");
default0.deployPlatform(version2);
default1.deployPlatform(version2);
default2.deployPlatform(version2);
@@ -327,10 +337,8 @@ public class VersionStatusTest {
// Remember confidence across restart
tester.controllerTester().createNewController();
- assertEquals(
- Confidence.high, confidence(tester.controller(), version0), "Confidence remains unchanged for version0: High");
- assertEquals(
- Confidence.normal, confidence(tester.controller(), version2), "All canaries deployed + < 90% of defaults: Normal");
+ assertEquals(Confidence.high, confidence(tester.controller(), version0), "Confidence remains unchanged for version0: High");
+ assertEquals(Confidence.normal, confidence(tester.controller(), version2), "All canaries deployed + < 90% of defaults: Normal");
assertTrue(tester.controller().readVersionStatus().versions().stream()
.noneMatch(vespaVersion -> vespaVersion.versionNumber().equals(version1)),
"Status for version without applications is removed");
@@ -340,10 +348,8 @@ public class VersionStatusTest {
default9.deployPlatform(version2);
tester.controllerTester().computeVersionStatus();
- assertEquals(
- Confidence.high, confidence(tester.controller(), version0), "Confidence remains unchanged for version0: High");
- assertEquals(
- VespaVersion.Confidence.high, confidence(tester.controller(), version2), "90% of defaults deployed successfully: High");
+ assertEquals(Confidence.high, confidence(tester.controller(), version0), "Confidence remains unchanged for version0: High");
+ assertEquals(VespaVersion.Confidence.high, confidence(tester.controller(), version2), "90% of defaults deployed successfully: High");
// A new version is released, all canaries upgrade successfully, but enough "default" apps fail to mark version
// as broken
@@ -363,12 +369,9 @@ public class VersionStatusTest {
default3.failDeployment(stagingTest);
tester.controllerTester().computeVersionStatus();
- assertEquals(
- Confidence.high, confidence(tester.controller(), version0), "Confidence remains unchanged for version0: High");
- assertEquals(
- Confidence.high, confidence(tester.controller(), version2), "Confidence remains unchanged for version2: High");
- assertEquals(
- VespaVersion.Confidence.broken, confidence(tester.controller(), version3), "40% of defaults failed: Broken");
+ assertEquals(Confidence.high, confidence(tester.controller(), version0), "Confidence remains unchanged for version0: High");
+ assertEquals(Confidence.high, confidence(tester.controller(), version2), "Confidence remains unchanged for version2: High");
+ assertEquals(VespaVersion.Confidence.broken, confidence(tester.controller(), version3), "40% of defaults failed: Broken");
// Test version order
List<VespaVersion> versions = tester.controller().readVersionStatus().versions();
diff --git a/controller-server/src/test/resources/test_runner_services.xml-cd b/controller-server/src/test/resources/test_runner_services.xml-cd
index 526fd12965b..4bf3a78801d 100644
--- a/controller-server/src/test/resources/test_runner_services.xml-cd
+++ b/controller-server/src/test/resources/test_runner_services.xml-cd
@@ -33,7 +33,6 @@
</component>
<nodes count="1">
- <jvm allocated-memory="17%"/>
<resources vcpu="2.00" memory="12.00Gb" disk="75.00Gb" disk-speed="fast" storage-type="local"/>
</nodes>
</container>
diff --git a/controller-server/src/test/resources/test_runner_services_with_legacy_tests.xml-cd b/controller-server/src/test/resources/test_runner_services_with_legacy_tests.xml-cd
new file mode 100644
index 00000000000..526fd12965b
--- /dev/null
+++ b/controller-server/src/test/resources/test_runner_services_with_legacy_tests.xml-cd
@@ -0,0 +1,40 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<services xmlns:deploy='vespa' version='1.0'>
+ <container version='1.0' id='tester'>
+
+ <component id="com.yahoo.vespa.hosted.testrunner.TestRunner" bundle="vespa-testrunner-components">
+ <config name="com.yahoo.vespa.hosted.testrunner.test-runner">
+ <artifactsPath>artifacts</artifactsPath>
+ <surefireMemoryMb>5120</surefireMemoryMb>
+ <useAthenzCredentials>true</useAthenzCredentials>
+ <useTesterCertificate>false</useTesterCertificate>
+ </config>
+ </component>
+
+ <handler id="com.yahoo.vespa.testrunner.TestRunnerHandler" bundle="vespa-osgi-testrunner">
+ <binding>http://*/tester/v1/*</binding>
+ </handler>
+
+ <component id="ai.vespa.hosted.cd.cloud.impl.VespaTestRuntimeProvider" bundle="cloud-tenant-cd" />
+
+ <component id="com.yahoo.vespa.testrunner.JunitRunner" bundle="vespa-osgi-testrunner">
+ <config name="com.yahoo.vespa.testrunner.junit-test-runner">
+ <artifactsPath>artifacts</artifactsPath>
+ <useAthenzCredentials>true</useAthenzCredentials>
+ </config>
+ </component>
+
+ <component id="com.yahoo.vespa.testrunner.VespaCliTestRunner" bundle="vespa-osgi-testrunner">
+ <config name="com.yahoo.vespa.testrunner.vespa-cli-test-runner">
+ <artifactsPath>artifacts</artifactsPath>
+ <testsPath>tests</testsPath>
+ <useAthenzCredentials>true</useAthenzCredentials>
+ </config>
+ </component>
+
+ <nodes count="1">
+ <jvm allocated-memory="17%"/>
+ <resources vcpu="2.00" memory="12.00Gb" disk="75.00Gb" disk-speed="fast" storage-type="local"/>
+ </nodes>
+ </container>
+</services>