aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2020-05-12 15:55:29 +0200
committerGitHub <noreply@github.com>2020-05-12 15:55:29 +0200
commitfeb582188627adb3a2e3ede8c61b3e15cabd1d82 (patch)
tree075585a1d97126982d9122342643081600b77969
parent86cfc2945d4711d47e224a6338372d11abe7e9f3 (diff)
parenta8f42ee3a246c37f9be8254340a959468c352ef2 (diff)
Merge pull request #13226 from vespa-engine/bratseth/ensure-real-resources-within-limits
Bratseth/ensure real resources within limits
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java31
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java10
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java3
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java27
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java40
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java7
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java12
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java12
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java14
12 files changed, 92 insertions, 70 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java
index 0fa04032146..def3b18d14c 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java
@@ -138,7 +138,7 @@ public class AllocatableClusterResources {
Limits limits,
NodeRepository nodeRepository) {
NodeResources cappedNodeResources = limits.cap(resources.nodeResources());
- cappedNodeResources = new NodeResourceLimits(nodeRepository.zone()).enlargeToLegal(cappedNodeResources, clusterType);
+ cappedNodeResources = new NodeResourceLimits(nodeRepository).enlargeToLegal(cappedNodeResources, clusterType);
if (nodeRepository.zone().getCloud().allowHostSharing()) {
// return the requested resources, or empty if they cannot fit on existing hosts
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
index e9e6fd30286..ee46d58ff9f 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java
@@ -8,6 +8,7 @@ import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.Zone;
+import com.yahoo.vespa.hosted.provision.NodeRepository;
import java.util.Locale;
@@ -25,9 +26,9 @@ public class CapacityPolicies {
/* Deployments must match 1-to-1 the advertised resources of a physical host */
private final boolean isUsingAdvertisedResources;
- public CapacityPolicies(Zone zone) {
- this.zone = zone;
- this.nodeResourceLimits = new NodeResourceLimits(zone);
+ public CapacityPolicies(NodeRepository nodeRepository) {
+ this.zone = nodeRepository.zone();
+ this.nodeResourceLimits = new NodeResourceLimits(nodeRepository);
this.isUsingAdvertisedResources = zone.getCloud().dynamicProvisioning();
}
@@ -45,31 +46,23 @@ public class CapacityPolicies {
}
}
- public NodeResources decideNodeResources(NodeResources requested, Capacity capacity, ClusterSpec cluster) {
- if (requested.isUnspecified())
- requested = defaultNodeResources(cluster.type());
- ensureSufficientResources(requested, cluster);
+ public NodeResources decideNodeResources(NodeResources target, Capacity capacity, ClusterSpec cluster) {
+ if (target.isUnspecified())
+ target = defaultNodeResources(cluster.type());
+ nodeResourceLimits.ensureWithinAdvertisedLimits(target, cluster);
- if (capacity.isRequired()) return requested;
+ if (capacity.isRequired()) return target;
// Allow slow storage in zones which are not performance sensitive
if (zone.system().isCd() || zone.environment() == Environment.dev || zone.environment() == Environment.test)
- requested = requested.with(NodeResources.DiskSpeed.any).with(NodeResources.StorageType.any);
+ target = target.with(NodeResources.DiskSpeed.any).with(NodeResources.StorageType.any);
// Dev does not cap the cpu of containers since usage is spotty: Allocate just a small amount exclusively
// Do not cap in AWS as hosts are allocated on demand and 1-to-1, so the node can use the entire host
if (zone.environment() == Environment.dev && !zone.region().value().contains("aws-"))
- requested = requested.withVcpu(0.1);
-
- return requested;
- }
+ target = target.withVcpu(0.1);
- private void ensureSufficientResources(NodeResources resources, ClusterSpec cluster) {
- double minMemoryGb = nodeResourceLimits.minMemoryGb(cluster.type());
- if (resources.memoryGb() >= minMemoryGb) return;
- throw new IllegalArgumentException(String.format(Locale.ENGLISH,
- "Must specify at least %.2f Gb of memory for %s cluster '%s', was: %.2f Gb",
- minMemoryGb, cluster.type().name(), cluster.id().value(), resources.memoryGb()));
+ return target;
}
private NodeResources defaultNodeResources(ClusterSpec.Type clusterType) {
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java
index 78f851fbc9e..7a87dabeed2 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java
@@ -47,15 +47,15 @@ public class FlavorConfigBuilder {
FlavorConfigBuilder flavorConfigBuilder = new FlavorConfigBuilder();
for (String flavorName : flavors) {
if (flavorName.equals("docker"))
- flavorConfigBuilder.addFlavor(flavorName, 1., 3., 2., 1.5, Flavor.Type.DOCKER_CONTAINER);
+ flavorConfigBuilder.addFlavor(flavorName, 1., 30., 2., 1.5, Flavor.Type.DOCKER_CONTAINER);
else if (flavorName.equals("docker2"))
- flavorConfigBuilder.addFlavor(flavorName, 2., 4., 4., 0.5, Flavor.Type.DOCKER_CONTAINER);
+ flavorConfigBuilder.addFlavor(flavorName, 2., 40., 4., 0.5, Flavor.Type.DOCKER_CONTAINER);
else if (flavorName.equals("host"))
- flavorConfigBuilder.addFlavor(flavorName, 7., 10., 12., 5, Flavor.Type.BARE_METAL);
+ flavorConfigBuilder.addFlavor(flavorName, 7., 100., 12., 5, Flavor.Type.BARE_METAL);
else if (flavorName.equals("devhost"))
- flavorConfigBuilder.addFlavor(flavorName, 4., 8., 10, 10, Flavor.Type.BARE_METAL);
+ flavorConfigBuilder.addFlavor(flavorName, 4., 80., 10, 10, Flavor.Type.BARE_METAL);
else
- flavorConfigBuilder.addFlavor(flavorName, 1., 3., 2., 3, Flavor.Type.BARE_METAL);
+ flavorConfigBuilder.addFlavor(flavorName, 1., 30., 2., 3, Flavor.Type.BARE_METAL);
}
return new NodeFlavors(flavorConfigBuilder.build());
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java
index f8774073ce8..698f40c2b24 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java
@@ -83,8 +83,7 @@ public class GroupPreparer {
prioritizer.addNewDockerNodes(nodeRepository::canAllocateTenantNodeTo);
// Allocate from the prioritized list
NodeAllocation allocation = new NodeAllocation(nodeList, application, cluster, requestedNodes,
- highestIndex, nodeRepository.flavors(),
- nodeRepository.zone(), nodeRepository.clock());
+ highestIndex, nodeRepository);
allocation.offer(prioritizer.prioritize());
if (dynamicProvisioningEnabled) {
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java
index 71e8259665b..8e2d3c64390 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java
@@ -14,6 +14,7 @@ import com.yahoo.config.provision.Zone;
import com.yahoo.lang.MutableInteger;
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.node.Agent;
import com.yahoo.vespa.hosted.provision.node.Allocation;
@@ -74,20 +75,18 @@ class NodeAllocation {
/** The next membership index to assign to a new node */
private final MutableInteger highestIndex;
- private final NodeFlavors flavors;
- private final Zone zone;
- private final Clock clock;
+ private final NodeRepository nodeRepository;
+ private final NodeResourceLimits nodeResourceLimits;
NodeAllocation(NodeList allNodes, ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes,
- MutableInteger highestIndex, NodeFlavors flavors, Zone zone, Clock clock) {
+ MutableInteger highestIndex, NodeRepository nodeRepository) {
this.allNodes = allNodes;
this.application = application;
this.cluster = cluster;
this.requestedNodes = requestedNodes;
this.highestIndex = highestIndex;
- this.flavors = flavors;
- this.zone = zone;
- this.clock = clock;
+ this.nodeRepository = nodeRepository;
+ nodeResourceLimits = new NodeResourceLimits(nodeRepository);
}
/**
@@ -104,6 +103,8 @@ class NodeAllocation {
List<Node> accepted = new ArrayList<>();
for (PrioritizableNode node : nodesPrioritized) {
Node offered = node.node;
+ if ( ! nodeResourceLimits.isWithinRealLimits(offered, cluster)) continue;
+
if (offered.allocation().isPresent()) {
ClusterMembership membership = offered.allocation().get().membership();
if ( ! offered.allocation().get().owner().equals(application)) continue; // wrong application
@@ -145,7 +146,7 @@ class NodeAllocation {
node.node = offered.allocate(application,
ClusterMembership.from(cluster, highestIndex.add(1)),
requestedNodes.resources().orElse(node.node.flavor().resources()),
- clock.instant());
+ nodeRepository.clock().instant());
accepted.add(acceptNode(node, false, false));
}
}
@@ -159,7 +160,9 @@ class NodeAllocation {
}
private boolean checkForClashingParentHost() {
- return zone.system() == SystemName.main && zone.environment().isProduction() && ! application.instance().isTester();
+ return nodeRepository.zone().system() == SystemName.main &&
+ nodeRepository.zone().environment().isProduction() &&
+ ! application.instance().isTester();
}
private boolean offeredNodeHasParentHostnameAlreadyAccepted(Collection<PrioritizableNode> accepted, Node offered) {
@@ -229,7 +232,7 @@ class NodeAllocation {
}
private boolean hasCompatibleFlavor(PrioritizableNode node) {
- return requestedNodes.isCompatible(node.node.flavor(), flavors) || node.isResizable;
+ return requestedNodes.isCompatible(node.node.flavor(), nodeRepository.flavors()) || node.isResizable;
}
private Node acceptNode(PrioritizableNode prioritizableNode, boolean wantToRetire, boolean resizeable) {
@@ -255,7 +258,7 @@ class NodeAllocation {
} else {
++wasRetiredJustNow;
// Retire nodes which are of an unwanted flavor, retired flavor or have an overlapping parent host
- node = node.retire(clock.instant());
+ node = node.retire(nodeRepository.clock().instant());
}
if ( ! node.allocation().get().membership().cluster().equals(cluster)) {
// group may be different
@@ -332,7 +335,7 @@ class NodeAllocation {
if (deltaRetiredCount > 0) { // retire until deltaRetiredCount is 0, prefer to retire higher indexes to minimize redistribution
for (PrioritizableNode node : byDecreasingIndex(nodes)) {
if ( ! node.node.allocation().get().membership().retired() && node.node.state() == Node.State.active) {
- node.node = node.node.retire(Agent.application, clock.instant());
+ node.node = node.node.retire(Agent.application, nodeRepository.clock().instant());
surplusNodes.add(node.node); // offer this node to other groups
if (--deltaRetiredCount == 0) break;
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
index df35cabab36..28002463586 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java
@@ -66,7 +66,7 @@ public class NodeRepositoryProvisioner implements Provisioner {
ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource) {
this.nodeRepository = nodeRepository;
this.allocationOptimizer = new AllocationOptimizer(nodeRepository);
- this.capacityPolicies = new CapacityPolicies(zone);
+ this.capacityPolicies = new CapacityPolicies(nodeRepository);
this.zone = zone;
this.loadBalancerProvisioner = provisionServiceProvider.getLoadBalancerService().map(lbService -> new LoadBalancerProvisioner(nodeRepository, lbService));
this.preparer = new Preparer(nodeRepository,
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java
index ca04bf66ce3..b71cc396c0e 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java
@@ -5,6 +5,10 @@ import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.SystemName;
import com.yahoo.config.provision.Zone;
+import com.yahoo.vespa.hosted.provision.Node;
+import com.yahoo.vespa.hosted.provision.NodeRepository;
+
+import java.util.Locale;
/**
* Defines the resource limits for nodes in various zones
@@ -13,20 +17,42 @@ import com.yahoo.config.provision.Zone;
*/
public class NodeResourceLimits {
- private final Zone zone;
+ private final NodeRepository nodeRepository;
+
+ public NodeResourceLimits(NodeRepository nodeRepository) {
+ this.nodeRepository = nodeRepository;
+ }
+
+ /** Validates the resources applications ask for */
+ public void ensureWithinAdvertisedLimits(NodeResources advertisedResources, ClusterSpec cluster) {
+ double minMemoryGb = minAdvertisedMemoryGb(cluster.type());
+ if (advertisedResources.memoryGb() >= minMemoryGb) return;
+ throw new IllegalArgumentException(String.format(Locale.ENGLISH,
+ "Must specify at least %.2f Gb of memory for %s cluster '%s', was: %.2f Gb",
+ minMemoryGb, cluster.type().name(), cluster.id().value(), advertisedResources.memoryGb()));
+ }
+
+ /** Returns whether the real resources we'll end up with on a given tenant node are within limits */
+ public boolean isWithinRealLimits(Node candidateTenantNode, ClusterSpec cluster) {
+ NodeResources realResources = nodeRepository.resourcesCalculator().realResourcesOf(candidateTenantNode, nodeRepository);
+
+ if (realResources.memoryGb() < minRealMemoryGb(cluster.type())) return false;
+
+ return true;
+ }
- public NodeResourceLimits(Zone zone) {
- this.zone = zone;
+ public NodeResources enlargeToLegal(NodeResources advertisedResources, ClusterSpec.Type clusterType) {
+ return advertisedResources.withMemoryGb(Math.max(minAdvertisedMemoryGb(clusterType), advertisedResources.memoryGb()));
}
- public int minMemoryGb(ClusterSpec.Type clusterType) {
- if (zone.system() == SystemName.dev) return 1; // Allow small containers in dev system
+ private double minAdvertisedMemoryGb(ClusterSpec.Type clusterType) {
+ if (nodeRepository.zone().system() == SystemName.dev) return 1; // Allow small containers in dev system
if (clusterType == ClusterSpec.Type.admin) return 2;
return 4;
}
- public NodeResources enlargeToLegal(NodeResources resources, ClusterSpec.Type clusterType) {
- return resources.withMemoryGb(Math.max(minMemoryGb(clusterType), resources.memoryGb()));
+ private double minRealMemoryGb(ClusterSpec.Type clusterType) {
+ return minAdvertisedMemoryGb(clusterType) - 0.7;
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java
index 575d84c0129..4fb1c3bcab2 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java
@@ -259,7 +259,7 @@ public class FailedExpirerTest {
new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-image"),
true);
- this.provisioner = new NodeRepositoryProvisioner(nodeRepository, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource());
+ this.provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource());
this.expirer = new FailedExpirer(nodeRepository, zone, clock, Duration.ofMinutes(30));
}
@@ -328,12 +328,13 @@ public class FailedExpirerTest {
public FailureScenario allocate(ClusterSpec.Type clusterType, NodeResources flavor, String... hostname) {
ClusterSpec clusterSpec = ClusterSpec.request(clusterType, ClusterSpec.Id.from("test")).vespaVersion("6.42").build();
- Capacity capacity = Capacity.from(new ClusterResources(hostname.length, 1, flavor), false, true);
+ Capacity capacity = Capacity.from(new ClusterResources(hostname.length, 1, flavor), true, true);
return allocate(applicationId, clusterSpec, capacity);
}
public FailureScenario allocate(ApplicationId applicationId, ClusterSpec clusterSpec, Capacity capacity) {
- List<HostSpec> preparedNodes = provisioner.prepare(applicationId, clusterSpec, capacity, null);
+ List<HostSpec> preparedNodes = provisioner.prepare(applicationId, clusterSpec, capacity,
+ (level, message) -> System.out.println(level + ": " + message) );
NestedTransaction transaction = new NestedTransaction().add(new CuratorTransaction(curator));
provisioner.activate(transaction, applicationId, Set.copyOf(preparedNodes));
transaction.commit();
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
index 6dfb404d81a..f8b97ed9618 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java
@@ -193,13 +193,13 @@ public class MetricsReporterTest {
assertEquals(0, metric.values.get("hostedVespa.readyHosts")); // Only tenants counts
assertEquals(2, metric.values.get("hostedVespa.reservedHosts"));
- assertEquals(12.0, metric.values.get("hostedVespa.docker.totalCapacityDisk"));
- assertEquals(10.0, metric.values.get("hostedVespa.docker.totalCapacityMem"));
- assertEquals(7.0, metric.values.get("hostedVespa.docker.totalCapacityCpu"));
+ assertEquals( 12.0, metric.values.get("hostedVespa.docker.totalCapacityDisk"));
+ assertEquals(100.0, metric.values.get("hostedVespa.docker.totalCapacityMem"));
+ assertEquals( 7.0, metric.values.get("hostedVespa.docker.totalCapacityCpu"));
- assertEquals(6.0, metric.values.get("hostedVespa.docker.freeCapacityDisk"));
- assertEquals(3.0, metric.values.get("hostedVespa.docker.freeCapacityMem"));
- assertEquals(4.0, metric.values.get("hostedVespa.docker.freeCapacityCpu"));
+ assertEquals( 6.0, metric.values.get("hostedVespa.docker.freeCapacityDisk"));
+ assertEquals(93.0, metric.values.get("hostedVespa.docker.freeCapacityMem"));
+ assertEquals( 4.0, metric.values.get("hostedVespa.docker.freeCapacityCpu"));
Metric.Context app1context = metric.createContext(Map.of("app", "test.default", "tenantName", "app1", "applicationId", "app1.test.default"));
assertEquals(2.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityDisk", app1context), 0.01d);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java
index b3cda5bb3df..eac2d8b9bcb 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java
@@ -33,8 +33,8 @@ public class DockerHostCapacityTest {
private DockerHostCapacity capacity;
private List<Node> nodes;
private Node host1, host2, host3;
- private final NodeResources resources1 = new NodeResources(1, 3, 2, 1.5);
- private final NodeResources resources2 = new NodeResources(2, 4, 4, 0.5);
+ private final NodeResources resources1 = new NodeResources(1, 30, 2, 1.5);
+ private final NodeResources resources2 = new NodeResources(2, 40, 4, 0.5);
@Before
public void setup() {
@@ -90,9 +90,9 @@ public class DockerHostCapacityTest {
@Test
public void freeCapacityOf() {
- assertEquals(new NodeResources(5, 4, 8, 2, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
+ assertEquals(new NodeResources(5, 40, 8, 2, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
capacity.freeCapacityOf(host1, false));
- assertEquals(new NodeResources(5, 6, 8, 4.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
+ assertEquals(new NodeResources(5, 60, 8, 4.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
capacity.freeCapacityOf(host3, false));
doAnswer(invocation -> {
@@ -100,9 +100,9 @@ public class DockerHostCapacityTest {
return totalHostResources.subtract(new NodeResources(1, 2, 3, 0.5, NodeResources.DiskSpeed.any));
}).when(hostResourcesCalculator).advertisedResourcesOf(any());
- assertEquals(new NodeResources(4, 2, 5, 1.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
+ assertEquals(new NodeResources(4, 38, 5, 1.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
capacity.freeCapacityOf(host1, false));
- assertEquals(new NodeResources(4, 4, 5, 4, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
+ assertEquals(new NodeResources(4, 58, 5, 4, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote),
capacity.freeCapacityOf(host3, false));
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java
index 5079fce4418..271999452bb 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerProvisioningTest.java
@@ -78,7 +78,7 @@ public class DockerProvisioningTest {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
ApplicationId zoneApplication = tester.makeApplicationId();
- List<Node> parents = tester.makeReadyNodes(10, new NodeResources(2, 2, 2, 2), NodeType.host, 1);
+ List<Node> parents = tester.makeReadyNodes(10, new NodeResources(2, 4, 2, 2), NodeType.host, 1);
for (Node parent : parents)
tester.makeReadyVirtualDockerNodes(1, dockerFlavor, parent.hostname());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
index 806a9984da3..f7fa3b29b67 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java
@@ -105,19 +105,19 @@ public class ProvisioningTester {
this.orchestrator = orchestrator;
ProvisionServiceProvider provisionServiceProvider = new MockProvisionServiceProvider(loadBalancerService, hostProvisioner);
this.provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, provisionServiceProvider, flagSource);
- this.capacityPolicies = new CapacityPolicies(zone);
+ this.capacityPolicies = new CapacityPolicies(nodeRepository);
this.provisionLogger = new NullProvisionLogger();
this.loadBalancerService = loadBalancerService;
}
public static FlavorsConfig createConfig() {
FlavorConfigBuilder b = new FlavorConfigBuilder();
- b.addFlavor("default", 2., 4., 100, 10, Flavor.Type.BARE_METAL).cost(3);
- b.addFlavor("small", 1., 2., 50, 5, Flavor.Type.BARE_METAL).cost(2);
- b.addFlavor("dockerSmall", 1., 1., 10, 1, Flavor.Type.DOCKER_CONTAINER).cost(1);
- b.addFlavor("dockerLarge", 2., 1., 20, 1, Flavor.Type.DOCKER_CONTAINER).cost(3);
- b.addFlavor("v-4-8-100", 4., 8., 100, 10, Flavor.Type.VIRTUAL_MACHINE).cost(4);
- b.addFlavor("large", 4., 8., 100, 10, Flavor.Type.BARE_METAL).cost(10);
+ b.addFlavor("default", 2., 40., 100, 10, Flavor.Type.BARE_METAL).cost(3);
+ b.addFlavor("small", 1., 20., 50, 5, Flavor.Type.BARE_METAL).cost(2);
+ b.addFlavor("dockerSmall", 1., 10., 10, 1, Flavor.Type.DOCKER_CONTAINER).cost(1);
+ b.addFlavor("dockerLarge", 2., 10., 20, 1, Flavor.Type.DOCKER_CONTAINER).cost(3);
+ b.addFlavor("v-4-8-100", 4., 80., 100, 10, Flavor.Type.VIRTUAL_MACHINE).cost(4);
+ b.addFlavor("large", 4., 80., 100, 10, Flavor.Type.BARE_METAL).cost(10);
return b.build();
}