From d58da5e3d1631914e7ecb1c46e5c58801b3d3996 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 29 Dec 2022 21:37:46 +0100 Subject: Move AutoscalingStatus content into Autoscaling --- .../provision/applications/AutoscalingStatus.java | 67 ---------------------- .../hosted/provision/autoscale/Autoscaler.java | 6 +- .../hosted/provision/autoscale/Autoscaling.java | 62 ++++++++++++++------ .../maintenance/ScalingSuggestionsMaintainer.java | 21 +++---- .../persistence/ApplicationSerializer.java | 45 +++++++-------- .../hosted/provision/provisioning/Activator.java | 5 +- .../provision/restapi/ApplicationSerializer.java | 4 +- .../provision/testutils/MockNodeRepository.java | 11 ++-- .../provision/autoscale/AutoscalingTest.java | 5 +- .../persistence/ApplicationSerializerTest.java | 12 ++-- 10 files changed, 92 insertions(+), 146 deletions(-) delete mode 100644 node-repository/src/main/java/com/yahoo/vespa/hosted/provision/applications/AutoscalingStatus.java (limited to 'node-repository/src') diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/applications/AutoscalingStatus.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/applications/AutoscalingStatus.java deleted file mode 100644 index ea15b6a42cb..00000000000 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/applications/AutoscalingStatus.java +++ /dev/null @@ -1,67 +0,0 @@ -// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.provision.applications; - -import java.util.Objects; - -/** - * The current autoscaling status of a cluster. - * A value object. - * - * @author bratseth - */ -public class AutoscalingStatus { - - public enum Status { - - /** No status is available: Aautoscaling is disabled, or a brand new application. */ - unavailable, - - /** Autoscaling is not taking any action at the moment due to recent changes or a lack of data */ - waiting, - - /** The cluster is ideally scaled to the current load */ - ideal, - - /** The cluster should be rescaled further, but no better configuration is allowed by the current limits */ - insufficient, - - /** Rescaling of this cluster has been scheduled */ - rescaling - - }; - - private final Status status; - private final String description; - - public AutoscalingStatus(Status status, String description) { - this.status = status; - this.description = description; - } - - public Status status() { return status; } - public String description() { return description; } - - public static AutoscalingStatus empty() { return new AutoscalingStatus(Status.unavailable, ""); } - - @Override - public boolean equals(Object o) { - if (o == this) return true; - if ( ! ( o instanceof AutoscalingStatus other)) return false; - - if ( other.status != this.status ) return false; - if ( ! other.description.equals(this.description) ) return false; - return true; - } - - @Override - public int hashCode() { - return Objects.hash(status, description); - } - - @Override - public String toString() { - return "autoscaling status: " + status + - ( description.isEmpty() ? "" : " (" + description + ")"); - } - -} diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java index 71ed0583317..7e429492de2 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaler.java @@ -6,8 +6,8 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.applications.Application; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus.Status; import com.yahoo.vespa.hosted.provision.applications.Cluster; +import com.yahoo.vespa.hosted.provision.autoscale.Autoscaling.Status; import java.time.Duration; import java.time.Instant; @@ -52,7 +52,7 @@ public class Autoscaler { */ public Autoscaling autoscale(Application application, Cluster cluster, NodeList clusterNodes) { if (cluster.minResources().equals(cluster.maxResources())) - return Autoscaling.none(Status.unavailable, "Autoscaling is not enabled", now()); + return Autoscaling.dontScale(Autoscaling.Status.unavailable, "Autoscaling is not enabled", now()); return autoscale(application, cluster, clusterNodes, Limits.of(cluster)); } @@ -66,7 +66,7 @@ public class Autoscaler { nodeRepository.clock()); if ( ! clusterIsStable(clusterNodes, nodeRepository)) - return Autoscaling.none(Status.waiting, "Cluster change in progress", now()); + return Autoscaling.dontScale(Status.waiting, "Cluster change in progress", now()); var currentAllocation = new AllocatableClusterResources(clusterNodes, nodeRepository); Optional bestAllocation = diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java index 0a58119a36a..427a5d01531 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/Autoscaling.java @@ -1,7 +1,6 @@ package com.yahoo.vespa.hosted.provision.autoscale; import com.yahoo.config.provision.ClusterResources; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus; import java.time.Instant; import java.util.Objects; @@ -14,17 +13,19 @@ import java.util.Optional; */ public class Autoscaling { + private final Status status; + private final String description; private final Optional resources; - private final AutoscalingStatus status; private final Instant at; - public Autoscaling(ClusterResources resources, AutoscalingStatus status, Instant at) { - this(Optional.of(resources), status, at); + public Autoscaling(Status status, String description, ClusterResources resources, Instant at) { + this(status, description, Optional.of(resources), at); } - public Autoscaling(Optional resources, AutoscalingStatus status, Instant at) { - this.resources = resources; + public Autoscaling(Status status, String description, Optional resources, Instant at) { this.status = status; + this.description = description; + this.resources = resources; this.at = at; } @@ -33,27 +34,30 @@ public class Autoscaling { return resources; } - public AutoscalingStatus status() { return status; } + public Status status() { return status; } + + public String description() { return description; } /** Returns the time this target was decided. */ public Instant at() { return at; } - public Autoscaling with(AutoscalingStatus status) { - return new Autoscaling(resources, status, at); + public Autoscaling with(Status status, String description) { + return new Autoscaling(status, description, resources, at); } @Override public boolean equals(Object o) { if ( ! (o instanceof Autoscaling other)) return false; - if ( ! this.resources.equals(other.resources)) return false; if ( ! this.status.equals(other.status)) return false; + if ( ! this.description.equals(other.description)) return false; + if ( ! this.resources.equals(other.resources)) return false; if ( ! this.at.equals(other.at)) return false; return true; } @Override public int hashCode() { - return Objects.hash(resources, status, at); + return Objects.hash(status, description, at); } @Override @@ -61,21 +65,41 @@ public class Autoscaling { return "autoscaling to " + resources + ", made at " + at; } - public static Autoscaling empty() { return new Autoscaling(Optional.empty(), AutoscalingStatus.empty(), Instant.EPOCH); } + public static Autoscaling empty() { return new Autoscaling(Status.unavailable, "", Optional.empty(), Instant.EPOCH); } - public static Autoscaling none(AutoscalingStatus.Status status, String description, Instant at) { - return new Autoscaling(Optional.empty(), new AutoscalingStatus(status, description), at); + public static Autoscaling dontScale(Status status, String description, Instant at) { + return new Autoscaling(status, description, Optional.empty(), at); } - public static Autoscaling dontScale(AutoscalingStatus.Status status, String description, Instant at) { - return new Autoscaling(Optional.empty(), new AutoscalingStatus(status, description), at); + public static Autoscaling ideal(Instant at) { + return new Autoscaling(Status.ideal, "Cluster is ideally scaled within configured limits", + Optional.empty(), at); } public static Autoscaling scaleTo(ClusterResources target, Instant at) { - return new Autoscaling(Optional.of(target), - new AutoscalingStatus(AutoscalingStatus.Status.rescaling, - "Rescaling initiated due to load changes"), + return new Autoscaling(Status.rescaling, + "Rescaling initiated due to load changes", + Optional.of(target), at); } + public enum Status { + + /** No status is available: Aautoscaling is disabled, or a brand new application. */ + unavailable, + + /** Autoscaling is not taking any action at the moment due to recent changes or a lack of data */ + waiting, + + /** The cluster is ideally scaled to the current load */ + ideal, + + /** The cluster should be rescaled further, but no better configuration is allowed by the current limits */ + insufficient, + + /** Rescaling of this cluster has been scheduled */ + rescaling + + }; + } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java index e6fadc5f5bd..af368934188 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/ScalingSuggestionsMaintainer.java @@ -11,11 +11,9 @@ import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.applications.Application; import com.yahoo.vespa.hosted.provision.applications.Applications; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus; import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.autoscale.Autoscaler; import com.yahoo.vespa.hosted.provision.autoscale.Autoscaling; -import com.yahoo.vespa.hosted.provision.autoscale.MetricsDb; import java.time.Duration; import java.util.Map; @@ -64,15 +62,12 @@ public class ScalingSuggestionsMaintainer extends NodeRepositoryMaintainer { Optional cluster = application.cluster(clusterId); if (cluster.isEmpty()) return true; var suggestion = autoscaler.suggest(application, cluster.get(), clusterNodes); - if (suggestion.status().status() == AutoscalingStatus.Status.waiting) return true; - - // empty suggested resources == keep the current allocation - var suggestedResources = suggestion.resources().orElse(clusterNodes.not().retired().toResources()); - if ( ! shouldUpdateSuggestion(cluster.get().suggested(), suggestedResources)) return true; + if (suggestion.status() == Autoscaling.Status.waiting) return true; + if ( ! shouldUpdateSuggestion(cluster.get().suggested(), suggestion)) return true; // Wait only a short time for the lock to avoid interfering with change deployments try (Mutex lock = nodeRepository().applications().lock(applicationId, Duration.ofSeconds(1))) { - applications().get(applicationId).ifPresent(a -> updateSuggestion(suggestedResources, clusterId, a, lock)); + applications().get(applicationId).ifPresent(a -> updateSuggestion(suggestion, clusterId, a, lock)); return true; } catch (ApplicationLockException e) { @@ -80,21 +75,19 @@ public class ScalingSuggestionsMaintainer extends NodeRepositoryMaintainer { } } - private boolean shouldUpdateSuggestion(Autoscaling currentSuggestion, ClusterResources suggestedResources) { + private boolean shouldUpdateSuggestion(Autoscaling currentSuggestion, Autoscaling newSuggestion) { return currentSuggestion.resources().isEmpty() || currentSuggestion.at().isBefore(nodeRepository().clock().instant().minus(Duration.ofDays(7))) - || isHigher(suggestedResources, currentSuggestion.resources().get()); + || (newSuggestion.resources().isPresent() && isHigher(newSuggestion.resources().get(), currentSuggestion.resources().get())); } - private void updateSuggestion(ClusterResources suggestion, + private void updateSuggestion(Autoscaling autoscaling, ClusterSpec.Id clusterId, Application application, Mutex lock) { Optional cluster = application.cluster(clusterId); if (cluster.isEmpty()) return; - applications().put(application.with(cluster.get().withSuggested(new Autoscaling(suggestion, - AutoscalingStatus.empty(), - nodeRepository().clock().instant()))), lock); + applications().put(application.with(cluster.get().withSuggested(autoscaling)), lock); } private boolean isHigher(ClusterResources r1, ClusterResources r2) { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java index 7842709912f..3733eb69e2e 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializer.java @@ -10,7 +10,6 @@ import com.yahoo.slime.ObjectTraverser; import com.yahoo.slime.Slime; import com.yahoo.slime.SlimeUtils; import com.yahoo.vespa.hosted.provision.applications.Application; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus; import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.applications.ScalingEvent; import com.yahoo.vespa.hosted.provision.applications.Status; @@ -137,8 +136,8 @@ public class ApplicationSerializer { private static void toSlime(Autoscaling autoscaling, Cursor autoscalingObject) { autoscaling.resources().ifPresent(resources -> toSlime(resources, autoscalingObject.setObject(resourcesKey))); autoscalingObject.setLong(atKey, autoscaling.at().toEpochMilli()); - autoscalingObject.setString(statusKey, toAutoscalingStatusCode(autoscaling.status().status())); - autoscalingObject.setString(descriptionKey, autoscaling.status().description()); + autoscalingObject.setString(statusKey, toAutoscalingStatusCode(autoscaling.status())); + autoscalingObject.setString(descriptionKey, autoscaling.description()); } private static void toSlime(ClusterResources resources, Cursor clusterResourcesObject) { @@ -162,20 +161,23 @@ public class ApplicationSerializer { Inspector legacyAutoscalingStatusObject) { if ( ! autoscalingObject.valid()) return Autoscaling.empty(); - if ( ! autoscalingObject.field(atKey).valid()) { // TODO: Remove clause after January 2023 - return new Autoscaling(optionalClusterResourcesFromSlime(autoscalingObject), - autoscalingStatusFromSlime(legacyAutoscalingStatusObject), + if ( ! autoscalingObject.field(atKey).valid()) { // TODO: Remove after January 2023 + return new Autoscaling(fromAutoscalingStatusCode(legacyAutoscalingStatusObject.field(statusKey).asString()), + legacyAutoscalingStatusObject.field(descriptionKey).asString(), + optionalClusterResourcesFromSlime(autoscalingObject), Instant.EPOCH); } - if (legacyAutoscalingStatusObject.valid()) { // TODO: Remove clause after January 2023 - return new Autoscaling(optionalClusterResourcesFromSlime(autoscalingObject.field(resourcesKey)), - autoscalingStatusFromSlime(legacyAutoscalingStatusObject), + if (legacyAutoscalingStatusObject.valid()) { // TODO: Remove after January 2023 + return new Autoscaling(fromAutoscalingStatusCode(legacyAutoscalingStatusObject.field(statusKey).asString()), + legacyAutoscalingStatusObject.field(descriptionKey).asString(), + optionalClusterResourcesFromSlime(autoscalingObject.field(resourcesKey)), Instant.ofEpochMilli(autoscalingObject.field(atKey).asLong())); } - return new Autoscaling(optionalClusterResourcesFromSlime(autoscalingObject.field(resourcesKey)), - autoscalingStatusFromSlime(autoscalingObject), + return new Autoscaling(fromAutoscalingStatusCode(autoscalingObject.field(statusKey).asString()), + autoscalingObject.field(descriptionKey).asString(), + optionalClusterResourcesFromSlime(autoscalingObject.field(resourcesKey)), Instant.ofEpochMilli(autoscalingObject.field(atKey).asLong())); } @@ -203,13 +205,7 @@ public class ApplicationSerializer { optionalInstant(inspector.field(completionKey))); } - private static AutoscalingStatus autoscalingStatusFromSlime(Inspector object) { - if ( ! object.valid()) return AutoscalingStatus.empty(); - return new AutoscalingStatus(fromAutoscalingStatusCode(object.field(statusKey).asString()), - object.field(descriptionKey).asString()); - } - - private static String toAutoscalingStatusCode(AutoscalingStatus.Status status) { + private static String toAutoscalingStatusCode(Autoscaling.Status status) { return switch (status) { case unavailable -> "unavailable"; case waiting -> "waiting"; @@ -219,13 +215,14 @@ public class ApplicationSerializer { }; } - private static AutoscalingStatus.Status fromAutoscalingStatusCode(String code) { + private static Autoscaling.Status fromAutoscalingStatusCode(String code) { return switch (code) { - case "unavailable" -> AutoscalingStatus.Status.unavailable; - case "waiting" -> AutoscalingStatus.Status.waiting; - case "ideal" -> AutoscalingStatus.Status.ideal; - case "insufficient" -> AutoscalingStatus.Status.insufficient; - case "rescaling" -> AutoscalingStatus.Status.rescaling; + case "" -> Autoscaling.Status.unavailable; + case "unavailable" -> Autoscaling.Status.unavailable; + case "waiting" -> Autoscaling.Status.waiting; + case "ideal" -> Autoscaling.Status.ideal; + case "insufficient" -> Autoscaling.Status.insufficient; + case "rescaling" -> Autoscaling.Status.rescaling; default -> throw new IllegalArgumentException("Unknown autoscaling status '" + code + "'"); }; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java index b41796a2203..788dabc0949 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/Activator.java @@ -13,8 +13,8 @@ import com.yahoo.vespa.hosted.provision.NodeList; import com.yahoo.vespa.hosted.provision.NodeMutex; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.applications.Application; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus; import com.yahoo.vespa.hosted.provision.applications.ScalingEvent; +import com.yahoo.vespa.hosted.provision.autoscale.Autoscaling; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.Allocation; @@ -120,8 +120,7 @@ class Activator { } if (cluster.target().resources().isPresent() && cluster.target().resources().get().justNumbers().equals(currentResources.justNumbers())) { - cluster = cluster.withTarget(cluster.target().with(new AutoscalingStatus(AutoscalingStatus.Status.ideal, - "Cluster is ideally scaled within configured limits"))); + cluster = cluster.withTarget(Autoscaling.ideal(nodeRepository.clock().instant())); } if (cluster != modified.cluster(clusterEntry.getKey()).get()) modified = modified.with(cluster); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java index 85277a9cb4e..afec4106388 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/ApplicationSerializer.java @@ -81,8 +81,8 @@ public class ApplicationSerializer { cluster.target().resources().ifPresent(target -> toSlime(target, clusterObject.setObject("target"))); clusterModel.ifPresent(model -> clusterUtilizationToSlime(model, clusterObject.setObject("utilization"))); scalingEventsToSlime(cluster.scalingEvents(), clusterObject.setArray("scalingEvents")); - clusterObject.setString("autoscalingStatusCode", cluster.target().status().status().name()); - clusterObject.setString("autoscalingStatus", cluster.target().status().description()); + clusterObject.setString("autoscalingStatusCode", cluster.target().status().name()); + clusterObject.setString("autoscalingStatus", cluster.target().description()); clusterModel.ifPresent(model -> clusterObject.setLong("scalingDuration", model.scalingDuration().toMillis())); clusterModel.ifPresent(model -> clusterObject.setDouble("maxQueryGrowthRate", model.maxQueryGrowthRate())); clusterModel.ifPresent(model -> clusterObject.setDouble("currentQueryFractionOfMax", model.queryFractionOfMax())); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java index b7d0ab8be26..e53a67bd5d4 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java @@ -28,7 +28,6 @@ import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeMutex; import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.applications.Application; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus; import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.autoscale.Autoscaling; import com.yahoo.vespa.hosted.provision.autoscale.MemoryMetricsDb; @@ -197,13 +196,15 @@ public class MockNodeRepository extends NodeRepository { null), app1Id, provisioner); Application app1 = applications().get(app1Id).get(); Cluster cluster1 = app1.cluster(cluster1Id.id()).get(); - cluster1 = cluster1.withSuggested(new Autoscaling(new ClusterResources(6, 2, + cluster1 = cluster1.withSuggested(new Autoscaling(Autoscaling.Status.unavailable, + "", + new ClusterResources(6, 2, new NodeResources(3, 20, 100, 1)), - AutoscalingStatus.empty(), clock().instant())); - cluster1 = cluster1.withTarget(new Autoscaling(new ClusterResources(4, 1, + cluster1 = cluster1.withTarget(new Autoscaling(Autoscaling.Status.unavailable, + "", + new ClusterResources(4, 1, new NodeResources(3, 16, 100, 1)), - AutoscalingStatus.empty(), clock().instant())); try (Mutex lock = applications().lock(app1Id)) { applications().put(app1.with(cluster1), lock); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java index 60f13cc4b28..077675b4f0d 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/AutoscalingTest.java @@ -12,7 +12,6 @@ import static com.yahoo.config.provision.NodeResources.DiskSpeed.slow; import com.yahoo.config.provision.NodeResources.StorageType; import com.yahoo.config.provision.RegionName; import com.yahoo.config.provision.Zone; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus; import com.yahoo.vespa.hosted.provision.provisioning.CapacityPolicies; import org.junit.Test; @@ -37,7 +36,7 @@ public class AutoscalingTest { fixture.autoscale()); fixture.deploy(Capacity.from(scaledResources)); - assertEquals("Cluster in flux -> No further change", AutoscalingStatus.Status.waiting, fixture.autoscale().status().status()); + assertEquals("Cluster in flux -> No further change", Autoscaling.Status.waiting, fixture.autoscale().status()); fixture.deactivateRetired(Capacity.from(scaledResources)); @@ -360,7 +359,7 @@ public class AutoscalingTest { fixture.tester().clock().advance(Duration.ofDays(1)); fixture.loader().applyCpuLoad(0.25, 120); - assertEquals(AutoscalingStatus.Status.unavailable, fixture.autoscale().status().status()); + assertEquals(Autoscaling.Status.unavailable, fixture.autoscale().status()); } @Test diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java index 5d92635aa21..9c48b3d6d4f 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/ApplicationSerializerTest.java @@ -2,12 +2,10 @@ package com.yahoo.vespa.hosted.provision.persistence; import com.yahoo.config.provision.ApplicationId; -import com.yahoo.config.provision.Capacity; import com.yahoo.config.provision.ClusterResources; import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.NodeResources; import com.yahoo.vespa.hosted.provision.applications.Application; -import com.yahoo.vespa.hosted.provision.applications.AutoscalingStatus; import com.yahoo.vespa.hosted.provision.applications.Cluster; import com.yahoo.vespa.hosted.provision.applications.ScalingEvent; import com.yahoo.vespa.hosted.provision.applications.Status; @@ -45,13 +43,15 @@ public class ApplicationSerializerTest { new ClusterResources( 8, 4, minResources), new ClusterResources(14, 7, new NodeResources(3, 6, 21, 24)), false, - new Autoscaling(new ClusterResources(20, 10, + new Autoscaling(Autoscaling.Status.unavailable, + "", + new ClusterResources(20, 10, new NodeResources(0.5, 4, 14, 16)), - AutoscalingStatus.empty(), Instant.ofEpochMilli(1234L)), - new Autoscaling(new ClusterResources(10, 5, + new Autoscaling(Autoscaling.Status.insufficient, + "Autoscaling status", + new ClusterResources(10, 5, new NodeResources(2, 4, 14, 16)), - new AutoscalingStatus(AutoscalingStatus.Status.insufficient, "Autoscaling status"), Instant.ofEpochMilli(5678L)), List.of(new ScalingEvent(new ClusterResources(10, 5, minResources), new ClusterResources(12, 6, minResources), -- cgit v1.2.3