diff options
6 files changed, 33 insertions, 3 deletions
diff --git a/config-provisioning/abi-spec.json b/config-provisioning/abi-spec.json index 91907af75c4..a2f914ca6f7 100644 --- a/config-provisioning/abi-spec.json +++ b/config-provisioning/abi-spec.json @@ -673,7 +673,8 @@ "public boolean isDockerHost()", "public java.lang.String description()", "public com.yahoo.config.provision.NodeType childNodeType()", - "public java.util.List childNodeTypes()" + "public java.util.List childNodeTypes()", + "public boolean supportsChild(com.yahoo.config.provision.NodeType)" ], "fields": [ "public static final enum com.yahoo.config.provision.NodeType tenant", diff --git a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeType.java b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeType.java index 009d8fd73cb..93f2602cacc 100644 --- a/config-provisioning/src/main/java/com/yahoo/config/provision/NodeType.java +++ b/config-provisioning/src/main/java/com/yahoo/config/provision/NodeType.java @@ -71,4 +71,11 @@ public enum NodeType { return childNodeTypes; } + /** + * @param type Child {@link NodeType} + * @return true if the {@link NodeType} can run on this host, false otherwise. + */ + public boolean supportsChild(NodeType type) { + return isDockerHost() && childNodeTypes.contains(type); + } } 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 781dae020b9..f46cde995d7 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 @@ -71,7 +71,7 @@ public class DockerHostCapacity { NodeResources freeCapacityOf(Node host, boolean excludeInactive) { // Only hosts have free capacity - if (host.type() != NodeType.host) return new NodeResources(0, 0, 0, 0); + if (!host.type().supportsChild(NodeType.tenant)) return new NodeResources(0, 0, 0, 0); NodeResources hostResources = hostResourcesCalculator.availableCapacityOf(host.flavor().resources()); return allNodes.childrenOf(host).asList().stream() 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 55bea5b83a7..c7a86b283ca 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 @@ -42,6 +42,8 @@ public class FlavorConfigBuilder { flavorConfigBuilder.addFlavor(flavorName, 2. /* cpu*/, 4. /* mem GB*/, 4. /*disk GB*/, 0.5, /* bandwidth Gbps*/ Flavor.Type.DOCKER_CONTAINER); else if (flavorName.equals("host")) flavorConfigBuilder.addFlavor(flavorName, 7. /* cpu*/, 10. /* mem GB*/, 12. /*disk GB*/, 5 /* bandwidth Gbps*/, Flavor.Type.BARE_METAL); + else if (flavorName.equals("devhost")) + flavorConfigBuilder.addFlavor(flavorName, 4. /* cpu*/, 8. /* mem GB*/, 10 /*disk GB*/, 10 /* bandwidth Gbps*/, Flavor.Type.BARE_METAL); else flavorConfigBuilder.addFlavor(flavorName, 1. /* cpu*/, 3. /* mem GB*/, 2. /*disk GB*/, 3 /* bandwidth Gbps*/, Flavor.Type.BARE_METAL); } 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 f80ccff94e9..a0d81385cad 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 @@ -138,7 +138,7 @@ public class NodePrioritizer { NodeResources wantedResources = resources(requestedNodes); for (Node host : candidates) { - if (host.type() != NodeType.host) continue; + if (!host.type().supportsChild(requestedNodes.type())) continue; if (host.status().wantToRetire()) continue; boolean hostHasCapacityForWantedFlavor = capacity.hasCapacity(host, wantedResources); 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 a41b61fd352..e2015cfd30a 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 @@ -105,6 +105,26 @@ public class DockerHostCapacityTest { capacity.freeCapacityOf(host3, false)); } + @Test + public void devhostCapacityTest() { + // Dev host can assign both configserver and tenant containers. + + var nodeFlavors = FlavorConfigBuilder.createDummies("devhost", "container"); + var devHost = Node.create("devhost", new IP.Config(Set.of("::1"), generateIPs(2, 10)), "devhost", Optional.empty(), Optional.empty(), nodeFlavors.getFlavorOrThrow("devhost"), NodeType.devhost); + + var cfg = Node.createDockerNode(Set.of("::2"), "cfg", "devhost", resources1, NodeType.config); + + var nodes = new ArrayList<>(List.of(cfg)); + var capacity = new DockerHostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); + assertTrue(capacity.hasCapacity(devHost, resources1)); + + var container1 = Node.createDockerNode(Set.of("::3"), "container1", "devhost", resources1, NodeType.tenant); + nodes = new ArrayList<>(List.of(cfg, container1)); + capacity = new DockerHostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); + assertFalse(capacity.hasCapacity(devHost, resources1)); + + } + private Set<String> generateIPs(int start, int count) { // Allow 4 containers Set<String> ipAddressPool = new LinkedHashSet<>(); |