From 976d5618dd512ee46c8b6bc0ce22834b65d9773a Mon Sep 17 00:00:00 2001 From: Ola Aunrønning Date: Thu, 27 Jan 2022 19:48:31 +0100 Subject: Add all versions that are deployed --- .../yahoo/vespa/hosted/controller/Application.java | 10 ++++++---- .../vespa/hosted/controller/LockedApplication.java | 14 +++++++------- .../persistence/ApplicationSerializer.java | 22 ++++++++++++++++------ .../persistence/ApplicationSerializerTest.java | 7 ++++++- 4 files changed, 35 insertions(+), 18 deletions(-) (limited to 'controller-server') diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java index d97b1b6547d..bb7863a7b69 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/Application.java @@ -29,7 +29,9 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.OptionalLong; import java.util.Set; +import java.util.SortedSet; import java.util.TreeMap; +import java.util.TreeSet; import java.util.function.Function; import java.util.stream.Collectors; @@ -47,7 +49,7 @@ public class Application { private final DeploymentSpec deploymentSpec; private final ValidationOverrides validationOverrides; private final Optional latestVersion; - private final List versions; + private final SortedSet versions; private final OptionalLong projectId; private final Optional deploymentIssueId; private final Optional ownershipIssueId; @@ -61,14 +63,14 @@ public class Application { public Application(TenantAndApplicationId id, Instant now) { this(id, now, DeploymentSpec.empty, ValidationOverrides.empty, Optional.empty(), Optional.empty(), Optional.empty(), OptionalInt.empty(), - new ApplicationMetrics(0, 0), Set.of(), OptionalLong.empty(), Optional.empty(), List.of(), List.of()); + new ApplicationMetrics(0, 0), Set.of(), OptionalLong.empty(), Optional.empty(), new TreeSet<>(), List.of()); } // DO NOT USE! For serialization purposes, only. public Application(TenantAndApplicationId id, Instant createdAt, DeploymentSpec deploymentSpec, ValidationOverrides validationOverrides, Optional deploymentIssueId, Optional ownershipIssueId, Optional owner, OptionalInt majorVersion, ApplicationMetrics metrics, Set deployKeys, OptionalLong projectId, - Optional latestVersion, List versions, Collection instances) { + Optional latestVersion, SortedSet versions, Collection instances) { this.id = Objects.requireNonNull(id, "id cannot be null"); this.createdAt = Objects.requireNonNull(createdAt, "instant of creation cannot be null"); this.deploymentSpec = Objects.requireNonNull(deploymentSpec, "deploymentSpec cannot be null"); @@ -111,7 +113,7 @@ public class Application { public Optional latestVersion() { return latestVersion; } /** Returns the currently deployed versions of the application */ - public List versions() { + public SortedSet versions() { return versions; } diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java index f476ae649f6..06ff381e4dc 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/LockedApplication.java @@ -13,16 +13,16 @@ import com.yahoo.vespa.hosted.controller.metric.ApplicationMetrics; import java.security.PublicKey; import java.time.Instant; -import java.util.ArrayList; import java.util.HashMap; import java.util.LinkedHashSet; -import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.OptionalInt; import java.util.OptionalLong; import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; import java.util.function.UnaryOperator; /** @@ -45,7 +45,7 @@ public class LockedApplication { private final Set deployKeys; private final OptionalLong projectId; private final Optional latestVersion; - private final List versions; + private final SortedSet versions; private final Map instances; /** @@ -66,7 +66,7 @@ public class LockedApplication { ValidationOverrides validationOverrides, Optional deploymentIssueId, Optional ownershipIssueId, Optional owner, OptionalInt majorVersion, ApplicationMetrics metrics, Set deployKeys, - OptionalLong projectId, Optional latestVersion, List versions, + OptionalLong projectId, Optional latestVersion, SortedSet versions, Map instances) { this.lock = lock; this.id = id; @@ -117,8 +117,8 @@ public class LockedApplication { } public LockedApplication withNewSubmission(ApplicationVersion latestVersion) { - List applicationVersions = new ArrayList<>(versions); - if (!applicationVersions.contains(latestVersion)) applicationVersions.add(latestVersion); + SortedSet applicationVersions = new TreeSet<>(versions); + applicationVersions.add(latestVersion); return new LockedApplication(lock, id, createdAt, deploymentSpec, validationOverrides, deploymentIssueId, ownershipIssueId, owner, majorVersion, metrics, deployKeys, projectId, Optional.of(latestVersion), applicationVersions, instances); @@ -191,7 +191,7 @@ public class LockedApplication { } public LockedApplication withoutVersion(ApplicationVersion version) { - List applicationVersions = new ArrayList<>(versions); + SortedSet applicationVersions = new TreeSet<>(versions); applicationVersions.remove(version); return new LockedApplication(lock, id, createdAt, deploymentSpec, validationOverrides, deploymentIssueId, ownershipIssueId, owner, majorVersion, metrics, deployKeys, diff --git a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java index 8fc28588662..30b6920fd79 100644 --- a/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java +++ b/controller-server/src/main/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializer.java @@ -49,6 +49,8 @@ import java.util.Optional; import java.util.OptionalInt; import java.util.OptionalLong; import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; /** * Serializes {@link Application}s to/from slime. @@ -166,7 +168,7 @@ public class ApplicationSerializer { root.setDouble(writeQualityField, application.metrics().writeServiceQuality()); deployKeysToSlime(application.deployKeys(), root.setArray(pemDeployKeysField)); application.latestVersion().ifPresent(version -> toSlime(version, root.setObject(latestVersionField))); - versionsToSlime(application.versions(), root.setArray(versionsField)); + versionsToSlime(application, root.setArray(versionsField)); instancesToSlime(application, root.setArray(instancesField)); return slime; } @@ -226,8 +228,16 @@ public class ApplicationSerializer { object.setString(regionField, zone.region().value()); } - private void versionsToSlime(List versions, Cursor object) { - versions.forEach(version -> toSlime(version, object.addObject())); + private void versionsToSlime(Application application, Cursor object) { + // Add all deployed versions as well + application.instances() + .values() + .stream() + .flatMap(instance -> instance.deployments().values().stream()) + .map(Deployment::applicationVersion) + .forEach(application.versions()::add); + + application.versions().forEach(version -> toSlime(version, object.addObject())); } private void toSlime(ApplicationVersion applicationVersion, Cursor object) { @@ -319,7 +329,7 @@ public class ApplicationSerializer { List instances = instancesFromSlime(id, root.field(instancesField)); OptionalLong projectId = SlimeUtils.optionalLong(root.field(projectIdField)); Optional latestVersion = latestVersionFromSlime(root.field(latestVersionField)); - List versions = versionsFromSlime(root.field(versionsField)); + SortedSet versions = versionsFromSlime(root.field(versionsField)); return new Application(id, createdAt, deploymentSpec, validationOverrides, deploymentIssueId, ownershipIssueId, owner, majorVersion, metrics, @@ -331,8 +341,8 @@ public class ApplicationSerializer { .filter(version -> ! version.isUnknown()); } - private List versionsFromSlime(Inspector versionsObject) { - List versions = new ArrayList<>(); + private SortedSet versionsFromSlime(Inspector versionsObject) { + SortedSet versions = new TreeSet<>(); versionsObject.traverse((ArrayTraverser) (name, object) -> versions.add(applicationVersionFromSlime(object))); return versions; } diff --git a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java index dda0e219e7b..06c9daa1892 100644 --- a/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java +++ b/controller-server/src/test/java/com/yahoo/vespa/hosted/controller/persistence/ApplicationSerializerTest.java @@ -42,6 +42,8 @@ import java.util.OptionalDouble; import java.util.OptionalInt; import java.util.OptionalLong; import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; import static org.junit.Assert.assertEquals; @@ -91,7 +93,7 @@ public class ApplicationSerializerTest { Optional.of("best commit"), true, Optional.of("hash1")); - List versions = List.of(applicationVersion1); + SortedSet versions = new TreeSet<>(Set.of(applicationVersion1)); assertEquals("https://github/org/repo/tree/commit1", applicationVersion1.sourceUrl().get()); ApplicationVersion applicationVersion2 = ApplicationVersion @@ -156,7 +158,10 @@ public class ApplicationSerializerTest { assertEquals(original.latestVersion().get().buildTime(), serialized.latestVersion().get().buildTime()); assertEquals(original.latestVersion().get().sourceUrl(), serialized.latestVersion().get().sourceUrl()); assertEquals(original.latestVersion().get().commit(), serialized.latestVersion().get().commit()); + // Check deployed versions are added assertEquals(original.versions(), serialized.versions()); + assertEquals(serialized.versions(), new TreeSet<>(Set.of(applicationVersion1, applicationVersion2))); + assertEquals(original.deploymentSpec().xmlForm(), serialized.deploymentSpec().xmlForm()); assertEquals(original.validationOverrides().xmlForm(), serialized.validationOverrides().xmlForm()); -- cgit v1.2.3