diff options
author | Jon Bratseth <bratseth@oath.com> | 2019-08-15 13:49:00 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-15 13:49:00 +0200 |
commit | 118e44351bcdf6d6517e4a959efdec9cd8b22728 (patch) | |
tree | 442ebd07270891b1a2c071e99748305e27a63722 /node-repository | |
parent | 92c0a9870987c6b41905e13513912c84ed698f45 (diff) | |
parent | 6c4a0e6d910363e5079cad372d5ac3d103f91b62 (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')
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, |