diff options
Diffstat (limited to 'node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java')
-rw-r--r-- | node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java | 29 |
1 files changed, 18 insertions, 11 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 a1400626658..8d6c6b4bb62 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 @@ -10,8 +10,10 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.Zone; +import com.yahoo.vespa.flags.JacksonFlag; import com.yahoo.vespa.flags.PermanentFlags; import com.yahoo.vespa.flags.StringFlag; +import com.yahoo.vespa.flags.custom.SharedHost; import com.yahoo.vespa.hosted.provision.NodeRepository; import java.util.Map; import java.util.TreeMap; @@ -28,13 +30,13 @@ import static java.util.Objects.requireNonNull; */ public class CapacityPolicies { - private final NodeRepository nodeRepository; private final Zone zone; + private final JacksonFlag<SharedHost> sharedHosts; private final StringFlag adminClusterNodeArchitecture; public CapacityPolicies(NodeRepository nodeRepository) { - this.nodeRepository = nodeRepository; this.zone = nodeRepository.zone(); + this.sharedHosts = PermanentFlags.SHARED_HOST.bindTo(nodeRepository.flagSource()); this.adminClusterNodeArchitecture = PermanentFlags.ADMIN_CLUSTER_NODE_ARCHITECTURE.bindTo(nodeRepository.flagSource()); } @@ -77,15 +79,16 @@ public class CapacityPolicies { return target; } - public NodeResources defaultNodeResources(ClusterSpec clusterSpec, ApplicationId applicationId) { + public NodeResources defaultNodeResources(ClusterSpec clusterSpec, ApplicationId applicationId, boolean exclusive) { if (clusterSpec.type() == ClusterSpec.Type.admin) { Architecture architecture = adminClusterArchitecture(applicationId); if (clusterSpec.id().value().equals("cluster-controllers")) { - return clusterControllerResources(clusterSpec).with(architecture); + return clusterControllerResources(clusterSpec, exclusive) + .with(architecture); } - return (nodeRepository.exclusiveAllocation(clusterSpec) + return (requiresExclusiveHost(clusterSpec.type(), exclusive) ? versioned(clusterSpec, Map.of(new Version(0), smallestExclusiveResources())) : versioned(clusterSpec, Map.of(new Version(0), smallestSharedResources()))) .with(architecture); @@ -104,8 +107,8 @@ public class CapacityPolicies { } } - private NodeResources clusterControllerResources(ClusterSpec clusterSpec) { - if (nodeRepository.exclusiveAllocation(clusterSpec)) { + private NodeResources clusterControllerResources(ClusterSpec clusterSpec, boolean exclusive) { + if (requiresExclusiveHost(clusterSpec.type(), exclusive)) { return versioned(clusterSpec, Map.of(new Version(0), smallestExclusiveResources())); } return versioned(clusterSpec, Map.of(new Version(0), new NodeResources(0.25, 1.14, 10, 0.3))); @@ -115,6 +118,11 @@ public class CapacityPolicies { return Architecture.valueOf(adminClusterNodeArchitecture.with(APPLICATION_ID, instance.serializedForm()).value()); } + /** Returns whether an exclusive host is required for given cluster type and exclusivity requirement */ + private boolean requiresExclusiveHost(ClusterSpec.Type type, boolean exclusive) { + return ! zone.cloud().allowHostSharing() && (exclusive || !sharedHosts.value().isEnabled(type.name())); + } + /** Returns the resources for the newest version not newer than that requested in the cluster spec. */ static NodeResources versioned(ClusterSpec spec, Map<Version, NodeResources> resources) { return requireNonNull(new TreeMap<>(resources).floorEntry(spec.vespaVersion()), @@ -137,10 +145,9 @@ public class CapacityPolicies { } /** Returns whether the nodes requested can share physical host with other applications */ - public ClusterSpec decideExclusivity(Capacity capacity, ClusterSpec requestedCluster) { - if (capacity.cloudAccount().isPresent()) return requestedCluster.withExclusivity(true); // Implicit exclusive - boolean exclusive = requestedCluster.isExclusive() && (capacity.isRequired() || zone.environment() == Environment.prod); - return requestedCluster.withExclusivity(exclusive); + public boolean decideExclusivity(Capacity capacity, boolean requestedExclusivity) { + if (capacity.cloudAccount().isPresent()) return true; // Implicit exclusive when using custom cloud account + return requestedExclusivity && (capacity.isRequired() || zone.environment() == Environment.prod); } } |