aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjonmv <venstad@gmail.com>2023-06-30 10:57:45 +0200
committerjonmv <venstad@gmail.com>2023-06-30 10:57:45 +0200
commit3efa2694068b6e63d9c4d383a9c8d281c6ade2a6 (patch)
treee25c4a3835ef6c01a3a5e124faaaf5ace535a548
parent8ff5c45ca2429ed8fb5cdb252043af97e6e89d99 (diff)
Delay using released versions as compile version for three hours
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/maven/Metadata.java20
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMavenRepository.java19
-rw-r--r--controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/maven/MetadataTest.java11
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java9
-rw-r--r--controller-server/src/main/java/com/yahoo/vespa/hosted/controller/versions/VersionStatus.java2
-rw-r--r--controller-server/src/main/resources/configdefinitions/vespa.hosted.controller.maven.repository.config.maven-repository.def2
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTest.java7
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java16
-rw-r--r--controller-server/src/test/java/com/yahoo/vespa/hosted/controller/versions/VersionStatusTest.java7
9 files changed, 68 insertions, 25 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/maven/Metadata.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/maven/Metadata.java
index dd80a2b3a9a..a0d3614ffc5 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/maven/Metadata.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/maven/Metadata.java
@@ -5,9 +5,11 @@ import com.yahoo.component.Version;
import com.yahoo.text.XML;
import org.w3c.dom.Element;
+import java.time.Instant;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.List;
-import java.util.stream.Collectors;
import static java.util.Objects.requireNonNull;
@@ -19,10 +21,12 @@ import static java.util.Objects.requireNonNull;
public class Metadata {
private final ArtifactId id;
+ private final Instant lastUpdated;
private final List<Version> versions;
- public Metadata(ArtifactId id, List<Version> versions) {
+ public Metadata(ArtifactId id, Instant lastUpdated, List<Version> versions) {
this.id = requireNonNull(id);
+ this.lastUpdated = requireNonNull(lastUpdated);
this.versions = versions.stream().sorted().toList();
}
@@ -31,17 +35,25 @@ public class Metadata {
Element metadata = XML.getDocument(xml).getDocumentElement();
ArtifactId id = new ArtifactId(XML.getValue(XML.getChild(metadata, "groupId")),
XML.getValue(XML.getChild(metadata, "artifactId")));
+ String lastUpdatedTimestamp = XML.getValue(XML.getChild(XML.getChild(metadata, "versioning"), "lastUpdated"));
+ Instant lastUpdated = Instant.from(DateTimeFormatter.ofPattern("yyyyMMddHHmmss").withZone(ZoneId.of("UTC"))
+ .parse(lastUpdatedTimestamp));
List<Version> versions = new ArrayList<>();
for (Element version : XML.getChildren(XML.getChild(XML.getChild(metadata, "versioning"), "versions")))
versions.add(Version.fromString(XML.getValue(version)));
- return new Metadata(id, versions);
+ return new Metadata(id, lastUpdated, versions);
}
/** Id of the metadata this concerns. */
public ArtifactId id() { return id; }
+ /** When the list of versions was last updated. */
+ Instant lastUpdated() { return lastUpdated; }
+
/** List of available versions of this, sorted by ascending version order. */
- public List<Version> versions() { return versions; }
+ public List<Version> versions(Instant availableAt) {
+ return versions.size() == 1 || availableAt.isAfter(lastUpdated.plusSeconds(10800)) ? versions : versions.subList(0, versions.size() - 1);
+ }
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMavenRepository.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMavenRepository.java
index aad6b306662..f43ec795f92 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMavenRepository.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/stubs/MockMavenRepository.java
@@ -2,12 +2,17 @@
package com.yahoo.vespa.hosted.controller.api.integration.stubs;
import com.yahoo.component.Version;
+import com.yahoo.component.annotation.Inject;
import com.yahoo.vespa.hosted.controller.api.integration.maven.ArtifactId;
-import com.yahoo.vespa.hosted.controller.api.integration.maven.Metadata;
import com.yahoo.vespa.hosted.controller.api.integration.maven.MavenRepository;
+import com.yahoo.vespa.hosted.controller.api.integration.maven.Metadata;
+import java.time.Clock;
+import java.time.Instant;
+import java.time.ZoneId;
import java.util.ArrayList;
import java.util.List;
+import java.util.concurrent.atomic.AtomicReference;
/**
* Mock repository for maven artifacts, that returns a static metadata.
@@ -18,21 +23,31 @@ public class MockMavenRepository implements MavenRepository {
public static final ArtifactId id = new ArtifactId("ai.vespa", "search");
+ private final Clock clock;
+ private AtomicReference<Instant> lastUpdated;
private final List<Version> versions = new ArrayList<>();
+ @Inject
public MockMavenRepository() {
+ this(Clock.fixed(Instant.EPOCH, ZoneId.of("UTC")));
+ }
+
+ public MockMavenRepository(Clock clock) {
+ this.clock = clock;
+ this.lastUpdated = new AtomicReference<>(clock.instant().minusSeconds(10801));
versions.addAll(List.of(Version.fromString("6.0"),
Version.fromString("6.1"),
Version.fromString("6.2")));
}
public void addVersion(Version version) {
+ lastUpdated.set(clock.instant());
versions.add(version);
}
@Override
public Metadata metadata() {
- return new Metadata(id, versions);
+ return new Metadata(id, lastUpdated.get(), versions);
}
@Override
diff --git a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/maven/MetadataTest.java b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/maven/MetadataTest.java
index 4cec90eb48d..a6f7a5ee069 100644
--- a/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/maven/MetadataTest.java
+++ b/controller-api/src/test/java/com/yahoo/vespa/hosted/controller/api/integration/maven/MetadataTest.java
@@ -1,9 +1,12 @@
// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.controller.api.integration.maven;
+import com.yahoo.collections.Iterables;
import com.yahoo.component.Version;
import org.junit.jupiter.api.Test;
+import java.time.Instant;
+
import static org.junit.jupiter.api.Assertions.assertEquals;
public class MetadataTest {
@@ -13,8 +16,12 @@ public class MetadataTest {
Metadata metadata = Metadata.fromXml(metadataXml);
assertEquals("com.yahoo.vespa", metadata.id().groupId());
assertEquals("tenant-base", metadata.id().artifactId());
- assertEquals(Version.fromString("6.297.80"), metadata.versions().get(0));
- assertEquals(Version.fromString("7.61.10"), metadata.versions().get(metadata.versions().size() - 1));
+ assertEquals(Instant.parse("2019-06-19T05:42:45.00Z"), metadata.lastUpdated());
+ assertEquals(Version.fromString("6.297.80"), metadata.versions(metadata.lastUpdated()).get(0));
+ assertEquals(Version.fromString("7.61.10"), Iterables.reversed(metadata.versions(metadata.lastUpdated().plusSeconds(10801)))
+ .iterator().next());
+ assertEquals(Version.fromString("7.60.51"), Iterables.reversed(metadata.versions(metadata.lastUpdated().plusSeconds(10800)))
+ .iterator().next());
}
private static final String metadataXml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
index c3e1ff1dbf2..adadcab3270 100644
--- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
+++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/ApplicationController.java
@@ -81,6 +81,7 @@ import com.yahoo.vespa.hosted.controller.versions.VersionStatus;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion;
import com.yahoo.vespa.hosted.controller.versions.VespaVersion.Confidence;
import com.yahoo.yolean.Exceptions;
+
import java.io.ByteArrayInputStream;
import java.security.Principal;
import java.security.cert.X509Certificate;
@@ -421,10 +422,10 @@ public class ApplicationController {
// Fall back to the newest, system-compatible version with unknown confidence. For public systems, this implies high confidence.
Set<Version> knownVersions = versionStatus.versions().stream().map(VespaVersion::versionNumber).collect(toSet());
- Optional<Version> unknown = controller.mavenRepository().metadata().versions().stream()
- .filter(version -> ! knownVersions.contains(version))
- .filter(systemCompatible)
- .max(naturalOrder());
+ Optional<Version> unknown = controller.mavenRepository().metadata().versions(clock.instant()).stream()
+ .filter(version -> ! knownVersions.contains(version))
+ .filter(systemCompatible)
+ .max(naturalOrder());
if (nonBroken.isPresent()) {
if (controller.system().isPublic() && unknown.isPresent() && unknown.get().isAfter(nonBroken.get()))
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 732327e25f6..9fb87735b42 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
@@ -148,7 +148,7 @@ public record VersionStatus(List<VespaVersion> versions, int currentMajor) {
.withProjectId()
.withJobs()));
List<VespaVersion> versions = new ArrayList<>();
- List<Version> releasedVersions = controller.mavenRepository().metadata().versions();
+ List<Version> releasedVersions = controller.mavenRepository().metadata().versions(controller.clock().instant());
for (DeploymentStatistics statistics : deploymentStatistics) {
if (statistics.version().isEmpty()) continue;
diff --git a/controller-server/src/main/resources/configdefinitions/vespa.hosted.controller.maven.repository.config.maven-repository.def b/controller-server/src/main/resources/configdefinitions/vespa.hosted.controller.maven.repository.config.maven-repository.def
index 2f32c0375ea..53b1e79900f 100644
--- a/controller-server/src/main/resources/configdefinitions/vespa.hosted.controller.maven.repository.config.maven-repository.def
+++ b/controller-server/src/main/resources/configdefinitions/vespa.hosted.controller.maven.repository.config.maven-repository.def
@@ -4,7 +4,7 @@ namespace=vespa.hosted.controller.maven.repository.config
# URL to the Maven repository API that holds artifacts for tenants in the controller's system
#
-apiUrl string default=https://repo.maven.apache.org/maven2/
+apiUrl string default=https://repo1.maven.org/maven2/
# Group ID of the artifact to list versions for
#
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 43c532548d6..3a1cb322daf 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
@@ -1340,6 +1340,11 @@ public class ControllerTest {
tester.controllerTester().upgradeSystem(version0);
tester.upgrader().overrideConfidence(version0, Confidence.normal);
tester.controllerTester().computeVersionStatus();
+ Version version00 = Version.fromString("6.2");
+ assertEquals(version00, tester.applications().compileVersion(application, OptionalInt.of(7)));
+ assertEquals(version00, tester.applications().compileVersion(application, OptionalInt.empty()));
+ tester.clock().advance(Duration.ofSeconds(10801));
+ tester.controllerTester().computeVersionStatus();
assertEquals(version0, tester.applications().compileVersion(application, OptionalInt.of(7)));
assertEquals(version0, tester.applications().compileVersion(application, OptionalInt.empty()));
assertEquals("this system has no available versions on specified major: 8",
@@ -1351,6 +1356,7 @@ public class ControllerTest {
// System is upgraded
Version version1 = Version.fromString("7.2");
tester.controllerTester().upgradeSystem(version1);
+ tester.clock().advance(Duration.ofSeconds(10801));
tester.upgrader().overrideConfidence(version1, Confidence.normal);
tester.controllerTester().computeVersionStatus();
assertEquals(version0, tester.applications().compileVersion(application, OptionalInt.empty()));
@@ -1367,6 +1373,7 @@ public class ControllerTest {
Version version2 = Version.fromString("8.0");
tester.controllerTester().upgradeSystem(version2);
tester.upgrader().overrideConfidence(version2, Confidence.low);
+ tester.clock().advance(Duration.ofSeconds(10801));
tester.controllerTester().computeVersionStatus();
assertEquals(version1, tester.applications().compileVersion(application, OptionalInt.empty()));
assertEquals("this system has no available versions on specified major: 8",
diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java
index 43a85aa6aca..eabbdd76d5a 100644
--- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java
+++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/ControllerTester.java
@@ -72,7 +72,6 @@ import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Consumer;
import java.util.logging.Handler;
import java.util.logging.Logger;
-import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -290,14 +289,11 @@ public final class ControllerTester {
}
public ZoneId toZone(Environment environment) {
- switch (environment) {
- case dev: case test:
- return ZoneId.from(environment, RegionName.from("us-east-1"));
- case staging:
- return ZoneId.from(environment, RegionName.from("us-east-3"));
- default:
- return ZoneId.from(environment, RegionName.from("us-west-1"));
- }
+ return switch (environment) {
+ case dev, test -> ZoneId.from(environment, RegionName.from("us-east-1"));
+ case staging -> ZoneId.from(environment, RegionName.from("us-east-3"));
+ default -> ZoneId.from(environment, RegionName.from("us-west-1"));
+ };
}
public AthenzDomain createDomainWithAdmin(String domainName, AthenzUser user) {
@@ -395,7 +391,7 @@ public final class ControllerTester {
new CloudAccessControl(new MockUserManagement(), flagSource, serviceRegistry) :
new AthenzFacade(new AthenzClientFactoryMock(athensDb)),
flagSource,
- new MockMavenRepository(),
+ new MockMavenRepository(serviceRegistry.clock()),
serviceRegistry,
new MetricsMock(), new SecretStoreMock(),
new ControllerConfig.Builder().build(),
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 66a918a6f25..abce1c309ae 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
@@ -386,7 +386,12 @@ public class VersionStatusTest {
// Check release status is correct (static data in MockMavenRepository, and upgradeSystem "releases" a version).
assertTrue(versions.get(0).isReleased());
- assertFalse(versions.get(1).isReleased()); // tesst quirk: maven repo lost during controller recreation; useful to test status though
+ assertFalse(versions.get(1).isReleased()); // test quirk: maven repo lost during controller recreation; useful to test status though
+ assertFalse(versions.get(2).isReleased());
+
+ tester.clock().advance(Duration.ofSeconds(10801));
+ tester.controllerTester().computeVersionStatus();
+ versions = tester.controller().readVersionStatus().versions();
assertTrue(versions.get(2).isReleased());
// A new major version is released and all canaries upgrade