summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@verizonmedia.com>2020-01-17 10:56:27 +0100
committerJon Bratseth <bratseth@verizonmedia.com>2020-01-17 10:56:27 +0100
commitdcc114ba5cbdb622cdc8fb4226c4fcecd9e085e1 (patch)
treedd2bed79db00b1508a45446b8038cc4ad089ce9f /node-repository
parent0d7939b7036d2b0f8960f43edcafe6eff5051f7a (diff)
Temporary quota checking
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java19
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java8
3 files changed, 19 insertions, 10 deletions
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 833ebaf837e..99248848d1a 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
@@ -1,6 +1,7 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.hosted.provision.provisioning;
+import com.yahoo.config.provision.ApplicationId;
import com.yahoo.config.provision.Capacity;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.Environment;
@@ -26,10 +27,12 @@ public class CapacityPolicies {
this.isUsingAdvertisedResources = zone.cloud().value().equals("aws");
}
- public int decideSize(Capacity capacity, ClusterSpec.Type clusterType) {
- int requestedNodes = ensureRedundancy(capacity.nodeCount(), clusterType, capacity.canFail());
+ public int decideSize(Capacity capacity, ClusterSpec.Type clusterType, ApplicationId application) {
+ int requestedNodes = capacity.nodeCount();
- if (this.zone.system().isPublic() && requestedNodes > 5)
+ ensureRedundancy(requestedNodes, clusterType, capacity.canFail());
+
+ if ( ! hasQuota(application, requestedNodes))
throw new IllegalArgumentException(requestedNodes + " exceeds your quota. Please contact Vespa support");
if (capacity.isRequired()) return requestedNodes;
@@ -61,6 +64,13 @@ public class CapacityPolicies {
return resources;
}
+ private boolean hasQuota(ApplicationId application, int requestedNodes) {
+ if ( ! this.zone.system().isPublic()) return true; // no quota management
+
+ if ("yj".equals(application.tenant().value())) return requestedNodes <= 60;
+ return requestedNodes <= 5;
+ }
+
private void ensureSufficientResources(NodeResources resources, ClusterSpec cluster) {
double minMemoryGb = minMemoryGb(cluster.type());
if (resources.memoryGb() >= minMemoryGb) return;
@@ -106,13 +116,12 @@ public class CapacityPolicies {
* @return the argument node count
* @throws IllegalArgumentException if only one node is requested and we can fail
*/
- private int ensureRedundancy(int nodeCount, ClusterSpec.Type clusterType, boolean canFail) {
+ private void ensureRedundancy(int nodeCount, ClusterSpec.Type clusterType, boolean canFail) {
if (canFail &&
nodeCount == 1 &&
requiresRedundancy(clusterType) &&
zone.environment().isProduction())
throw new IllegalArgumentException("Deployments to prod require at least 2 nodes per cluster for redundancy");
- return nodeCount;
}
private static boolean requiresRedundancy(ClusterSpec.Type clusterType) {
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 f7567683776..a24de356244 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
@@ -89,7 +89,7 @@ public class NodeRepositoryProvisioner implements Provisioner {
NodeSpec requestedNodes;
Optional<NodeResources> resources = requestedCapacity.nodeResources();
if ( requestedCapacity.type() == NodeType.tenant) {
- int nodeCount = application.instance().isTester() ? 1 : capacityPolicies.decideSize(requestedCapacity, cluster.type());
+ int nodeCount = application.instance().isTester() ? 1 : capacityPolicies.decideSize(requestedCapacity, cluster.type(), application);
if (zone.environment().isManuallyDeployed() && nodeCount < requestedCapacity.nodeCount())
logger.log(Level.INFO, "Requested " + requestedCapacity.nodeCount() + " nodes for " + cluster +
", downscaling to " + nodeCount + " nodes in " + zone.environment());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java
index e8960849c3e..709db53d512 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java
@@ -675,10 +675,10 @@ public class ProvisioningTest {
allHosts.addAll(content1);
Function<Integer, Capacity> capacity = count -> Capacity.fromCount(count, Optional.empty(), required, true);
- int expectedContainer0Size = tester.capacityPolicies().decideSize(capacity.apply(container0Size), containerCluster0.type());
- int expectedContainer1Size = tester.capacityPolicies().decideSize(capacity.apply(container1Size), containerCluster1.type());
- int expectedContent0Size = tester.capacityPolicies().decideSize(capacity.apply(content0Size), contentCluster0.type());
- int expectedContent1Size = tester.capacityPolicies().decideSize(capacity.apply(content1Size), contentCluster1.type());
+ int expectedContainer0Size = tester.capacityPolicies().decideSize(capacity.apply(container0Size), containerCluster0.type(), application);
+ int expectedContainer1Size = tester.capacityPolicies().decideSize(capacity.apply(container1Size), containerCluster1.type(), application);
+ int expectedContent0Size = tester.capacityPolicies().decideSize(capacity.apply(content0Size), contentCluster0.type(), application);
+ int expectedContent1Size = tester.capacityPolicies().decideSize(capacity.apply(content1Size), contentCluster1.type(), application);
assertEquals("Hosts in each group cluster is disjunct and the total number of unretired nodes is correct",
expectedContainer0Size + expectedContainer1Size + expectedContent0Size + expectedContent1Size,