summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2019-08-15 13:49:00 +0200
committerGitHub <noreply@github.com>2019-08-15 13:49:00 +0200
commit118e44351bcdf6d6517e4a959efdec9cd8b22728 (patch)
tree442ebd07270891b1a2c071e99748305e27a63722 /node-repository
parent92c0a9870987c6b41905e13513912c84ed698f45 (diff)
parent6c4a0e6d910363e5079cad372d5ac3d103f91b62 (diff)
Merge pull request #10293 from vespa-engine/bratseth/remove-allocation-by-flavor-take-2
Revert "Merge pull request #10281 from vespa-engine/revert-10274-brat…
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java3
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/CapacityPolicies.java27
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/FlavorConfigBuilder.java6
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeAllocation.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java18
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeRepositoryProvisioner.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java16
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java7
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirerTest.java11
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java10
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java10
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java2
-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/DynamicDockerAllocationTest.java16
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java96
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTest.java231
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java14
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json2
25 files changed, 97 insertions, 396 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
index 327f37335bf..d83dea7007b 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java
@@ -182,7 +182,7 @@ public final class Node {
/** Returns a copy of this node which is retired */
public Node retire(Instant retiredAt) {
- if (flavor.isRetired() || status.wantToRetire())
+ if (status.wantToRetire())
return retire(Agent.system, retiredAt);
else
return retire(Agent.application, retiredAt);
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java
index 2e17c2d6f67..4ec2bac0159 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeList.java
@@ -49,6 +49,9 @@ public class NodeList implements Iterable<Node> {
/** Returns the subset of nodes having exactly the given resources */
public NodeList resources(NodeResources resources) { return filter(node -> node.flavor().resources().equals(resources)); }
+ /** Returns the subset of nodes not having exactly the given resources */
+ public NodeList notResources(NodeResources resources) { return filter(node -> ! node.flavor().resources().equals(resources)); }
+
/** Returns the subset of nodes of the given flavor */
public NodeList flavor(String flavor) {
return filter(node -> node.flavor().name().equals(flavor));
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 6cee3005e91..64e2df78642 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
@@ -7,7 +7,6 @@ import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.Zone;
-import com.yahoo.config.provision.NodeFlavors;
import com.yahoo.vespa.flags.FlagSource;
import com.yahoo.vespa.flags.Flags;
@@ -22,12 +21,10 @@ import java.util.Optional;
public class CapacityPolicies {
private final Zone zone;
- private final NodeFlavors flavors;
private final FlagSource flagSource;
- public CapacityPolicies(Zone zone, NodeFlavors flavors, FlagSource flagSource) {
+ public CapacityPolicies(Zone zone, FlagSource flagSource) {
this.zone = zone;
- this.flavors = flavors;
this.flagSource = flagSource;
}
@@ -45,9 +42,7 @@ public class CapacityPolicies {
}
public NodeResources decideNodeResources(Optional<NodeResources> requestedResources, ClusterSpec cluster) {
- NodeResources resources = specifiedOrDefaultNodeResources(requestedResources, cluster);
-
- if (resources.allocateByLegacyName()) return resources; // Modification not possible
+ NodeResources resources = requestedResources.orElse(defaultNodeResources(cluster.type()));
// Allow slow disks in zones which are not performance sensitive
if (zone.system().isCd() || zone.environment() == Environment.dev || zone.environment() == Environment.test)
@@ -60,24 +55,6 @@ public class CapacityPolicies {
return resources;
}
- private NodeResources specifiedOrDefaultNodeResources(Optional<NodeResources> requestedResources, ClusterSpec cluster) {
- if (requestedResources.isPresent() && ! requestedResources.get().allocateByLegacyName())
- return requestedResources.get();
-
- if (requestedResources.isEmpty())
- return defaultNodeResources(cluster.type());
-
- switch (zone.environment()) {
- case dev: case test: case staging: return defaultNodeResources(cluster.type());
- default:
- flavors.getFlavorOrThrow(requestedResources.get().legacyName().get()); // verify existence
- // Return this spec containing the legacy flavor name, not the flavor's capacity object
- // which describes the flavors capacity, as the point of legacy allocation is to match
- // by name, not by resources
- return requestedResources.get();
- }
- }
-
private NodeResources defaultNodeResources(ClusterSpec.Type clusterType) {
if (clusterType == ClusterSpec.Type.admin)
return nodeResourcesForAdminCluster();
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 fbf97ba25d9..4d3f2308c03 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
@@ -30,12 +30,6 @@ public class FlavorConfigBuilder {
return flavor;
}
- public void addReplaces(String replaces, FlavorsConfig.Flavor.Builder flavor) {
- FlavorsConfig.Flavor.Replaces.Builder flavorReplaces = new FlavorsConfig.Flavor.Replaces.Builder();
- flavorReplaces.name(replaces);
- flavor.replaces(flavorReplaces);
- }
-
public void addCost(int cost, FlavorsConfig.Flavor.Builder flavor) {
flavor.cost(cost);
}
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 d4527452e9c..8b79a303dbd 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
@@ -111,7 +111,6 @@ class NodeAllocation {
// conditions on which we want to retire nodes that were allocated previously
if ( violatesParentHostPolicy(this.nodes, offered)) wantToRetireNode = true;
if ( ! hasCompatibleFlavor(offered)) wantToRetireNode = true;
- if ( offered.flavor().isRetired()) wantToRetireNode = true;
if ( offered.status().wantToRetire()) wantToRetireNode = true;
if ( requestedNodes.isExclusive() &&
! hostsOnly(application.tenant(), offered.parentHostname())) wantToRetireNode = true;
@@ -133,9 +132,6 @@ class NodeAllocation {
++rejectedDueToExclusivity;
continue;
}
- if (offered.flavor().isRetired()) {
- continue;
- }
if (offered.status().wantToRetire()) {
continue;
}
@@ -287,7 +283,6 @@ class NodeAllocation {
.filter(NodeSpec.CountNodeSpec.class::isInstance)
.map(NodeSpec.CountNodeSpec.class::cast)
.map(spec -> new FlavorCount(spec.resources(), spec.fulfilledDeficitCount(acceptedOfRequestedFlavor)))
- .filter(flavorCount -> ! flavorCount.getFlavor().allocateByLegacyName())
.filter(flavorCount -> flavorCount.getCount() > 0);
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java
index 6b27662448c..f6554b2dede 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java
@@ -215,8 +215,7 @@ class NodePrioritizer {
private PrioritizableNode toNodePriority(Node node, boolean isSurplusNode, boolean isNewNode) {
PrioritizableNode.Builder builder = new PrioritizableNode.Builder(node)
.withSurplusNode(isSurplusNode)
- .withNewNode(isNewNode)
- .withPreferredOnFlavor(preferredOnLegacyFlavor(node));
+ .withNewNode(isNewNode);
allNodes.parentOf(node).ifPresent(parent -> {
builder.withParent(parent).withFreeParentCapacity(capacity.freeCapacityOf(parent, false));
@@ -229,18 +228,6 @@ class NodePrioritizer {
return builder.build();
}
- /** Needed to handle requests for legacy non-docker nodes only */
- private boolean preferredOnLegacyFlavor(Node node) {
- if (requestedNodes instanceof NodeSpec.CountNodeSpec) {
- NodeResources requestedNodeResources = ((NodeSpec.CountNodeSpec)requestedNodes).resources();
- if (requestedNodeResources.allocateByLegacyName()) {
- Flavor requestedFlavor = flavors.getFlavorOrThrow(requestedNodeResources.legacyName().get());
- return ! requestedFlavor.isStock() && node.flavor().equals(requestedFlavor);
- }
- }
- return false;
- }
-
static boolean isPreferredNodeToBeRelocated(List<Node> nodes, Node node, Node parent) {
NodeList list = new NodeList(nodes);
return list.childrenOf(parent).asList().stream()
@@ -261,8 +248,7 @@ class NodePrioritizer {
}
private boolean isDocker() {
- NodeResources flavor = resources(requestedNodes);
- return (flavor != null) && ! flavor.allocateByLegacyName();
+ return resources(requestedNodes) != null;
}
private static int compareForRelocation(Node a, Node b) {
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 1cf5cfbb4f3..29e37b76ac3 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
@@ -57,10 +57,10 @@ public class NodeRepositoryProvisioner implements Provisioner {
}
@Inject
- public NodeRepositoryProvisioner(NodeRepository nodeRepository, NodeFlavors flavors, Zone zone,
+ public NodeRepositoryProvisioner(NodeRepository nodeRepository, Zone zone,
ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource) {
this.nodeRepository = nodeRepository;
- this.capacityPolicies = new CapacityPolicies(zone, flavors, flagSource);
+ this.capacityPolicies = new CapacityPolicies(zone, flagSource);
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/NodeSpec.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeSpec.java
index 66a8f2f8f6d..865b643b93b 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
@@ -92,19 +92,13 @@ public interface NodeSpec {
@Override
public boolean isCompatible(Flavor flavor, NodeFlavors flavors) {
- if (requestedNodeResources.allocateByLegacyName() && flavor.isConfigured()) {
- if (flavor.satisfies(flavors.getFlavorOrThrow(requestedNodeResources.legacyName().get())))
+ if (flavor.isDocker()) { // Docker nodes can satisfy a request for parts of their resources
+ if (flavor.resources().compatibleWith(requestedNodeResources))
return true;
}
- else {
- if (flavor.isDocker()) { // Docker nodes can satisfy a request for parts of their resources
- if (flavor.resources().compatibleWith(requestedNodeResources))
- return true;
- }
- else { // Other nodes must be matched exactly
- if (requestedNodeResources.equals(flavor.resources()))
- return true;
- }
+ else { // Other nodes must be matched exactly
+ if (requestedNodeResources.equals(flavor.resources()))
+ return true;
}
return requestedFlavorCanBeAchievedByResizing(flavor);
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java
index be34e11f585..df817ebb8ad 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java
@@ -145,7 +145,7 @@ class NodesResponse extends HttpResponse {
}
object.setString("openStackId", node.id());
object.setString("flavor", node.flavor().name());
- object.setString("canonicalFlavor", node.flavor().canonicalName());
+ object.setString("canonicalFlavor", node.flavor().name());
object.setDouble("minDiskAvailableGb", node.flavor().getMinDiskAvailableGb());
object.setDouble("minMainMemoryAvailableGb", node.flavor().getMinMainMemoryAvailableGb());
object.setDouble("minCpuCores", node.flavor().getMinCpuCores());
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java
index 0992fbc75ca..a87f5af715c 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeFlavors.java
@@ -24,11 +24,8 @@ public class MockNodeFlavors extends NodeFlavors {
b.addFlavor("docker", 0.2, 0.5, 100, Flavor.Type.DOCKER_CONTAINER);
b.addFlavor("d-2-8-100", 2, 8, 100, Flavor.Type.DOCKER_CONTAINER);
b.addFlavor("v-4-8-100", 4.0, 8.0, 100, Flavor.Type.VIRTUAL_MACHINE);
- FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 64, 128, 2000, Flavor.Type.BARE_METAL);
- b.addReplaces("large", largeVariant);
- FlavorsConfig.Flavor.Builder expensiveFlavor = b.addFlavor("expensive", 6, 12, 500, Flavor.Type.BARE_METAL);
- b.addReplaces("default", expensiveFlavor);
- b.addCost(200, expensiveFlavor);
+ b.addFlavor("large-variant", 64, 128, 2000, Flavor.Type.BARE_METAL);
+ b.addFlavor("expensive", 6, 12, 500, Flavor.Type.BARE_METAL);
return b.build();
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
index a586bfa15c2..3da1d14541e 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/testutils/MockNodeRepository.java
@@ -58,7 +58,6 @@ public class MockNodeRepository extends NodeRepository {
private void populate() {
NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(this,
- flavors,
Zone.defaultZone(),
new MockProvisionServiceProvider(),
new InMemoryFlagSource());
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 6be03e7969a..89c6ed6aa0d 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
@@ -49,8 +49,13 @@ import static org.junit.Assert.assertEquals;
public class FailedExpirerTest {
private static final ApplicationId tenantHostApplicationId = ApplicationId.from("vespa", "zone-app", "default");
- private static final ClusterSpec tenantHostApplicationClusterSpec = ClusterSpec.request(
- ClusterSpec.Type.container, ClusterSpec.Id.from("node-admin"), Version.fromString("6.42"), false);
+
+ private static final ClusterSpec tenantHostApplicationClusterSpec =
+ ClusterSpec.request(ClusterSpec.Type.container,
+ ClusterSpec.Id.from("node-admin"),
+ Version.fromString("6.42"),
+ false);
+
private static final Capacity tenantHostApplicationCapacity = Capacity.fromRequiredNodeType(NodeType.host);
@Test
@@ -275,7 +280,7 @@ public class FailedExpirerTest {
new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-image"),
true);
- this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource());
+ this.provisioner = new NodeRepositoryProvisioner(nodeRepository, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource());
this.expirer = new FailedExpirer(nodeRepository, zone, clock, Duration.ofMinutes(30));
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java
index 4e82bdbfafe..f4b36b12bff 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailTester.java
@@ -76,7 +76,7 @@ public class NodeFailTester {
curator = new MockCurator();
nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone, new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true);
- provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource());
+ provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource());
hostLivenessTracker = new TestHostLivenessTracker(clock);
orchestrator = new OrchestratorMock();
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java
index e1ac0430ee4..95f62521628 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/OperatorChangeApplicationMaintainerTest.java
@@ -58,7 +58,7 @@ public class OperatorChangeApplicationMaintainerTest {
new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"),
true);
- this.fixture = new Fixture(zone, nodeRepository, nodeFlavors);
+ this.fixture = new Fixture(zone, nodeRepository);
createReadyNodes(15, this.fixture.nodeResources, nodeRepository);
createHostNodes(2, nodeRepository, nodeFlavors);
@@ -126,10 +126,12 @@ public class OperatorChangeApplicationMaintainerTest {
final int wantedNodesApp1 = 5;
final int wantedNodesApp2 = 7;
- Fixture(Zone zone, NodeRepository nodeRepository, NodeFlavors flavors) {
+ Fixture(Zone zone, NodeRepository nodeRepository) {
this.nodeRepository = nodeRepository;
- NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(
- nodeRepository, flavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource());
+ NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository,
+ zone,
+ new MockProvisionServiceProvider(),
+ new InMemoryFlagSource());
Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of(
app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.fromCount(wantedNodesApp1, nodeResources), 1),
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
index 211b4a4472f..94e43e4f99e 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/PeriodicApplicationMaintainerTest.java
@@ -64,7 +64,7 @@ public class PeriodicApplicationMaintainerTest {
new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"),
true);
- this.fixture = new Fixture(zone, nodeRepository, nodeFlavors);
+ this.fixture = new Fixture(zone, nodeRepository);
createReadyNodes(15, fixture.nodeResources, nodeRepository);
createHostNodes(2, nodeRepository, nodeFlavors);
@@ -252,10 +252,12 @@ public class PeriodicApplicationMaintainerTest {
private final TestablePeriodicApplicationMaintainer maintainer;
- Fixture(Zone zone, NodeRepository nodeRepository, NodeFlavors flavors) {
+ Fixture(Zone zone, NodeRepository nodeRepository) {
this.nodeRepository = nodeRepository;
- NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(
- nodeRepository, flavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource());
+ NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository,
+ zone,
+ new MockProvisionServiceProvider(),
+ new InMemoryFlagSource());
Map<ApplicationId, MockDeployer.ApplicationContext> apps = Map.of(
app1, new MockDeployer.ApplicationContext(app1, clusterApp1, Capacity.fromCount(wantedNodesApp1, nodeResources), 1),
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java
index f8efb4fdea1..3861e4ff98c 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/ReservationExpirerTest.java
@@ -48,7 +48,7 @@ public class ReservationExpirerTest {
new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"),
true);
- NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, flavors, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource());
+ NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource());
List<Node> nodes = new ArrayList<>(2);
nodes.add(nodeRepository.createNode(UUID.randomUUID().toString(), UUID.randomUUID().toString(), Optional.empty(), new Flavor(new NodeResources(2, 8, 50)), NodeType.tenant));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
index 5d3485ab447..7e471a81cf8 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirerTest.java
@@ -66,7 +66,7 @@ public class RetiredExpirerTest {
private final NodeRepository nodeRepository = new NodeRepository(nodeFlavors, curator, clock, zone,
new MockNameResolver().mockAnyLookup(),
DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true);
- private final NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource());
+ private final NodeRepositoryProvisioner provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource());
private final Orchestrator orchestrator = mock(Orchestrator.class);
private static final Duration RETIRED_EXPIRATION = Duration.ofHours(12);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
index b2966ccb91a..2094a68148e 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
@@ -154,7 +154,7 @@ public class SerializationTest {
Node node = nodeSerializer.fromJson(Node.State.provisioned, Utf8.toBytes(nodeData));
- assertEquals("large", node.flavor().canonicalName());
+ assertEquals("large", node.flavor().name());
assertEquals(1, node.status().reboot().wanted());
assertEquals(2, node.status().reboot().current());
assertEquals(3, node.allocation().get().restartGeneration().wanted());
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 0ecbf389825..eeb90a06951 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
@@ -225,7 +225,7 @@ public class DockerProvisioningTest {
NodeList nodes = tester.getNodes(application1, Node.State.active);
assertEquals(1, nodes.size());
- assertEquals("[vcpu: 1.0, memory: 1.0 Gb, disk 1.0 Gb]", nodes.asList().get(0).flavor().canonicalName());
+ assertEquals("[vcpu: 1.0, memory: 1.0 Gb, disk 1.0 Gb]", nodes.asList().get(0).flavor().name());
}
private Set<String> hostsOf(NodeList nodes) {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
index 1f474a8e07e..d543856f71c 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerAllocationTest.java
@@ -285,22 +285,6 @@ public class DynamicDockerAllocationTest {
}
@Test
- public void legacy_bare_metal_allocations_are_not_altered() {
- ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(SystemName.cd, Environment.prod, RegionName.from("us-east"))).flavorsConfig(flavorsConfig()).build();
- tester.makeReadyNodes(5, "host-large", NodeType.tenant);
- deployZoneApp(tester);
-
- ApplicationId application = tester.makeApplicationId();
- ClusterSpec cluster = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("test"), Version.fromString("1"), false);
- NodeResources resources = NodeResources.fromLegacyName("host-large");
-
- List<HostSpec> hosts = tester.prepare(application, cluster, 2, 1, resources);
- assertEquals(2, hosts.size());
- assertEquals("host-large", hosts.get(0).flavor().get().name());
- tester.activate(application, hosts);
- }
-
- @Test
public void provisioning_fast_disk_speed_do_not_get_slow_nodes() {
provisionFastAndSlowThenDeploy(NodeResources.DiskSpeed.fast, true);
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java
index a5d5fb81147..0523a1f7f72 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/MultigroupProvisioningTest.java
@@ -7,6 +7,7 @@ import com.yahoo.config.provision.Capacity;
import com.yahoo.config.provision.ClusterSpec;
import com.yahoo.config.provision.Environment;
import com.yahoo.config.provision.HostSpec;
+import com.yahoo.config.provision.NodeResources;
import com.yahoo.config.provision.RegionName;
import com.yahoo.config.provision.Zone;
import com.yahoo.vespa.hosted.provision.Node;
@@ -38,25 +39,25 @@ public class MultigroupProvisioningTest {
ApplicationId application1 = tester.makeApplicationId();
- tester.makeReadyNodes(21, "default");
-
- deploy(application1, 6, 1, tester);
- deploy(application1, 6, 2, tester);
- deploy(application1, 6, 3, tester);
- deploy(application1, 6, 6, tester);
- deploy(application1, 6, 1, tester);
- deploy(application1, 6, 6, tester);
- deploy(application1, 6, 6, tester);
- deploy(application1, 6, 2, tester);
- deploy(application1, 8, 2, tester);
- deploy(application1, 9, 3, tester);
- deploy(application1, 9, 3, tester);
- deploy(application1, 9, 3, tester);
- deploy(application1,12, 4, tester);
- deploy(application1, 8, 4, tester);
- deploy(application1,12, 4, tester);
- deploy(application1, 8, 2, tester);
- deploy(application1, 6, 3, tester);
+ tester.makeReadyNodes(21, "d-1-3-9");
+
+ deploy(application1, 6, 1, "d-1-3-9", tester);
+ deploy(application1, 6, 2, "d-1-3-9", tester);
+ deploy(application1, 6, 3, "d-1-3-9", tester);
+ deploy(application1, 6, 6, "d-1-3-9", tester);
+ deploy(application1, 6, 1, "d-1-3-9", tester);
+ deploy(application1, 6, 6, "d-1-3-9", tester);
+ deploy(application1, 6, 6, "d-1-3-9", tester);
+ deploy(application1, 6, 2, "d-1-3-9", tester);
+ deploy(application1, 8, 2, "d-1-3-9", tester);
+ deploy(application1, 9, 3, "d-1-3-9", tester);
+ deploy(application1, 9, 3, "d-1-3-9", tester);
+ deploy(application1, 9, 3, "d-1-3-9", tester);
+ deploy(application1,12, 4, "d-1-3-9", tester);
+ deploy(application1, 8, 4, "d-1-3-9", tester);
+ deploy(application1,12, 4, "d-1-3-9", tester);
+ deploy(application1, 8, 2, "d-1-3-9", tester);
+ deploy(application1, 6, 3, "d-1-3-9", tester);
}
/**
@@ -70,7 +71,7 @@ public class MultigroupProvisioningTest {
ApplicationId application1 = tester.makeApplicationId();
- tester.makeReadyNodes(21, "default");
+ tester.makeReadyNodes(21, "d-1-3-9");
deploy(application1, 12, 2, tester);
deploy(application1, 9, 3, tester);
@@ -83,12 +84,12 @@ public class MultigroupProvisioningTest {
ApplicationId application1 = tester.makeApplicationId();
- tester.makeReadyNodes(10, "small");
- tester.makeReadyNodes(10, "large");
+ tester.makeReadyNodes(10, "d-1-1-1");
+ tester.makeReadyNodes(10, "d-3-3-3");
- deploy(application1, 8, 1, "small", tester);
- deploy(application1, 8, 1, "large", tester);
- deploy(application1, 8, 8, "large", tester);
+ deploy(application1, 8, 1, "d-1-1-1", tester);
+ deploy(application1, 8, 1, "d-3-3-3", tester);
+ deploy(application1, 8, 8, "d-3-3-3", tester);
}
@Test
@@ -97,10 +98,10 @@ public class MultigroupProvisioningTest {
ApplicationId application1 = tester.makeApplicationId();
- tester.makeReadyNodes(10, "small");
+ tester.makeReadyNodes(10, "d-1-1-1");
- deploy(application1, Capacity.fromNodeCount(1, Optional.of("small"), true, true), 1, tester);
- deploy(application1, Capacity.fromNodeCount(2, Optional.of("small"), true, true), 2, tester);
+ deploy(application1, Capacity.fromNodeCount(1, Optional.of("d-1-1-1"), true, true), 1, tester);
+ deploy(application1, Capacity.fromNodeCount(2, Optional.of("d-1-1-1"), true, true), 2, tester);
}
@Test
@@ -109,11 +110,11 @@ public class MultigroupProvisioningTest {
ApplicationId application1 = tester.makeApplicationId();
- tester.makeReadyNodes(10, "small");
- tester.makeReadyNodes(10, "large");
+ tester.makeReadyNodes(10, "d-1-1-1");
+ tester.makeReadyNodes(10, "d-3-3-3");
- deploy(application1, Capacity.fromNodeCount(1, Optional.of("small"), true, true), 1, tester);
- deploy(application1, Capacity.fromNodeCount(2, Optional.of("large"), true, true), 2, tester);
+ deploy(application1, Capacity.fromNodeCount(1, Optional.of("d-1-1-1"), true, true), 1, tester);
+ deploy(application1, Capacity.fromNodeCount(2, Optional.of("d-3-3-3"), true, true), 2, tester);
}
@Test
@@ -122,11 +123,11 @@ public class MultigroupProvisioningTest {
ApplicationId application1 = tester.makeApplicationId();
- tester.makeReadyNodes(10, "small");
- tester.makeReadyNodes(10, "large");
+ tester.makeReadyNodes(10, "d-1-1-1");
+ tester.makeReadyNodes(10, "d-3-3-3");
- deploy(application1, 8, 1, "small", tester);
- deploy(application1, 8, 1, "large", tester);
+ deploy(application1, 8, 1, "d-1-1-1", tester);
+ deploy(application1, 8, 1, "d-3-3-3", tester);
// Expire small nodes
tester.advanceTime(Duration.ofDays(7));
@@ -135,35 +136,36 @@ public class MultigroupProvisioningTest {
tester.clock(),
Collections.singletonMap(application1,
new MockDeployer.ApplicationContext(application1, cluster(),
- Capacity.fromNodeCount(8, Optional.of("large"), false, true), 1)));
+ Capacity.fromNodeCount(8, Optional.of("d-3-3-3"), false, true), 1)));
new RetiredExpirer(tester.nodeRepository(), tester.orchestrator(), deployer, tester.clock(), Duration.ofDays(30),
Duration.ofHours(12)).run();
- assertEquals(8, tester.getNodes(application1, Node.State.inactive).flavor("small").size());
- deploy(application1, 8, 8, "large", tester);
+ assertEquals(8, tester.getNodes(application1, Node.State.inactive).resources(new NodeResources(1, 1, 1)).size());
+ deploy(application1, 8, 8, "d-3-3-3", tester);
}
private void deploy(ApplicationId application, int nodeCount, int groupCount, String flavor, ProvisioningTester tester) {
deploy(application, Capacity.fromNodeCount(nodeCount, Optional.of(flavor), false, true), groupCount, tester);
}
private void deploy(ApplicationId application, int nodeCount, int groupCount, ProvisioningTester tester) {
- deploy(application, Capacity.fromNodeCount(nodeCount, Optional.of("default"), false, true), groupCount, tester);
+ deploy(application, Capacity.fromNodeCount(nodeCount, Optional.of("d-3-3-3"), false, true), groupCount, tester);
}
- @SuppressWarnings("deprecation") // TODO: Remove
private void deploy(ApplicationId application, Capacity capacity, int wantedGroups, ProvisioningTester tester) {
int nodeCount = capacity.nodeCount();
- String flavor = capacity.flavor().get();
+ NodeResources nodeResources = capacity.nodeResources().get();
- int previousActiveNodeCount = tester.getNodes(application, Node.State.active).flavor(flavor).size();
+ int previousActiveNodeCount = tester.getNodes(application, Node.State.active).resources(nodeResources).size();
tester.activate(application, prepare(application, capacity, wantedGroups, tester));
+ System.out.println("Active nodes ---------------");
+ tester.getNodes(application, Node.State.active).forEach(n -> System.out.println(" " + n.hostname() + ": Flavor : " + n.flavor() + " retired " + n.status().wantToRetire()));
assertEquals("Superfluous nodes are retired, but no others - went from " + previousActiveNodeCount + " to " + nodeCount + " nodes",
Math.max(0, previousActiveNodeCount - capacity.nodeCount()),
- tester.getNodes(application, Node.State.active).retired().flavor(flavor).size());
+ tester.getNodes(application, Node.State.active).retired().resources(nodeResources).size());
assertEquals("Other flavors are retired",
- 0, tester.getNodes(application, Node.State.active).nonretired().notFlavor(capacity.flavor().get()).size());
+ 0, tester.getNodes(application, Node.State.active).nonretired().notResources(nodeResources).size());
// Check invariants for all nodes
Set<Integer> allIndexes = new HashSet<>();
@@ -179,7 +181,7 @@ public class MultigroupProvisioningTest {
// Count unretired nodes and groups of the requested flavor
Set<Integer> indexes = new HashSet<>();
Map<ClusterSpec.Group, Integer> nonretiredGroups = new HashMap<>();
- for (Node node : tester.getNodes(application, Node.State.active).nonretired().flavor(flavor)) {
+ for (Node node : tester.getNodes(application, Node.State.active).nonretired().resources(nodeResources)) {
indexes.add(node.allocation().get().membership().index());
ClusterSpec.Group group = node.allocation().get().membership().cluster().group().get();
@@ -194,7 +196,7 @@ public class MultigroupProvisioningTest {
assertEquals("Group size", (long)nodeCount / wantedGroups, (long)groupSize);
Map<ClusterSpec.Group, Integer> allGroups = new HashMap<>();
- for (Node node : tester.getNodes(application, Node.State.active).flavor(flavor)) {
+ for (Node node : tester.getNodes(application, Node.State.active).resources(nodeResources)) {
ClusterSpec.Group group = node.allocation().get().membership().cluster().group().get();
allGroups.put(group, nonretiredGroups.getOrDefault(group, 0) + 1);
}
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 7ad8dbbf7bb..2f97cd13234 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
@@ -290,54 +290,6 @@ public class ProvisioningTest {
}
@Test
- public void application_deployment_multiple_flavors_with_replacement() {
- ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
-
- ApplicationId application1 = tester.makeApplicationId();
-
- tester.makeReadyNodes(8, "large");
- tester.makeReadyNodes(8, "large-variant");
-
- // deploy with flavor which will be fulfilled by some old and new nodes
- SystemState state1 = prepare(application1, 2, 2, 4, 4,
- NodeResources.fromLegacyName("old-large1"), tester);
- tester.activate(application1, state1.allHosts);
-
- // redeploy with increased sizes, this will map to the remaining old/new nodes
- SystemState state2 = prepare(application1, 3, 4, 4, 5,
- NodeResources.fromLegacyName("old-large2"), tester);
- assertEquals("New nodes are reserved", 4, tester.getNodes(application1, Node.State.reserved).size());
- tester.activate(application1, state2.allHosts);
- assertEquals("All nodes are used",
- 16, tester.getNodes(application1, Node.State.active).size());
- assertEquals("No nodes are retired",
- 0, tester.getNodes(application1, Node.State.active).retired().size());
-
- // This is a noop as we are already using large nodes and nodes which replace large
- SystemState state3 = prepare(application1, 3, 4, 4, 5,
- NodeResources.fromLegacyName("large"), tester);
- assertEquals("Noop", 0, tester.getNodes(application1, Node.State.reserved).size());
- tester.activate(application1, state3.allHosts);
-
- try {
- SystemState state4 = prepare(application1, 3, 4, 4, 5,
- NodeResources.fromLegacyName("large-variant"), tester);
- fail("Should fail as we don't have that many large-variant nodes");
- }
- catch (OutOfCapacityException expected) {
- }
-
- // make enough nodes to complete the switch to large-variant
- tester.makeReadyNodes(8, "large-variant");
- SystemState state4 = prepare(application1, 3, 4, 4, 5,
- NodeResources.fromLegacyName("large-variant"), tester);
- assertEquals("New 'large-variant' nodes are reserved", 8, tester.getNodes(application1, Node.State.reserved).size());
- tester.activate(application1, state4.allHosts);
- // (we can not check for the precise state here without carrying over from earlier as the distribution of
- // old and new on different clusters is unknown)
- }
-
- @Test
public void application_deployment_above_then_at_capacity_limit() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
@@ -507,47 +459,6 @@ public class ProvisioningTest {
}
@Test
- public void out_of_desired_flavor() {
- ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
-
- tester.makeReadyNodes(10, "small"); // need 2+2+3+3=10
- tester.makeReadyNodes( 9, "large"); // need 2+2+3+3=10
- ApplicationId application = tester.makeApplicationId();
- try {
- prepare(application, 2, 2, 3, 3,
- NodeResources.fromLegacyName("large"), tester);
- fail("Expected exception");
- }
- catch (OutOfCapacityException e) {
- assertTrue(e.getMessage().startsWith("Could not satisfy request for 3 nodes with flavor 'large'"));
- }
- }
-
- @Test
- public void out_of_capacity_no_replacements_for_retired_flavor() {
- String flavorToRetire = "default";
- String replacementFlavor = "new-default";
-
- FlavorConfigBuilder b = new FlavorConfigBuilder();
- b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2).retired(true);
- FlavorsConfig.Flavor.Builder newDefault = b.addFlavor(replacementFlavor, 2., 2., 20,
- Flavor.Type.BARE_METAL).cost(2);
- b.addReplaces(flavorToRetire, newDefault);
-
- ProvisioningTester tester = new ProvisioningTester.Builder()
- .zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(b.build()).build();
- ApplicationId application = tester.makeApplicationId();
-
- try {
- prepare(application, 2, 0, 2, 0,
- NodeResources.fromLegacyName(flavorToRetire), tester);
- fail("Expected exception");
- } catch (OutOfCapacityException e) {
- assertTrue(e.getMessage().startsWith("Could not satisfy request"));
- }
- }
-
- @Test
public void out_of_capacity_all_nodes_want_to_retire() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
@@ -566,21 +477,6 @@ public class ProvisioningTest {
}
@Test
- public void nonexisting_flavor() {
- ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
-
- ApplicationId application = tester.makeApplicationId();
- try {
- prepare(application, 2, 2, 3, 3,
- NodeResources.fromLegacyName("nonexisting"), tester);
- fail("Expected exception");
- }
- catch (IllegalArgumentException e) {
- assertEquals("Unknown flavor 'nonexisting'. Flavors are [default, dockerLarge, dockerSmall, large, old-large1, old-large2, small, v-4-8-100]", e.getMessage());
- }
- }
-
- @Test
public void highest_node_indexes_are_retired_first() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
@@ -610,96 +506,6 @@ public class ProvisioningTest {
}
@Test
- public void application_deployment_prefers_cheapest_stock_nodes() {
- assertCorrectBareMetalFlavorPreferences(true);
- }
-
- @Test
- public void application_deployment_prefers_exact_nonstock_nodes() {
- assertCorrectBareMetalFlavorPreferences(false);
- }
-
- @Test
- public void application_deployment_retires_nodes_having_retired_flavor() {
- String flavorToRetire = "default";
- String replacementFlavor = "new-default";
- ApplicationId application = ApplicationId.from(
- TenantName.from(UUID.randomUUID().toString()),
- ApplicationName.from(UUID.randomUUID().toString()),
- InstanceName.from(UUID.randomUUID().toString()));
- Curator curator = new MockCurator();
- NameResolver nameResolver = new MockNameResolver().mockAnyLookup();
-
- // Deploy with flavor that will eventually be retired
- {
- FlavorConfigBuilder b = new FlavorConfigBuilder();
- b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2);
-
- ProvisioningTester tester = new ProvisioningTester.Builder()
- .flavorsConfig(b.build()).curator(curator).nameResolver(nameResolver).build();
- tester.makeReadyNodes(4, flavorToRetire);
- SystemState state = prepare(application, 2, 0, 2, 0,
- NodeResources.fromLegacyName(flavorToRetire), tester);
- tester.activate(application, state.allHosts);
- }
-
- // Re-deploy with same flavor, which is now retired
- {
- // Retire "default" flavor and add "new-default" as replacement
- FlavorConfigBuilder b = new FlavorConfigBuilder();
- b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2).retired(true);
- FlavorsConfig.Flavor.Builder newDefault = b.addFlavor(replacementFlavor, 2., 2., 20,
- Flavor.Type.BARE_METAL).cost(2);
- b.addReplaces(flavorToRetire, newDefault);
-
- ProvisioningTester tester = new ProvisioningTester.Builder()
- .flavorsConfig(b.build()).curator(curator).nameResolver(nameResolver).build();
-
- // Add nodes with "new-default" flavor
- tester.makeReadyNodes(4, replacementFlavor);
-
- SystemState state = prepare(application, 2, 0, 2, 0,
- NodeResources.fromLegacyName(flavorToRetire), tester);
-
- tester.activate(application, state.allHosts);
-
- // Nodes with retired flavor are retired
- NodeList retired = tester.getNodes(application).retired();
- assertEquals(4, retired.size());
- assertTrue("Nodes are retired by system", retired.asList().stream().allMatch(retiredBy(Agent.system)));
- }
- }
-
- @Test
- public void application_deployment_is_not_given_unallocated_nodes_having_retired_flavor() {
- String flavorToRetire = "default";
- String replacementFlavor = "new-default";
-
- FlavorConfigBuilder b = new FlavorConfigBuilder();
- b.addFlavor(flavorToRetire, 1., 1., 10, Flavor.Type.BARE_METAL).cost(2).retired(true);
- FlavorsConfig.Flavor.Builder newDefault = b.addFlavor(replacementFlavor, 2., 2., 20,
- Flavor.Type.BARE_METAL).cost(2);
- b.addReplaces(flavorToRetire, newDefault);
-
- ProvisioningTester tester = new ProvisioningTester.Builder()
- .zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(b.build()).build();
- ApplicationId application = tester.makeApplicationId();
-
- // Add nodes
- tester.makeReadyNodes(4, flavorToRetire);
- tester.makeReadyNodes(4, replacementFlavor);
-
- SystemState state = prepare(application, 2, 0, 2, 0,
- NodeResources.fromLegacyName(flavorToRetire), tester);
-
- tester.activate(application, state.allHosts);
-
- List<Node> nodes = tester.getNodes(application).asList();
- assertTrue("Allocated nodes have flavor " + replacementFlavor,
- nodes.stream().allMatch(n -> n.flavor().name().equals(replacementFlavor)));
- }
-
- @Test
public void application_deployment_retires_nodes_that_want_to_retire() {
ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build();
@@ -781,43 +587,6 @@ public class ProvisioningTest {
} catch (IllegalArgumentException ignored) {}
}
- private void assertCorrectBareMetalFlavorPreferences(boolean largeIsStock) {
- FlavorConfigBuilder b = new FlavorConfigBuilder();
- b.addFlavor("large", 4., 8., 100, Flavor.Type.BARE_METAL).cost(10).stock(largeIsStock);
- FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 3., 9., 101, Flavor.Type.BARE_METAL).cost(9);
- b.addReplaces("large", largeVariant);
- FlavorsConfig.Flavor.Builder largeVariantVariant = b.addFlavor("large-variant-variant", 4., 9., 101, Flavor.Type.BARE_METAL).cost(11);
- b.addReplaces("large-variant", largeVariantVariant);
-
- ProvisioningTester tester = new ProvisioningTester.Builder()
- .zone(new Zone(Environment.prod, RegionName.from("us-east"))).flavorsConfig(b.build()).build();
- tester.makeReadyNodes(6, "large"); //cost = 10
- tester.makeReadyNodes(6, "large-variant"); //cost = 9
- tester.makeReadyNodes(6, "large-variant-variant"); //cost = 11
-
- ApplicationId applicationId = tester.makeApplicationId();
- ClusterSpec contentClusterSpec = ClusterSpec.request(ClusterSpec.Type.content, ClusterSpec.Id.from("myContent"), Version.fromString("6.42"), false);
- ClusterSpec containerClusterSpec = ClusterSpec.request(ClusterSpec.Type.container, ClusterSpec.Id.from("myContainer"), Version.fromString("6.42"), false);
-
- List<HostSpec> containerNodes = tester.prepare(applicationId, containerClusterSpec, 5, 1,
- NodeResources.fromLegacyName("large"));
- List<HostSpec> contentNodes = tester.prepare(applicationId, contentClusterSpec, 10, 1,
- NodeResources.fromLegacyName("large"));
-
- if (largeIsStock) { // 'large' is replaced by 'large-variant' when possible, as it is cheaper
- tester.assertNumberOfNodesWithFlavor(containerNodes, "large-variant", 5);
- tester.assertNumberOfNodesWithFlavor(contentNodes, "large-variant", 1);
- tester.assertNumberOfNodesWithFlavor(contentNodes, "large", 6);
- }
- else { // 'large' is preferred when available, as it is what is exactly specified
- tester.assertNumberOfNodesWithFlavor(containerNodes, "large", 5);
- tester.assertNumberOfNodesWithFlavor(contentNodes, "large", 1);
- tester.assertNumberOfNodesWithFlavor(contentNodes, "large-variant", 6);
- }
- // in both cases the most expensive, never exactly specified is least preferred
- tester.assertNumberOfNodesWithFlavor(contentNodes, "large-variant-variant", 3);
- }
-
private SystemState prepare(ApplicationId application, int container0Size, int container1Size, int content0Size,
int content1Size, NodeResources flavor, ProvisioningTester tester) {
return prepare(application, container0Size, container1Size, content0Size, content1Size, flavor,
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 9f0b4faff01..942492bb790 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
@@ -90,8 +90,8 @@ public class ProvisioningTester {
DockerImage.fromString("docker-registry.domain.tld:8080/dist/vespa"), true);
this.orchestrator = orchestrator;
ProvisionServiceProvider provisionServiceProvider = new MockProvisionServiceProvider(loadBalancerService, hostProvisioner);
- this.provisioner = new NodeRepositoryProvisioner(nodeRepository, nodeFlavors, zone, provisionServiceProvider, flagSource);
- this.capacityPolicies = new CapacityPolicies(zone, nodeFlavors, new InMemoryFlagSource());
+ this.provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, provisionServiceProvider, flagSource);
+ this.capacityPolicies = new CapacityPolicies(zone, new InMemoryFlagSource());
this.provisionLogger = new NullProvisionLogger();
this.loadBalancerService = loadBalancerService;
}
@@ -103,15 +103,7 @@ public class ProvisioningTester {
b.addFlavor("dockerSmall", 1., 1., 10, Flavor.Type.DOCKER_CONTAINER).cost(1);
b.addFlavor("dockerLarge", 2., 1., 20, Flavor.Type.DOCKER_CONTAINER).cost(3);
b.addFlavor("v-4-8-100", 4., 8., 100, Flavor.Type.VIRTUAL_MACHINE).cost(4);
- b.addFlavor("old-large1", 2., 4., 100, Flavor.Type.BARE_METAL).cost(6);
- b.addFlavor("old-large2", 2., 5., 100, Flavor.Type.BARE_METAL).cost(14);
- FlavorsConfig.Flavor.Builder large = b.addFlavor("large", 4., 8., 100, Flavor.Type.BARE_METAL).cost(10);
- b.addReplaces("old-large1", large);
- b.addReplaces("old-large2", large);
- FlavorsConfig.Flavor.Builder largeVariant = b.addFlavor("large-variant", 3., 9., 101, Flavor.Type.BARE_METAL).cost(9);
- b.addReplaces("large", largeVariant);
- FlavorsConfig.Flavor.Builder largeVariantVariant = b.addFlavor("large-variant-variant", 4., 9., 101, Flavor.Type.BARE_METAL).cost(11);
- b.addReplaces("large-variant", largeVariantVariant);
+ b.addFlavor("large", 4., 8., 100, Flavor.Type.BARE_METAL).cost(10);
return b.build();
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json
index 561cab22f85..dad1e45c1b8 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/node9.json
@@ -6,7 +6,7 @@
"hostname": "host9.yahoo.com",
"openStackId": "host9.yahoo.com",
"flavor": "large-variant",
- "canonicalFlavor": "large",
+ "canonicalFlavor": "large-variant",
"minDiskAvailableGb": 2000.0,
"minMainMemoryAvailableGb": 128.0,
"minCpuCores": 64.0,
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json
index 28bb960eb14..7d8b48232b5 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/responses/parent2.json
@@ -6,7 +6,7 @@
"hostname": "parent2.yahoo.com",
"openStackId": "parent2.yahoo.com",
"flavor": "large-variant",
- "canonicalFlavor": "large",
+ "canonicalFlavor": "large-variant",
"minDiskAvailableGb": 2000.0,
"minMainMemoryAvailableGb": 128.0,
"minCpuCores": 64.0,