diff options
author | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-06-14 10:59:01 +0200 |
---|---|---|
committer | Valerij Fredriksen <valerijf@verizonmedia.com> | 2019-06-14 10:59:01 +0200 |
commit | 0b88f88ae82228e7c5ae88449f6b16151828e166 (patch) | |
tree | 87356e4b7f16bd742fc77f50c9d85f2e1678d10a /node-repository | |
parent | 72ce1a2d0a94a646de69bc81359f7810681b25c0 (diff) |
Use DockerHostCalculator to find the available capacity remaining on the host
Diffstat (limited to 'node-repository')
2 files changed, 25 insertions, 3 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java index df180d54158..a5969dc69cb 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/DockerHostCapacity.java @@ -62,6 +62,7 @@ public class DockerHostCapacity { NodeResources freeCapacityOf(Node dockerHost, boolean excludeInactive) { // Only hosts have free capacity if (dockerHost.type() != NodeType.host) return new NodeResources(0, 0, 0); + NodeResources hostResources = hostResourcesCalculator.availableCapacityOf(dockerHost.flavor().resources()); // Subtract used resources without taking disk speed into account since existing allocations grandfathered in // may not use reflect the actual disk speed (as of May 2019). This (the 3 diskSpeed assignments below) @@ -69,7 +70,7 @@ public class DockerHostCapacity { return allNodes.childrenOf(dockerHost).asList().stream() .filter(node -> !(excludeInactive && isInactiveOrRetired(node))) .map(node -> node.flavor().resources().withDiskSpeed(NodeResources.DiskSpeed.any)) - .reduce(dockerHost.flavor().resources().withDiskSpeed(NodeResources.DiskSpeed.any), NodeResources::subtract) + .reduce(hostResources.withDiskSpeed(NodeResources.DiskSpeed.any), NodeResources::subtract) .withDiskSpeed(dockerHost.flavor().resources().diskSpeed()); } 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 58d306adc75..60a31f1c804 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 @@ -3,6 +3,7 @@ package com.yahoo.vespa.hosted.provision.provisioning; import com.yahoo.config.provision.Flavor; import com.yahoo.config.provision.NodeFlavors; +import com.yahoo.config.provision.NodeResources; import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.LockedNodeList; import com.yahoo.vespa.hosted.provision.Node; @@ -18,12 +19,16 @@ import java.util.Set; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Mockito.doAnswer; +import static org.mockito.Mockito.mock; /** * @author smorgrav */ public class DockerHostCapacityTest { + private final HostResourcesCalculator hostResourcesCalculator = mock(HostResourcesCalculator.class); private DockerHostCapacity capacity; private List<Node> nodes; private Node host1, host2, host3; @@ -31,6 +36,8 @@ public class DockerHostCapacityTest { @Before public void setup() { + doAnswer(invocation -> invocation.getArguments()[0]).when(hostResourcesCalculator).availableCapacityOf(any()); + // Create flavors NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("host", "docker", "docker2"); flavorDocker = nodeFlavors.getFlavorOrThrow("docker"); @@ -54,7 +61,7 @@ public class DockerHostCapacityTest { // init docker host capacity nodes = new ArrayList<>(List.of(host1, host2, host3, nodeA, nodeB, nodeC, nodeD, nodeE)); - capacity = new DockerHostCapacity(new LockedNodeList(nodes, () -> {})); + capacity = new DockerHostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); } @Test @@ -70,7 +77,7 @@ public class DockerHostCapacityTest { Node nodeF = Node.create("nodeF", Set.of("::6"), Set.of(), "nodeF", Optional.of("host1"), Optional.empty(), flavorDocker, NodeType.tenant); nodes.add(nodeF); - capacity = new DockerHostCapacity(new LockedNodeList(nodes, () -> {})); + capacity = new DockerHostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); assertFalse(capacity.hasCapacity(host1, flavorDocker.resources())); assertFalse(capacity.hasCapacity(host1, flavorDocker2.resources())); } @@ -82,6 +89,20 @@ public class DockerHostCapacityTest { assertEquals(0, capacity.freeIPs(host3)); } + @Test + public void freeCapacityOf() { + assertEquals(new NodeResources(5, 4, 8), capacity.freeCapacityOf(host1, false)); + assertEquals(new NodeResources(5, 6, 8), capacity.freeCapacityOf(host3, false)); + + doAnswer(invocation -> { + NodeResources totalHostResources = (NodeResources) invocation.getArguments()[0]; + return totalHostResources.subtract(new NodeResources(1, 2, 3, NodeResources.DiskSpeed.any)); + }).when(hostResourcesCalculator).availableCapacityOf(any()); + + assertEquals(new NodeResources(4, 2, 5), capacity.freeCapacityOf(host1, false)); + assertEquals(new NodeResources(4, 4, 5), capacity.freeCapacityOf(host3, false)); + } + private Set<String> generateIPs(int start, int count) { // Allow 4 containers Set<String> ipAddressPool = new LinkedHashSet<>(); |