1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
// 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.NodeResources;
import com.yahoo.vespa.hosted.provision.NodeList;
import java.time.Duration;
import java.util.Optional;
/**
* 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.hostResources);
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 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 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 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();
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 build() {
return new Fixture(this, initialResources);
}
}
}
|