diff options
author | Martin Polden <mpolden@mpolden.no> | 2022-05-18 15:39:51 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2022-05-18 15:39:51 +0200 |
commit | 550194c7b1f86616971b67bec5cdf662e4d98b9e (patch) | |
tree | 99888f1ecfc2a8bd30100e2429ad971178f6830c | |
parent | 7335f8dcf8fc19453270463f6316ae6e12ec763e (diff) |
Let CapacityPolicies decide exclusivity based on cloud account
3 files changed, 6 insertions, 2 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 91b10121217..00671e14768 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 @@ -117,6 +117,7 @@ public class CapacityPolicies { * A security feature which only makes sense for prod. */ public boolean decideExclusivity(Capacity capacity, boolean requestedExclusivity) { + if (zone.environment() == Environment.prod && capacity.cloudAccount().isPresent()) return true; // Implicit exclusive when using custom cloud account return requestedExclusivity && (capacity.isRequired() || zone.environment() == Environment.prod); } 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 768fa51f029..a26df62be27 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 @@ -193,7 +193,7 @@ class NodeAllocation { // In dynamic provisioned zones, exclusivity is violated if... if (nodeRepository.zone().getCloud().dynamicProvisioning()) { - // If either the parent is dedicated to a cluster type different from this cluster + // If either the parent is dedicated to a cluster type different from this cluster return ! candidate.parent.flatMap(Node::exclusiveToClusterType).map(cluster.type()::equals).orElse(true) || // or this cluster is requiring exclusivity, but the host is exclusive to a different owner (requestedNodes.isExclusive() && !candidate.parent.flatMap(Node::exclusiveToApplicationId).map(application::equals).orElse(false)); diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java index cbd15a979d1..90cd4a440f2 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java @@ -101,9 +101,12 @@ public interface NodeSpec { private CountNodeSpec(int count, NodeResources resources, boolean exclusive, boolean canFail, Optional<CloudAccount> cloudAccount) { this.count = count; this.requestedNodeResources = Objects.requireNonNull(resources, "Resources must be specified"); - this.exclusive = exclusive || cloudAccount.isPresent(); // Implicitly exclusive if using a custom cloud account + this.exclusive = exclusive; this.canFail = canFail; this.cloudAccount = Objects.requireNonNull(cloudAccount); + if (cloudAccount.isPresent() && !exclusive) { + throw new IllegalArgumentException("Node spec with custom cloud account requires exclusive=true"); + } } @Override |