diff options
Diffstat (limited to 'controller-server')
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> |