aboutsummaryrefslogtreecommitdiffstats
path: root/controller-api
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@gmail.com>2023-01-02 16:55:03 +0100
committerJon Bratseth <bratseth@gmail.com>2023-01-02 16:55:03 +0100
commit20a6b5041b179a382a90ca37382a0b6ba3f963f7 (patch)
tree08997145ac9497279caacf295b0b09261cdce1de /controller-api
parente5d908c70f1063b05c965e989af1da8c4cb393b1 (diff)
Output load in target/suggested block
Diffstat (limited to 'controller-api')
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java149
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java12
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java44
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java24
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java1
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterUtilizationData.java37
6 files changed, 156 insertions, 111 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java
index d2b1f6a0803..b7a71cc7b91 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Cluster.java
@@ -20,12 +20,9 @@ public class Cluster {
private final ClusterResources min;
private final ClusterResources max;
private final ClusterResources current;
- private final Optional<ClusterResources> target;
- private final Optional<ClusterResources> suggested;
- private final Utilization utilization;
+ private final Autoscaling target;
+ private final Autoscaling suggested;
private final List<ScalingEvent> scalingEvents;
- private final String autoscalingStatusCode;
- private final String autoscalingStatus;
private final Duration scalingDuration;
public Cluster(ClusterSpec.Id id,
@@ -33,12 +30,9 @@ public class Cluster {
ClusterResources min,
ClusterResources max,
ClusterResources current,
- Optional<ClusterResources> target,
- Optional<ClusterResources> suggested,
- Utilization utilization,
+ Autoscaling target,
+ Autoscaling suggested,
List<ScalingEvent> scalingEvents,
- String autoscalingStatusCode,
- String autoscalingStatus,
Duration scalingDuration) {
this.id = id;
this.type = type;
@@ -47,24 +41,26 @@ public class Cluster {
this.current = current;
this.target = target;
this.suggested = suggested;
- this.utilization = utilization;
this.scalingEvents = scalingEvents;
- this.autoscalingStatusCode = autoscalingStatusCode;
- this.autoscalingStatus = autoscalingStatus;
this.scalingDuration = scalingDuration;
}
public ClusterSpec.Id id() { return id; }
+
public ClusterSpec.Type type() { return type; }
+
public ClusterResources min() { return min; }
+
public ClusterResources max() { return max; }
+
public ClusterResources current() { return current; }
- public Optional<ClusterResources> target() { return target; }
- public Optional<ClusterResources> suggested() { return suggested; }
- public Utilization utilization() { return utilization; }
+
+ public Autoscaling target() { return target; }
+
+ public Autoscaling suggested() { return suggested; }
+
public List<ScalingEvent> scalingEvents() { return scalingEvents; }
- public String autoscalingStatusCode() { return autoscalingStatusCode; }
- public String autoscalingStatus() { return autoscalingStatus; }
+
public Duration scalingDuration() { return scalingDuration; }
@Override
@@ -72,40 +68,6 @@ public class Cluster {
return "cluster '" + id + "'";
}
- public static class Utilization {
-
- private final double idealCpu, peakCpu;
- private final double idealMemory, peakMemory;
- private final double idealDisk, peakDisk;
-
- public Utilization(double idealCpu, double peakCpu,
- double idealMemory, double peakMemory,
- double idealDisk, double peakDisk) {
- this.idealCpu = idealCpu;
- this.peakCpu = peakCpu;
-
- this.idealMemory = idealMemory;
- this.peakMemory = peakMemory;
-
- this.idealDisk = idealDisk;
- this.peakDisk = peakDisk;
- }
-
- public double idealCpu() { return idealCpu; }
- public double peakCpu() { return peakCpu; }
-
- public double idealMemory() { return idealMemory; }
- public double peakMemory() { return peakMemory; }
-
- public double idealDisk() { return idealDisk; }
- public double peakDisk() { return peakDisk; }
-
- public static Utilization empty() { return new Utilization(0, 0,
- 0, 0,
- 0, 0); }
-
- }
-
public static class ScalingEvent {
private final ClusterResources from, to;
@@ -119,10 +81,13 @@ public class Cluster {
this.completion = completion;
}
- public ClusterResources from() { return from; }
- public ClusterResources to() { return to; }
- public Instant at() { return at; }
- public Optional<Instant> completion() { return completion; }
+ public ClusterResources from() {return from;}
+
+ public ClusterResources to() {return to;}
+
+ public Instant at() {return at;}
+
+ public Optional<Instant> completion() {return completion;}
@Override
public boolean equals(Object o) {
@@ -140,12 +105,74 @@ public class Cluster {
@Override
public String toString() {
return "ScalingEvent{" +
- "from=" + from +
- ", to=" + to +
- ", at=" + at +
- ", completion=" + completion +
- '}';
+ "from=" + from +
+ ", to=" + to +
+ ", at=" + at +
+ ", completion=" + completion +
+ '}';
}
}
+ public static class Autoscaling {
+
+ private final String status;
+ private final String description;
+ private final Optional<ClusterResources> resources;
+ private final Instant at;
+ private final Load peak;
+ private final Load ideal;
+
+ public Autoscaling(String status, String description, Optional<ClusterResources> resources, Instant at,
+ Load peak, Load ideal) {
+ this.status = status;
+ this.description = description;
+ this.resources = resources;
+ this.at = at;
+ this.peak = peak;
+ this.ideal = ideal;
+ }
+
+ public String status() {return status;}
+ public String description() {return description;}
+ public Optional<ClusterResources> resources() {
+ return resources;
+ }
+ public Instant at() {return at;}
+ public Load peak() {return peak;}
+ public Load ideal() {return ideal;}
+
+ @Override
+ public boolean equals(Object o) {
+ if (!(o instanceof Autoscaling other)) 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;
+ if (!this.peak.equals(other.peak)) return false;
+ if (!this.ideal.equals(other.ideal)) return false;
+ return true;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(status, description, at, peak, ideal);
+ }
+
+ @Override
+ public String toString() {
+ return (resources.isPresent() ? "Autoscaling to " + resources : "Don't autoscale") +
+ (description.isEmpty() ? "" : ": " + description);
+ }
+
+ public static Autoscaling empty() {
+ return new Autoscaling("unavailable",
+ "",
+ Optional.empty(),
+ Instant.EPOCH,
+ Load.zero(),
+ Load.zero());
+ }
+
+ }
+
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java
index 548fac7d11b..f954d0c8392 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/configserver/Load.java
@@ -1,6 +1,8 @@
// 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.configserver;
+import java.util.Objects;
+
/**
* @author bratseth
*/
@@ -20,10 +22,20 @@ public class Load {
public double memory() { return memory; }
public double disk() { return disk; }
+ @Override
public String toString() {
return "load: cpu " + cpu + ", memory " + memory + ", disk " + disk;
}
+ @Override
+ public int hashCode() { return Objects.hash(cpu, memory, disk); }
+
+ @Override
+ public boolean equals(Object o) {
+ if ( ! (o instanceof Load other)) return false;
+ return cpu == other.cpu && memory == other.memory && disk == other.disk;
+ }
+
public static Load zero() { return new Load(0, 0, 0); }
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java
new file mode 100644
index 00000000000..3541799b0d0
--- /dev/null
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/AutoscalingData.java
@@ -0,0 +1,44 @@
+package com.yahoo.vespa.hosted.controller.api.integration.noderepository;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster;
+import com.yahoo.vespa.hosted.controller.api.integration.configserver.Load;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.Optional;
+
+@JsonIgnoreProperties(ignoreUnknown = true)
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class AutoscalingData {
+
+ @JsonProperty("status")
+ public String status;
+
+ @JsonProperty("description")
+ public String description;
+
+ @JsonProperty("resources")
+ public ClusterResourcesData resources;
+
+ @JsonProperty("at")
+ public Long at;
+
+ @JsonProperty("peak")
+ public LoadData peak;
+
+ @JsonProperty("ideal")
+ public LoadData ideal;
+
+ public Cluster.Autoscaling toAutoscaling() {
+ return new Cluster.Autoscaling(status == null ? "" : status,
+ description == null ? "" : description,
+ resources == null ? Optional.empty() : Optional.ofNullable(resources.toClusterResources()),
+ at == null ? Instant.EPOCH : Instant.ofEpochMilli(at),
+ peak == null ? Load.zero() : peak.toLoad(),
+ ideal == null ? Load.zero() : ideal.toLoad());
+ }
+
+}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java
index 574b6149508..539f0545c88 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterData.java
@@ -21,24 +21,25 @@ public class ClusterData {
@JsonProperty("type")
public String type;
+
@JsonProperty("min")
public ClusterResourcesData min;
+
@JsonProperty("max")
public ClusterResourcesData max;
+
@JsonProperty("current")
public ClusterResourcesData current;
+
@JsonProperty("suggested")
- public ClusterResourcesData suggested;
+ public AutoscalingData suggested;
+
@JsonProperty("target")
- public ClusterResourcesData target;
- @JsonProperty("utilization")
- public ClusterUtilizationData utilization;
+ public AutoscalingData target;
+
@JsonProperty("scalingEvents")
public List<ScalingEventData> scalingEvents;
- @JsonProperty("autoscalingStatusCode")
- public String autoscalingStatusCode;
- @JsonProperty("autoscalingStatus")
- public String autoscalingStatus;
+
@JsonProperty("scalingDuration")
public Long scalingDuration;
@@ -48,13 +49,10 @@ public class ClusterData {
min.toClusterResources(),
max.toClusterResources(),
current.toClusterResources(),
- target == null ? Optional.empty() : Optional.of(target.toClusterResources()),
- suggested == null ? Optional.empty() : Optional.of(suggested.toClusterResources()),
- utilization == null ? Cluster.Utilization.empty() : utilization.toClusterUtilization(),
+ target == null ? Cluster.Autoscaling.empty() : target.toAutoscaling(),
+ suggested == null ? Cluster.Autoscaling.empty() : suggested.toAutoscaling(),
scalingEvents == null ? List.of()
: scalingEvents.stream().map(data -> data.toScalingEvent()).toList(),
- autoscalingStatusCode,
- autoscalingStatus,
scalingDuration == null ? Duration.ofMillis(0) : Duration.ofMillis(scalingDuration));
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java
index 801ee4ee853..2a9ab1e3a55 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterResourcesData.java
@@ -23,6 +23,7 @@ public class ClusterResourcesData {
public NodeResources resources;
public ClusterResources toClusterResources() {
+ if (resources == null) return null; // TODO: Compatibility, remove after January 2023
return new ClusterResources(nodes, groups, resources.toNodeResources());
}
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterUtilizationData.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterUtilizationData.java
deleted file mode 100644
index b4fee25d1ad..00000000000
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/ClusterUtilizationData.java
+++ /dev/null
@@ -1,37 +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.controller.api.integration.noderepository;
-
-import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
-import com.fasterxml.jackson.annotation.JsonInclude;
-import com.fasterxml.jackson.annotation.JsonProperty;
-import com.yahoo.vespa.hosted.controller.api.integration.configserver.Cluster;
-
-/**
- * Utilization ratios
- *
- * @author bratseth
- */
-@JsonIgnoreProperties(ignoreUnknown = true)
-@JsonInclude(JsonInclude.Include.NON_NULL)
-public class ClusterUtilizationData {
-
- @JsonProperty("idealCpu")
- public Double idealCpu;
- @JsonProperty("peakCpu")
- public Double peakCpu;
-
- @JsonProperty("idealMemory")
- public Double idealMemory;
- @JsonProperty("peakMemory")
- public Double peakMemory;
-
- @JsonProperty("idealDisk")
- public Double idealDisk;
- @JsonProperty("peakDisk")
- public Double peakDisk;
-
- public Cluster.Utilization toClusterUtilization() {
- return new Cluster.Utilization(idealCpu, peakCpu, idealMemory, peakMemory, idealDisk, peakDisk);
- }
-
-}