diff options
13 files changed, 94 insertions, 71 deletions
diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java index 18dc0b217a3..bbfa8eba593 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeResources.java @@ -1,6 +1,7 @@ // Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.provision; +import java.util.Locale; import java.util.Objects; /** @@ -214,7 +215,7 @@ public class NodeResources { @Override public String toString() { - return String.format("[vcpu: %1$.1f, memory: %2$.1f Gb, disk %3$.1f Gb" + + return String.format(Locale.ENGLISH, "[vcpu: %1$.1f, memory: %2$.1f Gb, disk %3$.1f Gb" + (bandwidthGbps > 0 ? ", bandwidth: %4$.1f Gbps" : "") + ( ! diskSpeed.isDefault() ? ", disk speed: " + diskSpeed : "") + ( ! storageType.isDefault() ? ", storage type: " + storageType : "") + "]", diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java index 0fa04032146..def3b18d14c 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/autoscale/AllocatableClusterResources.java @@ -138,7 +138,7 @@ public class AllocatableClusterResources { Limits limits, NodeRepository nodeRepository) { NodeResources cappedNodeResources = limits.cap(resources.nodeResources()); - cappedNodeResources = new NodeResourceLimits(nodeRepository.zone()).enlargeToLegal(cappedNodeResources, clusterType); + cappedNodeResources = new NodeResourceLimits(nodeRepository).enlargeToLegal(cappedNodeResources, clusterType); if (nodeRepository.zone().getCloud().allowHostSharing()) { // return the requested resources, or empty if they cannot fit on existing hosts 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 e9e6fd30286..ee46d58ff9f 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 @@ -8,6 +8,7 @@ import com.yahoo.config.provision.Environment; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; +import com.yahoo.vespa.hosted.provision.NodeRepository; import java.util.Locale; @@ -25,9 +26,9 @@ public class CapacityPolicies { /* Deployments must match 1-to-1 the advertised resources of a physical host */ private final boolean isUsingAdvertisedResources; - public CapacityPolicies(Zone zone) { - this.zone = zone; - this.nodeResourceLimits = new NodeResourceLimits(zone); + public CapacityPolicies(NodeRepository nodeRepository) { + this.zone = nodeRepository.zone(); + this.nodeResourceLimits = new NodeResourceLimits(nodeRepository); this.isUsingAdvertisedResources = zone.getCloud().dynamicProvisioning(); } @@ -45,31 +46,23 @@ public class CapacityPolicies { } } - public NodeResources decideNodeResources(NodeResources requested, Capacity capacity, ClusterSpec cluster) { - if (requested.isUnspecified()) - requested = defaultNodeResources(cluster.type()); - ensureSufficientResources(requested, cluster); + public NodeResources decideNodeResources(NodeResources target, Capacity capacity, ClusterSpec cluster) { + if (target.isUnspecified()) + target = defaultNodeResources(cluster.type()); + nodeResourceLimits.ensureWithinAdvertisedLimits(target, cluster); - if (capacity.isRequired()) return requested; + if (capacity.isRequired()) return target; // Allow slow storage in zones which are not performance sensitive if (zone.system().isCd() || zone.environment() == Environment.dev || zone.environment() == Environment.test) - requested = requested.with(NodeResources.DiskSpeed.any).with(NodeResources.StorageType.any); + target = target.with(NodeResources.DiskSpeed.any).with(NodeResources.StorageType.any); // Dev does not cap the cpu of containers since usage is spotty: Allocate just a small amount exclusively // Do not cap in AWS as hosts are allocated on demand and 1-to-1, so the node can use the entire host if (zone.environment() == Environment.dev && !zone.region().value().contains("aws-")) - requested = requested.withVcpu(0.1); - - return requested; - } + target = target.withVcpu(0.1); - private void ensureSufficientResources(NodeResources resources, ClusterSpec cluster) { - double minMemoryGb = nodeResourceLimits.minMemoryGb(cluster.type()); - if (resources.memoryGb() >= minMemoryGb) return; - throw new IllegalArgumentException(String.format(Locale.ENGLISH, - "Must specify at least %.2f Gb of memory for %s cluster '%s', was: %.2f Gb", - minMemoryGb, cluster.type().name(), cluster.id().value(), resources.memoryGb())); + return target; } private NodeResources defaultNodeResources(ClusterSpec.Type clusterType) { 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 78f851fbc9e..7a87dabeed2 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 @@ -47,15 +47,15 @@ public class FlavorConfigBuilder { FlavorConfigBuilder flavorConfigBuilder = new FlavorConfigBuilder(); for (String flavorName : flavors) { if (flavorName.equals("docker")) - flavorConfigBuilder.addFlavor(flavorName, 1., 3., 2., 1.5, Flavor.Type.DOCKER_CONTAINER); + flavorConfigBuilder.addFlavor(flavorName, 1., 30., 2., 1.5, Flavor.Type.DOCKER_CONTAINER); else if (flavorName.equals("docker2")) - flavorConfigBuilder.addFlavor(flavorName, 2., 4., 4., 0.5, Flavor.Type.DOCKER_CONTAINER); + flavorConfigBuilder.addFlavor(flavorName, 2., 40., 4., 0.5, Flavor.Type.DOCKER_CONTAINER); else if (flavorName.equals("host")) - flavorConfigBuilder.addFlavor(flavorName, 7., 10., 12., 5, Flavor.Type.BARE_METAL); + flavorConfigBuilder.addFlavor(flavorName, 7., 100., 12., 5, Flavor.Type.BARE_METAL); else if (flavorName.equals("devhost")) - flavorConfigBuilder.addFlavor(flavorName, 4., 8., 10, 10, Flavor.Type.BARE_METAL); + flavorConfigBuilder.addFlavor(flavorName, 4., 80., 10, 10, Flavor.Type.BARE_METAL); else - flavorConfigBuilder.addFlavor(flavorName, 1., 3., 2., 3, Flavor.Type.BARE_METAL); + flavorConfigBuilder.addFlavor(flavorName, 1., 30., 2., 3, Flavor.Type.BARE_METAL); } return new NodeFlavors(flavorConfigBuilder.build()); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java index f8774073ce8..698f40c2b24 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java @@ -83,8 +83,7 @@ public class GroupPreparer { prioritizer.addNewDockerNodes(nodeRepository::canAllocateTenantNodeTo); // Allocate from the prioritized list NodeAllocation allocation = new NodeAllocation(nodeList, application, cluster, requestedNodes, - highestIndex, nodeRepository.flavors(), - nodeRepository.zone(), nodeRepository.clock()); + highestIndex, nodeRepository); allocation.offer(prioritizer.prioritize()); if (dynamicProvisioningEnabled) { 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 71e8259665b..8e2d3c64390 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 @@ -14,6 +14,7 @@ import com.yahoo.config.provision.Zone; import com.yahoo.lang.MutableInteger; import com.yahoo.vespa.hosted.provision.Node; import com.yahoo.vespa.hosted.provision.NodeList; +import com.yahoo.vespa.hosted.provision.NodeRepository; import com.yahoo.vespa.hosted.provision.node.Agent; import com.yahoo.vespa.hosted.provision.node.Allocation; @@ -74,20 +75,18 @@ class NodeAllocation { /** The next membership index to assign to a new node */ private final MutableInteger highestIndex; - private final NodeFlavors flavors; - private final Zone zone; - private final Clock clock; + private final NodeRepository nodeRepository; + private final NodeResourceLimits nodeResourceLimits; NodeAllocation(NodeList allNodes, ApplicationId application, ClusterSpec cluster, NodeSpec requestedNodes, - MutableInteger highestIndex, NodeFlavors flavors, Zone zone, Clock clock) { + MutableInteger highestIndex, NodeRepository nodeRepository) { this.allNodes = allNodes; this.application = application; this.cluster = cluster; this.requestedNodes = requestedNodes; this.highestIndex = highestIndex; - this.flavors = flavors; - this.zone = zone; - this.clock = clock; + this.nodeRepository = nodeRepository; + nodeResourceLimits = new NodeResourceLimits(nodeRepository); } /** @@ -104,6 +103,8 @@ class NodeAllocation { List<Node> accepted = new ArrayList<>(); for (PrioritizableNode node : nodesPrioritized) { Node offered = node.node; + if ( ! nodeResourceLimits.isWithinRealLimits(offered, cluster)) continue; + if (offered.allocation().isPresent()) { ClusterMembership membership = offered.allocation().get().membership(); if ( ! offered.allocation().get().owner().equals(application)) continue; // wrong application @@ -145,7 +146,7 @@ class NodeAllocation { node.node = offered.allocate(application, ClusterMembership.from(cluster, highestIndex.add(1)), requestedNodes.resources().orElse(node.node.flavor().resources()), - clock.instant()); + nodeRepository.clock().instant()); accepted.add(acceptNode(node, false, false)); } } @@ -159,7 +160,9 @@ class NodeAllocation { } private boolean checkForClashingParentHost() { - return zone.system() == SystemName.main && zone.environment().isProduction() && ! application.instance().isTester(); + return nodeRepository.zone().system() == SystemName.main && + nodeRepository.zone().environment().isProduction() && + ! application.instance().isTester(); } private boolean offeredNodeHasParentHostnameAlreadyAccepted(Collection<PrioritizableNode> accepted, Node offered) { @@ -229,7 +232,7 @@ class NodeAllocation { } private boolean hasCompatibleFlavor(PrioritizableNode node) { - return requestedNodes.isCompatible(node.node.flavor(), flavors) || node.isResizable; + return requestedNodes.isCompatible(node.node.flavor(), nodeRepository.flavors()) || node.isResizable; } private Node acceptNode(PrioritizableNode prioritizableNode, boolean wantToRetire, boolean resizeable) { @@ -255,7 +258,7 @@ class NodeAllocation { } else { ++wasRetiredJustNow; // Retire nodes which are of an unwanted flavor, retired flavor or have an overlapping parent host - node = node.retire(clock.instant()); + node = node.retire(nodeRepository.clock().instant()); } if ( ! node.allocation().get().membership().cluster().equals(cluster)) { // group may be different @@ -332,7 +335,7 @@ class NodeAllocation { if (deltaRetiredCount > 0) { // retire until deltaRetiredCount is 0, prefer to retire higher indexes to minimize redistribution for (PrioritizableNode node : byDecreasingIndex(nodes)) { if ( ! node.node.allocation().get().membership().retired() && node.node.state() == Node.State.active) { - node.node = node.node.retire(Agent.application, clock.instant()); + node.node = node.node.retire(Agent.application, nodeRepository.clock().instant()); surplusNodes.add(node.node); // offer this node to other groups if (--deltaRetiredCount == 0) break; } 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 df35cabab36..28002463586 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 @@ -66,7 +66,7 @@ public class NodeRepositoryProvisioner implements Provisioner { ProvisionServiceProvider provisionServiceProvider, FlagSource flagSource) { this.nodeRepository = nodeRepository; this.allocationOptimizer = new AllocationOptimizer(nodeRepository); - this.capacityPolicies = new CapacityPolicies(zone); + this.capacityPolicies = new CapacityPolicies(nodeRepository); 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/NodeResourceLimits.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java index ca04bf66ce3..b71cc396c0e 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeResourceLimits.java @@ -5,6 +5,10 @@ import com.yahoo.config.provision.ClusterSpec; import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.Zone; +import com.yahoo.vespa.hosted.provision.Node; +import com.yahoo.vespa.hosted.provision.NodeRepository; + +import java.util.Locale; /** * Defines the resource limits for nodes in various zones @@ -13,20 +17,42 @@ import com.yahoo.config.provision.Zone; */ public class NodeResourceLimits { - private final Zone zone; + private final NodeRepository nodeRepository; + + public NodeResourceLimits(NodeRepository nodeRepository) { + this.nodeRepository = nodeRepository; + } + + /** Validates the resources applications ask for */ + public void ensureWithinAdvertisedLimits(NodeResources advertisedResources, ClusterSpec cluster) { + double minMemoryGb = minAdvertisedMemoryGb(cluster.type()); + if (advertisedResources.memoryGb() >= minMemoryGb) return; + throw new IllegalArgumentException(String.format(Locale.ENGLISH, + "Must specify at least %.2f Gb of memory for %s cluster '%s', was: %.2f Gb", + minMemoryGb, cluster.type().name(), cluster.id().value(), advertisedResources.memoryGb())); + } + + /** Returns whether the real resources we'll end up with on a given tenant node are within limits */ + public boolean isWithinRealLimits(Node candidateTenantNode, ClusterSpec cluster) { + NodeResources realResources = nodeRepository.resourcesCalculator().realResourcesOf(candidateTenantNode, nodeRepository); + + if (realResources.memoryGb() < minRealMemoryGb(cluster.type())) return false; + + return true; + } - public NodeResourceLimits(Zone zone) { - this.zone = zone; + public NodeResources enlargeToLegal(NodeResources advertisedResources, ClusterSpec.Type clusterType) { + return advertisedResources.withMemoryGb(Math.max(minAdvertisedMemoryGb(clusterType), advertisedResources.memoryGb())); } - public int minMemoryGb(ClusterSpec.Type clusterType) { - if (zone.system() == SystemName.dev) return 1; // Allow small containers in dev system + private double minAdvertisedMemoryGb(ClusterSpec.Type clusterType) { + if (nodeRepository.zone().system() == SystemName.dev) return 1; // Allow small containers in dev system if (clusterType == ClusterSpec.Type.admin) return 2; return 4; } - public NodeResources enlargeToLegal(NodeResources resources, ClusterSpec.Type clusterType) { - return resources.withMemoryGb(Math.max(minMemoryGb(clusterType), resources.memoryGb())); + private double minRealMemoryGb(ClusterSpec.Type clusterType) { + return minAdvertisedMemoryGb(clusterType) - 0.7; } } 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 575d84c0129..4fb1c3bcab2 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 @@ -259,7 +259,7 @@ public class FailedExpirerTest { new MockNameResolver().mockAnyLookup(), DockerImage.fromString("docker-image"), true); - this.provisioner = new NodeRepositoryProvisioner(nodeRepository, Zone.defaultZone(), new MockProvisionServiceProvider(), new InMemoryFlagSource()); + this.provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, new MockProvisionServiceProvider(), new InMemoryFlagSource()); this.expirer = new FailedExpirer(nodeRepository, zone, clock, Duration.ofMinutes(30)); } @@ -328,12 +328,13 @@ public class FailedExpirerTest { public FailureScenario allocate(ClusterSpec.Type clusterType, NodeResources flavor, String... hostname) { ClusterSpec clusterSpec = ClusterSpec.request(clusterType, ClusterSpec.Id.from("test")).vespaVersion("6.42").build(); - Capacity capacity = Capacity.from(new ClusterResources(hostname.length, 1, flavor), false, true); + Capacity capacity = Capacity.from(new ClusterResources(hostname.length, 1, flavor), true, true); return allocate(applicationId, clusterSpec, capacity); } public FailureScenario allocate(ApplicationId applicationId, ClusterSpec clusterSpec, Capacity capacity) { - List<HostSpec> preparedNodes = provisioner.prepare(applicationId, clusterSpec, capacity, null); + List<HostSpec> preparedNodes = provisioner.prepare(applicationId, clusterSpec, capacity, + (level, message) -> System.out.println(level + ": " + message) ); NestedTransaction transaction = new NestedTransaction().add(new CuratorTransaction(curator)); provisioner.activate(transaction, applicationId, Set.copyOf(preparedNodes)); transaction.commit(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java index 6dfb404d81a..f8b97ed9618 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java @@ -193,13 +193,13 @@ public class MetricsReporterTest { assertEquals(0, metric.values.get("hostedVespa.readyHosts")); // Only tenants counts assertEquals(2, metric.values.get("hostedVespa.reservedHosts")); - assertEquals(12.0, metric.values.get("hostedVespa.docker.totalCapacityDisk")); - assertEquals(10.0, metric.values.get("hostedVespa.docker.totalCapacityMem")); - assertEquals(7.0, metric.values.get("hostedVespa.docker.totalCapacityCpu")); + assertEquals( 12.0, metric.values.get("hostedVespa.docker.totalCapacityDisk")); + assertEquals(100.0, metric.values.get("hostedVespa.docker.totalCapacityMem")); + assertEquals( 7.0, metric.values.get("hostedVespa.docker.totalCapacityCpu")); - assertEquals(6.0, metric.values.get("hostedVespa.docker.freeCapacityDisk")); - assertEquals(3.0, metric.values.get("hostedVespa.docker.freeCapacityMem")); - assertEquals(4.0, metric.values.get("hostedVespa.docker.freeCapacityCpu")); + assertEquals( 6.0, metric.values.get("hostedVespa.docker.freeCapacityDisk")); + assertEquals(93.0, metric.values.get("hostedVespa.docker.freeCapacityMem")); + assertEquals( 4.0, metric.values.get("hostedVespa.docker.freeCapacityCpu")); Metric.Context app1context = metric.createContext(Map.of("app", "test.default", "tenantName", "app1", "applicationId", "app1.test.default")); assertEquals(2.0, metric.sumDoubleValues("hostedVespa.docker.allocatedCapacityDisk", app1context), 0.01d); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java index b3cda5bb3df..eac2d8b9bcb 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacityTest.java @@ -33,8 +33,8 @@ public class DockerHostCapacityTest { private DockerHostCapacity capacity; private List<Node> nodes; private Node host1, host2, host3; - private final NodeResources resources1 = new NodeResources(1, 3, 2, 1.5); - private final NodeResources resources2 = new NodeResources(2, 4, 4, 0.5); + private final NodeResources resources1 = new NodeResources(1, 30, 2, 1.5); + private final NodeResources resources2 = new NodeResources(2, 40, 4, 0.5); @Before public void setup() { @@ -90,9 +90,9 @@ public class DockerHostCapacityTest { @Test public void freeCapacityOf() { - assertEquals(new NodeResources(5, 4, 8, 2, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), + assertEquals(new NodeResources(5, 40, 8, 2, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), capacity.freeCapacityOf(host1, false)); - assertEquals(new NodeResources(5, 6, 8, 4.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), + assertEquals(new NodeResources(5, 60, 8, 4.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), capacity.freeCapacityOf(host3, false)); doAnswer(invocation -> { @@ -100,9 +100,9 @@ public class DockerHostCapacityTest { return totalHostResources.subtract(new NodeResources(1, 2, 3, 0.5, NodeResources.DiskSpeed.any)); }).when(hostResourcesCalculator).advertisedResourcesOf(any()); - assertEquals(new NodeResources(4, 2, 5, 1.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), + assertEquals(new NodeResources(4, 38, 5, 1.5, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), capacity.freeCapacityOf(host1, false)); - assertEquals(new NodeResources(4, 4, 5, 4, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), + assertEquals(new NodeResources(4, 58, 5, 4, NodeResources.DiskSpeed.fast, NodeResources.StorageType.remote), capacity.freeCapacityOf(host3, false)); } 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 5079fce4418..271999452bb 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 @@ -78,7 +78,7 @@ public class DockerProvisioningTest { ProvisioningTester tester = new ProvisioningTester.Builder().zone(new Zone(Environment.prod, RegionName.from("us-east"))).build(); ApplicationId zoneApplication = tester.makeApplicationId(); - List<Node> parents = tester.makeReadyNodes(10, new NodeResources(2, 2, 2, 2), NodeType.host, 1); + List<Node> parents = tester.makeReadyNodes(10, new NodeResources(2, 4, 2, 2), NodeType.host, 1); for (Node parent : parents) tester.makeReadyVirtualDockerNodes(1, dockerFlavor, parent.hostname()); 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 806a9984da3..f7fa3b29b67 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 @@ -105,19 +105,19 @@ public class ProvisioningTester { this.orchestrator = orchestrator; ProvisionServiceProvider provisionServiceProvider = new MockProvisionServiceProvider(loadBalancerService, hostProvisioner); this.provisioner = new NodeRepositoryProvisioner(nodeRepository, zone, provisionServiceProvider, flagSource); - this.capacityPolicies = new CapacityPolicies(zone); + this.capacityPolicies = new CapacityPolicies(nodeRepository); this.provisionLogger = new NullProvisionLogger(); this.loadBalancerService = loadBalancerService; } public static FlavorsConfig createConfig() { FlavorConfigBuilder b = new FlavorConfigBuilder(); - b.addFlavor("default", 2., 4., 100, 10, Flavor.Type.BARE_METAL).cost(3); - b.addFlavor("small", 1., 2., 50, 5, Flavor.Type.BARE_METAL).cost(2); - b.addFlavor("dockerSmall", 1., 1., 10, 1, Flavor.Type.DOCKER_CONTAINER).cost(1); - b.addFlavor("dockerLarge", 2., 1., 20, 1, Flavor.Type.DOCKER_CONTAINER).cost(3); - b.addFlavor("v-4-8-100", 4., 8., 100, 10, Flavor.Type.VIRTUAL_MACHINE).cost(4); - b.addFlavor("large", 4., 8., 100, 10, Flavor.Type.BARE_METAL).cost(10); + b.addFlavor("default", 2., 40., 100, 10, Flavor.Type.BARE_METAL).cost(3); + b.addFlavor("small", 1., 20., 50, 5, Flavor.Type.BARE_METAL).cost(2); + b.addFlavor("dockerSmall", 1., 10., 10, 1, Flavor.Type.DOCKER_CONTAINER).cost(1); + b.addFlavor("dockerLarge", 2., 10., 20, 1, Flavor.Type.DOCKER_CONTAINER).cost(3); + b.addFlavor("v-4-8-100", 4., 80., 100, 10, Flavor.Type.VIRTUAL_MACHINE).cost(4); + b.addFlavor("large", 4., 80., 100, 10, Flavor.Type.BARE_METAL).cost(10); return b.build(); } |