summaryrefslogtreecommitdiffstats
path: root/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java
diff options
context:
space:
mode:
Diffstat (limited to 'node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java')
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java164
1 files changed, 164 insertions, 0 deletions
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java
new file mode 100644
index 00000000000..896897f45c1
--- /dev/null
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/autoscale/Fixture.java
@@ -0,0 +1,164 @@
+// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.hosted.provision.autoscale;
+
+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.Environment;
+import com.yahoo.config.provision.NodeResources;
+import com.yahoo.config.provision.RegionName;
+import com.yahoo.config.provision.Zone;
+import com.yahoo.vespa.hosted.provision.NodeList;
+import com.yahoo.vespa.hosted.provision.provisioning.HostResourcesCalculator;
+
+import java.time.Duration;
+import java.util.Optional;
+import java.util.function.IntFunction;
+
+/**
+ * Fixture for autoscaling tests.
+ *
+ * @author bratseth
+ */
+public class Fixture {
+
+ final AutoscalingTester tester;
+ final ApplicationId application;
+ final ClusterSpec cluster;
+ final Capacity capacity;
+
+ public Fixture(Fixture.Builder builder, Optional<ClusterResources> initialResources) {
+ application = builder.application;
+ cluster = builder.cluster;
+ capacity = builder.capacity;
+ tester = new AutoscalingTester(builder.zone, builder.hostResources, builder.resourceCalculator);
+ var deployCapacity = initialResources.isPresent() ? Capacity.from(initialResources.get()) : capacity;
+ tester.deploy(builder.application, builder.cluster, deployCapacity);
+ }
+
+ public AutoscalingTester tester() { return tester; }
+
+ /** Autoscale within the deployed capacity of this. */
+ public Autoscaler.Advice autoscale() {
+ return autoscale(capacity);
+ }
+
+ /** Autoscale within the given capacity. */
+ public Autoscaler.Advice autoscale(Capacity capacity) {
+ return tester().autoscale(application, cluster, capacity);
+ }
+
+ /** Redeploy with the deployed capacity of this. */
+ public void deploy() {
+ deploy(capacity);
+ }
+
+ /** Redeploy with the given capacity. */
+ public void deploy(Capacity capacity) {
+ tester().deploy(application, cluster, capacity);
+ }
+
+ /** Returns the nodes allocated to the fixture application cluster */
+ public NodeList nodes() {
+ return tester().nodeRepository().nodes().list().owner(application).cluster(cluster.id());
+ }
+
+ public void deactivateRetired(Capacity capacity) {
+ tester().deactivateRetired(application, cluster, capacity);
+ }
+
+ public void setScalingDuration(Duration duration) {
+ tester().setScalingDuration(application, cluster.id(), duration);
+ }
+
+ public Duration addCpuMeasurements(double cpuLoad, int measurements) {
+ return tester().addCpuMeasurements((float)cpuLoad, 1.0f, measurements, application);
+ }
+
+ public Duration addLoadMeasurements(int measurements, IntFunction<Double> queryRate, IntFunction<Double> writeRate) {
+ return tester().addLoadMeasurements(application, cluster.id(), measurements, queryRate, writeRate);
+ }
+
+ public void applyCpuLoad(double cpuLoad, int measurements) {
+ Duration samplingInterval = Duration.ofSeconds(150L); // in addCpuMeasurements
+ tester().addCpuMeasurements((float)cpuLoad, 1.0f, measurements, application);
+ tester().clock().advance(samplingInterval.negated().multipliedBy(measurements));
+ tester().addQueryRateMeasurements(application, cluster.id(), measurements, samplingInterval, t -> t == 0 ? 20.0 : 10.0); // Query traffic only
+ }
+
+ public void applyMemLoad(double memLoad, int measurements) {
+ Duration samplingInterval = Duration.ofSeconds(150L); // in addCpuMeasurements
+ tester().addMemMeasurements((float)memLoad, 1.0f, measurements, application);
+ tester().clock().advance(samplingInterval.negated().multipliedBy(measurements));
+ tester().addQueryRateMeasurements(application, cluster.id(), measurements, samplingInterval, t -> t == 0 ? 20.0 : 10.0); // Query traffic only
+ }
+
+ public void applyLoad(double cpuLoad, double memoryLoad, double diskLoad, int measurements) {
+ Duration samplingInterval = Duration.ofSeconds(150L); // in addCpuMeasurements
+ tester().addMeasurements((float)cpuLoad, (float)memoryLoad, (float)diskLoad, measurements, application);
+ tester().clock().advance(samplingInterval.negated().multipliedBy(measurements));
+ tester().addQueryRateMeasurements(application, cluster.id(), measurements, samplingInterval, t -> t == 0 ? 20.0 : 10.0); // Query traffic only
+ }
+
+ public void applyLoad(double cpuLoad, double memoryLoad, double diskLoad, int generation, boolean inService, boolean stable, int measurements) {
+ Duration samplingInterval = Duration.ofSeconds(150L); // in addCpuMeasurements
+ tester().addMeasurements((float)cpuLoad, (float)memoryLoad, (float)diskLoad, generation, inService, stable, measurements, application);
+ tester().clock().advance(samplingInterval.negated().multipliedBy(measurements));
+ tester().addQueryRateMeasurements(application, cluster.id(), measurements, samplingInterval, t -> t == 0 ? 20.0 : 10.0); // Query traffic only
+ }
+
+ public void storeReadShare(double currentReadShare, double maxReadShare) {
+ tester().storeReadShare(currentReadShare, maxReadShare, application);
+ }
+
+ public static class Builder {
+
+ NodeResources hostResources = new NodeResources(100, 100, 100, 1);
+ Optional<ClusterResources> initialResources = Optional.of(new ClusterResources(5, 1, new NodeResources(3, 10, 100, 1)));
+ Capacity capacity = Capacity.from(new ClusterResources(2, 1,
+ new NodeResources(1, 1, 1, 1, NodeResources.DiskSpeed.any)),
+ new ClusterResources(20, 1,
+ new NodeResources(100, 1000, 1000, 1, NodeResources.DiskSpeed.any)));
+ ApplicationId application = AutoscalingTester.applicationId("application1");
+ ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("cluster1")).vespaVersion("7").build();
+ Zone zone = new Zone(Environment.prod, RegionName.from("us-east"));
+ HostResourcesCalculator resourceCalculator = new AutoscalingTester.MockHostResourcesCalculator(zone, 0);
+
+ public Fixture.Builder zone(Zone zone) {
+ this.zone = zone;
+ return this;
+ }
+
+ public Fixture.Builder clusterType(ClusterSpec.Type type) {
+ cluster = ClusterSpec.request(type, cluster.id()).vespaVersion("7").build();
+ return this;
+ }
+
+ public Fixture.Builder hostResources(NodeResources hostResources) {
+ this.hostResources = hostResources;
+ return this;
+ }
+
+ public Fixture.Builder initialResources(Optional<ClusterResources> initialResources) {
+ this.initialResources = initialResources;
+ return this;
+ }
+
+ public Fixture.Builder capacity(Capacity capacity) {
+ this.capacity = capacity;
+ return this;
+ }
+
+ public Fixture.Builder resourceCalculator(HostResourcesCalculator resourceCalculator) {
+ this.resourceCalculator = resourceCalculator;
+ return this;
+ }
+
+ public Fixture build() {
+ return new Fixture(this, initialResources);
+ }
+
+ }
+
+}