diff options
19 files changed, 133 insertions, 142 deletions
diff --git a/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java b/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java index 368767959bb..c409cf4f054 100644 --- a/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java +++ b/athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java @@ -62,11 +62,11 @@ public class IdentityDocumentGeneratorTest { parentHostname, new MockNodeFlavors().getFlavorOrThrow("default"), NodeType.host).build(); - Node containerNode = Node.createDockerNode(Set.of("::1"), - containerHostname, - parentHostname, - new MockNodeFlavors().getFlavorOrThrow("default").resources(), - NodeType.tenant) + Node containerNode = Node.reserve(Set.of("::1"), + containerHostname, + parentHostname, + new MockNodeFlavors().getFlavorOrThrow("default").resources(), + NodeType.tenant) .allocation(allocation).build(); NodeRepository nodeRepository = mock(NodeRepository.class); Nodes nodes = mock(Nodes.class); 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 1d4265172a3..e356ee06ac6 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 @@ -10,35 +10,35 @@ import java.util.List; */ public enum NodeType { - /** A node to be assigned to a tenant to run application workloads */ + /** Node assignable to a tenant to run application workloads */ tenant("Tenant node"), - /** A host of a set of (Docker) tenant nodes */ - host("Tenant docker host", tenant), + /** Host of a tenant nodes */ + host("Tenant host", tenant), - /** Nodes running the shared proxy layer */ + /** Node serving the shared proxy layer */ proxy("Proxy node"), - /** A host of a (Docker) proxy node */ - proxyhost("Proxy docker host", proxy), + /** Host of a proxy node */ + proxyhost("Proxy host", proxy), - /** A config server */ - config("Config server"), + /** Config server node */ + config("Config server node"), - /** A host of a (Docker) config server node */ - confighost("Config docker host", config), + /** Host of a config server node */ + confighost("Config server host", config), - /** A controller */ - controller("Controller"), + /** Controller node */ + controller("Controller node"), - /** A host of a (Docker) controller node */ + /** Host of a controller node */ controllerhost("Controller host", controller), - /** A host of multiple nodes, only used in {@link SystemName#dev} */ + /** Host capable of running multiple node types, only used in {@link SystemName#dev} */ devhost("Dev host", config, controller, tenant); - private final List<NodeType> childNodeTypes; private final String description; + private final List<NodeType> childNodeTypes; NodeType(String description, NodeType... childNodeTypes) { this.childNodeTypes = List.of(childNodeTypes); @@ -71,10 +71,7 @@ public enum NodeType { return childNodeTypes; } - /** - * @param type Child {@link NodeType} - * @return true if the {@link NodeType} can run on this host, false otherwise. - */ + /** Returns whether given node type can run on this */ public boolean canRun(NodeType type) { return childNodeTypes.contains(type); } 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 dd6f10f616e..76158c4825d 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 @@ -55,7 +55,7 @@ public final class Node implements Nodelike { private final Optional<Allocation> allocation; /** Creates a node builder in the initial state (reserved) */ - public static Node.Builder createDockerNode(Set<String> ipAddresses, String hostname, String parentHostname, NodeResources resources, NodeType type) { + public static Node.Builder reserve(Set<String> ipAddresses, String hostname, String parentHostname, NodeResources resources, NodeType type) { return new Node.Builder("fake-" + hostname, hostname, new Flavor(resources), State.reserved, type) .ipConfig(IP.Config.ofEmptyPool(ipAddresses)) .parentHostname(parentHostname); @@ -122,7 +122,7 @@ public final class Node implements Nodelike { * * - OpenStack: UUID * - AWS: Instance ID - * - Docker containers: fake-[hostname] + * - Linux containers: fake-[hostname] */ public String id() { return id; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java index 55495669802..6582c03d727 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java @@ -158,7 +158,7 @@ public class NodeRepository extends AbstractComponent { /** Returns the status of firmware checks for hosts managed by this. */ public FirmwareChecks firmwareChecks() { return firmwareChecks; } - /** Returns the docker images to use for nodes in this. */ + /** Returns the container images to use for nodes in this. */ public ContainerImages containerImages() { return containerImages; } /** Returns the status of maintenance jobs managed by this. */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java index 7317942c045..fb31d51abfc 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java @@ -21,7 +21,7 @@ import java.util.stream.Collectors; /** * This moves expired failed nodes: * - * - To parked: If the node has known hardware failure, Docker hosts are moved to parked only when all of their + * - To parked: If the node has known hardware failure, hosts are moved to parked only when all of their * children are already in parked. * - To dirty: If the node is a host and has failed less than 5 times, or always if the node is a child. * - Otherwise the node will remain in failed. @@ -29,7 +29,7 @@ import java.util.stream.Collectors; * Failed content nodes are given a long expiry time to enable us to manually moved them back to * active to recover data in cases where the node was failed accidentally. * - * Failed container (Vespa, not Docker) nodes are expired early as there's no data to potentially recover. + * Failed containers (Vespa, not Linux) are expired early as there's no data to potentially recover. * * The purpose of the automatic recycling to dirty + fail count is that nodes which were moved * to failed due to some undetected hardware failure will end up being failed again. diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java index 9504a73f21e..8d8c7ef42f2 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java @@ -75,7 +75,7 @@ public class MetricsReporter extends NodeRepositoryMaintainer { nodes.forEach(node -> updateNodeMetrics(node, serviceModel)); updateNodeCountMetrics(nodes); updateLockMetrics(); - updateDockerMetrics(nodes); + updateContainerMetrics(nodes); updateTenantUsageMetrics(nodes); updateRepairTicketMetrics(nodes); updateAllocationMetrics(nodes); @@ -315,7 +315,7 @@ public class MetricsReporter extends NodeRepositoryMaintainer { } } - private void updateDockerMetrics(NodeList nodes) { + private void updateContainerMetrics(NodeList nodes) { NodeResources totalCapacity = getCapacityTotal(nodes); metric.set("hostedVespa.docker.totalCapacityCpu", totalCapacity.vcpu(), null); metric.set("hostedVespa.docker.totalCapacityMem", totalCapacity.memoryGb(), null); @@ -381,10 +381,10 @@ public class MetricsReporter extends NodeRepositoryMaintainer { .reduce(new NodeResources(0, 0, 0, 0, any), NodeResources::add); } - private static NodeResources freeCapacityOf(NodeList nodes, Node dockerHost) { - return nodes.childrenOf(dockerHost).asList().stream() + private static NodeResources freeCapacityOf(NodeList nodes, Node host) { + return nodes.childrenOf(host).asList().stream() .map(node -> node.flavor().resources().justNumbers()) - .reduce(dockerHost.flavor().resources().justNumbers(), NodeResources::subtract); + .reduce(host.flavor().resources().justNumbers(), NodeResources::subtract); } private static class ClusterKey { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java index ba884ced630..eb9c8300724 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java @@ -46,7 +46,7 @@ public class NodeFailer extends NodeRepositoryMaintainer { /** Metric for number of hosts that we want to fail, but cannot due to throttling */ static final String throttledHostFailuresMetric = "throttledHostFailures"; - /** Metric for number of nodes (docker containers) that we want to fail, but cannot due to throttling */ + /** Metric for number of nodes that we want to fail, but cannot due to throttling */ static final String throttledNodeFailuresMetric = "throttledNodeFailures"; /** Metric that indicates whether throttling is active where 1 means active and 0 means inactive */ diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java index 1ae0e6f6227..e0a11aa5dac 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java @@ -77,7 +77,7 @@ public class RetiredExpirer extends NodeRepositoryMaintainer { /** * Checks if the node can be removed: - * if the node is a docker host, it will only be removed if it has no children, + * if the node is a host, it will only be removed if it has no children, * or all its children are parked or failed. * Otherwise, a removal is allowed if either of these are true: * - The node has been in state {@link History.Event.Type#retired} for longer than {@link #retiredExpiry} @@ -85,11 +85,10 @@ public class RetiredExpirer extends NodeRepositoryMaintainer { */ private boolean canRemove(Node node) { if (node.type().isHost()) { - if (nodeRepository().nodes() - .list().childrenOf(node).asList().stream() - .allMatch(child -> child.state() == Node.State.parked || - child.state() == Node.State.failed)) { - log.info("Docker host " + node + " has no non-parked/failed children"); + if (nodeRepository().nodes().list().childrenOf(node).asList().stream() + .allMatch(child -> child.state() == Node.State.parked || + child.state() == Node.State.failed)) { + log.info("Host " + node + " has no non-parked/failed children"); return true; } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/IP.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/IP.java index bac31c40418..d4eaaa87082 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/IP.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/IP.java @@ -225,7 +225,7 @@ public class IP { /** * A pool of addresses from which an allocation can be made. * - * Addresses in this are available for use by Docker containers + * Addresses in this are available for use by Linux containers. */ public static class Pool { diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/NodeAcl.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/NodeAcl.java index 4116d58f2d1..dddc535b36a 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/NodeAcl.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/NodeAcl.java @@ -16,8 +16,7 @@ import java.util.Set; import java.util.TreeSet; /** - * A node ACL. The ACL contains the node which the ACL is valid for, - * a set of nodes and networks that the node should trust. + * A node ACL declares which nodes, networks and ports a node should trust. * * @author mpolden */ @@ -57,8 +56,8 @@ public class NodeAcl { Set<String> trustedNetworks = new LinkedHashSet<>(); // For all cases below, trust: - // - SSH: If the Docker host has one container, and it is using the Docker host's network namespace, - // opening up SSH to the Docker host is done here as a trusted port. For simplicity all nodes have + // - SSH: If the host has one container, and it is using the host's network namespace, + // opening up SSH to the host is done here as a trusted port. For simplicity all nodes have // SSH opened (which is safe for 2 reasons: SSH daemon is not run inside containers, and NPT networks // will (should) not forward port 22 traffic to container). // - parent host (for health checks and metrics) diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java index 3e94201d87a..898e477b498 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java @@ -102,13 +102,13 @@ public class Nodes { // ----------------- Node lifecycle ----------------------------------------------------------- - /** Adds a list of newly created docker container nodes to the node repository as <i>reserved</i> nodes */ - public List<Node> addDockerNodes(LockedNodeList nodes) { + /** Adds a list of newly created reserved nodes to the node repository */ + public List<Node> addReservedNodes(LockedNodeList nodes) { for (Node node : nodes) { if ( ! node.flavor().getType().equals(Flavor.Type.DOCKER_CONTAINER)) - illegal("Cannot add " + node + ": This is not a docker node"); + illegal("Cannot add " + node + ": This is not a child node"); if (node.allocation().isEmpty()) - illegal("Cannot add " + node + ": Docker containers needs to be allocated"); + illegal("Cannot add " + node + ": Child nodes need to be allocated"); Optional<Node> existing = node(node.hostname()); if (existing.isPresent()) illegal("Cannot add " + node + ": A node with this name already exists (" + @@ -119,7 +119,7 @@ public class Nodes { } /** - * Adds a list of (newly created) nodes to the node repository as <i>provisioned</i> nodes. + * Adds a list of (newly created) nodes to the node repository as provisioned nodes. * If any of the nodes already exists in the deprovisioned state, the new node will be merged * with the history of that node. */ @@ -403,7 +403,7 @@ public class Nodes { } /* - * This method is used by the REST API to handle readying nodes for new allocations. For tenant docker + * This method is used by the REST API to handle readying nodes for new allocations. For Linux * containers this will remove the node from node repository, otherwise the node will be moved to state ready. */ public Node markNodeAvailableForNewAllocation(String hostname, Agent agent, String reason) { 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 3fbc7b213a1..543e452c810 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 @@ -125,7 +125,7 @@ public class GroupPreparer { // Carry out and return allocation nodeRepository.nodes().reserve(allocation.reservableNodes()); - nodeRepository.nodes().addDockerNodes(new LockedNodeList(allocation.newNodes(), allocationLock)); + nodeRepository.nodes().addReservedNodes(new LockedNodeList(allocation.newNodes(), allocationLock)); List<Node> acceptedNodes = allocation.finalNodes(); surplusActiveNodes.removeAll(acceptedNodes); return acceptedNodes; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java index af3bde02421..0e0211beea7 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java @@ -32,7 +32,8 @@ public class HostCapacity { public NodeList allNodes() { return allNodes; } /** - * Spare hosts are the hosts in the system with the most free capacity. + * Spare hosts are the hosts in the system with the most free capacity. A zone may reserve a minimum number of spare + * hosts to increase the chances of having replacements for failed nodes. * * We do not count retired or inactive nodes as used capacity (as they could have been * moved to create space for the spare node in the first place). @@ -42,9 +43,9 @@ public class HostCapacity { */ public Set<Node> findSpareHosts(List<Node> candidates, int count) { return candidates.stream() - .filter(node -> node.type() == NodeType.host) - .filter(dockerHost -> dockerHost.state() == Node.State.active) - .filter(dockerHost -> freeIPs(dockerHost) > 0) + .filter(node -> node.type().canRun(NodeType.tenant)) + .filter(host -> host.state() == Node.State.active) + .filter(host -> freeIps(host) > 0) .sorted(this::compareWithoutInactive) .limit(count) .collect(Collectors.toSet()); @@ -58,34 +59,29 @@ public class HostCapacity { .collect(Collectors.toSet()); } - private int compareWithoutInactive(Node hostA, Node hostB) { - int result = compare(freeCapacityOf(hostB, true), freeCapacityOf(hostA, true)); + private int compareWithoutInactive(Node a, Node b) { + int result = compare(freeCapacityOf(b, true), freeCapacityOf(a, true)); if (result != 0) return result; // If resources are equal we want to assign to the one with the most IP addresses free - return freeIPs(hostB) - freeIPs(hostA); + return freeIps(b) - freeIps(a); } private int compare(NodeResources a, NodeResources b) { return NodeResourceComparator.defaultOrder().compare(a, b); } - /** - * Checks the node capacity and free ip addresses to see - * if we could allocate a flavor on the docker host. - */ - boolean hasCapacity(Node dockerHost, NodeResources requestedCapacity) { - return freeCapacityOf(dockerHost, false).satisfies(requestedCapacity) && freeIPs(dockerHost) > 0; + /** Returns whether host has room for requested capacity */ + boolean hasCapacity(Node host, NodeResources requestedCapacity) { + return freeCapacityOf(host, false).satisfies(requestedCapacity) && freeIps(host) > 0; } - /** - * Number of free (not allocated) IP addresses assigned to the dockerhost. - */ - int freeIPs(Node dockerHost) { - if (dockerHost.type() == NodeType.host) { - return dockerHost.ipConfig().pool().eventuallyUnusedAddressCount(allNodes); + /** Returns the number of available IP addresses on given host */ + int freeIps(Node host) { + if (host.type() == NodeType.host) { + return host.ipConfig().pool().eventuallyUnusedAddressCount(allNodes); } else { - return dockerHost.ipConfig().pool().findUnusedIpAddresses(allNodes).size(); + return host.ipConfig().pool().findUnusedIpAddresses(allNodes).size(); } } @@ -93,7 +89,7 @@ public class HostCapacity { * Calculate the remaining capacity of a host. * * @param host the host to find free capacity of. - * @return a default (empty) capacity if not a docker host, otherwise the free/unallocated/rest capacity + * @return a default (empty) capacity if not host, otherwise the free/unallocated/rest capacity */ public NodeResources freeCapacityOf(Node host) { return freeCapacityOf(host, false); @@ -105,13 +101,14 @@ public class HostCapacity { NodeResources hostResources = hostResourcesCalculator.advertisedResourcesOf(host.flavor()); return allNodes.childrenOf(host).asList().stream() - .filter(node -> !(excludeInactive && isInactiveOrRetired(node))) - .map(node -> node.flavor().resources().justNumbers()) - .reduce(hostResources.justNumbers(), NodeResources::subtract) - .with(host.flavor().resources().diskSpeed()).with(host.flavor().resources().storageType()); + .filter(node -> !(excludeInactive && inactiveOrRetired(node))) + .map(node -> node.flavor().resources().justNumbers()) + .reduce(hostResources.justNumbers(), NodeResources::subtract) + .with(host.flavor().resources().diskSpeed()) + .with(host.flavor().resources().storageType()); } - private static boolean isInactiveOrRetired(Node node) { + private static boolean inactiveOrRetired(Node node) { if (node.state() == Node.State.inactive) return true; if (node.allocation().isPresent() && node.allocation().get().membership().retired()) return true; return false; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java index aad65ef5646..297a8ed77e6 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java @@ -405,12 +405,12 @@ public abstract class NodeCandidate implements Nodelike, Comparable<NodeCandidat "Failed when allocating address on host"); } - Node node = Node.createDockerNode(allocation.get().addresses(), - allocation.get().hostname(), - parentHostname().get(), - resources.with(parent.get().resources().diskSpeed()) + Node node = Node.reserve(allocation.get().addresses(), + allocation.get().hostname(), + parentHostname().get(), + resources.with(parent.get().resources().diskSpeed()) .with(parent.get().resources().storageType()), - NodeType.tenant).build(); + NodeType.tenant).build(); return new ConcreteNodeCandidate(node, freeParentCapacity, parent, violatesSpares, exclusiveSwitch, isSurplus, isNew, isResizable); } 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 9578e43609b..db7bc394089 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 @@ -8,7 +8,6 @@ import com.yahoo.config.provision.NodeType; import com.yahoo.vespa.hosted.provision.LockedNodeList; 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.Nodes; import com.yahoo.vespa.hosted.provision.persistence.NameResolver; diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java index 02621c79019..6ff4d4ca5f8 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java @@ -62,7 +62,7 @@ public class ProvisionedHost { /** Generate {@link Node} instance representing the node running on this physical host */ public Node generateNode() { - return Node.createDockerNode(Set.of(), nodeHostname(), hostHostname, nodeResources, NodeType.tenant).build(); + return Node.reserve(Set.of(), nodeHostname(), hostHostname, nodeResources, NodeType.tenant).build(); } public String getId() { 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 b20821bd4a6..64666fd7cf0 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 @@ -152,7 +152,7 @@ public class MetricsReporterTest { } @Test - public void docker_metrics() { + public void container_metrics() { NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("host", "docker", "docker2"); ProvisioningTester tester = new ProvisioningTester.Builder().flavors(nodeFlavors.getFlavors()).build(); NodeRepository nodeRepository = tester.nodeRepository(); @@ -166,18 +166,18 @@ public class MetricsReporterTest { nodeRepository.nodes().deallocateRecursively("dockerHost", Agent.system, getClass().getSimpleName()); nodeRepository.nodes().setReady("dockerHost", Agent.system, getClass().getSimpleName()); - Node container1 = Node.createDockerNode(Set.of("::2"), "container1", - "dockerHost", new NodeResources(1, 3, 2, 1), NodeType.tenant).build(); + Node container1 = Node.reserve(Set.of("::2"), "container1", + "dockerHost", new NodeResources(1, 3, 2, 1), NodeType.tenant).build(); container1 = container1.with(allocation(Optional.of("app1"), container1).get()); try (Mutex lock = nodeRepository.nodes().lockUnallocated()) { - nodeRepository.nodes().addDockerNodes(new LockedNodeList(List.of(container1), lock)); + nodeRepository.nodes().addReservedNodes(new LockedNodeList(List.of(container1), lock)); } - Node container2 = Node.createDockerNode(Set.of("::3"), "container2", - "dockerHost", new NodeResources(2, 4, 4, 1), NodeType.tenant).build(); + Node container2 = Node.reserve(Set.of("::3"), "container2", + "dockerHost", new NodeResources(2, 4, 4, 1), NodeType.tenant).build(); container2 = container2.with(allocation(Optional.of("app2"), container2).get()); try (Mutex lock = nodeRepository.nodes().lockUnallocated()) { - nodeRepository.nodes().addDockerNodes(new LockedNodeList(List.of(container2), lock)); + nodeRepository.nodes().addReservedNodes(new LockedNodeList(List.of(container2), lock)); } NestedTransaction transaction = new NestedTransaction(); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java index 7d8fec95d3a..131c02015a1 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java @@ -444,7 +444,7 @@ public class DynamicDockerProvisionTest { Node parent = Node.create(hostHostname, new IP.Config(Set.of(hostIp), pool), hostHostname, hostFlavor, NodeType.host) .exclusiveTo(exclusiveTo).build(); - Node child = Node.createDockerNode(Set.of("::" + hostIndex + ":1"), hostHostname + "-1", hostHostname, nodeResources, NodeType.tenant).build(); + Node child = Node.reserve(Set.of("::" + hostIndex + ":1"), hostHostname + "-1", hostHostname, nodeResources, NodeType.tenant).build(); ProvisionedHost provisionedHost = mock(ProvisionedHost.class); when(provisionedHost.generateHost()).thenReturn(parent); when(provisionedHost.generateNode()).thenReturn(child); diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java index 808770f42dc..995d25043f3 100644 --- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java +++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java @@ -35,8 +35,8 @@ public class HostCapacityTest { private HostCapacity capacity; private List<Node> nodes; private Node host1, host2, host3; - private final NodeResources dockerResources = new NodeResources(1, 30, 20, 1.5); - private final NodeResources docker2Resources = new NodeResources(2, 40, 40, 0.5); + private final NodeResources resources0 = new NodeResources(1, 30, 20, 1.5); + private final NodeResources resources1 = new NodeResources(2, 40, 40, 0.5); @Before public void setup() { @@ -45,49 +45,49 @@ public class HostCapacityTest { // Create flavors NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies("host", "docker", "docker2"); - // Create three docker hosts - host1 = Node.create("host1", IP.Config.of(Set.of("::1"), generateIPs(2, 4), List.of()), "host1", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); - host2 = Node.create("host2", IP.Config.of(Set.of("::11"), generateIPs(12, 3), List.of()), "host2", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); - host3 = Node.create("host3", IP.Config.of(Set.of("::21"), generateIPs(22, 1), List.of()), "host3", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); + // Create three hosts + host1 = Node.create("host1", IP.Config.of(Set.of("::1"), createIps(2, 4), List.of()), "host1", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); + host2 = Node.create("host2", IP.Config.of(Set.of("::11"), createIps(12, 3), List.of()), "host2", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); + host3 = Node.create("host3", IP.Config.of(Set.of("::21"), createIps(22, 1), List.of()), "host3", nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); // Add two containers to host1 - var nodeA = Node.createDockerNode(Set.of("::2"), "nodeA", "host1", dockerResources, NodeType.tenant).build(); - var nodeB = Node.createDockerNode(Set.of("::3"), "nodeB", "host1", dockerResources, NodeType.tenant).build(); + var nodeA = Node.reserve(Set.of("::2"), "nodeA", "host1", resources0, NodeType.tenant).build(); + var nodeB = Node.reserve(Set.of("::3"), "nodeB", "host1", resources0, NodeType.tenant).build(); // Add two containers to host 2 (same as host 1) - var nodeC = Node.createDockerNode(Set.of("::12"), "nodeC", "host2", dockerResources, NodeType.tenant).build(); - var nodeD = Node.createDockerNode(Set.of("::13"), "nodeD", "host2", dockerResources, NodeType.tenant).build(); + var nodeC = Node.reserve(Set.of("::12"), "nodeC", "host2", resources0, NodeType.tenant).build(); + var nodeD = Node.reserve(Set.of("::13"), "nodeD", "host2", resources0, NodeType.tenant).build(); // Add a larger container to host3 - var nodeE = Node.createDockerNode(Set.of("::22"), "nodeE", "host3", docker2Resources, NodeType.tenant).build(); + var nodeE = Node.reserve(Set.of("::22"), "nodeE", "host3", resources1, NodeType.tenant).build(); - // init docker host capacity + // init host capacity nodes = new ArrayList<>(List.of(host1, host2, host3, nodeA, nodeB, nodeC, nodeD, nodeE)); capacity = new HostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); } @Test public void hasCapacity() { - assertTrue(capacity.hasCapacity(host1, dockerResources)); - assertTrue(capacity.hasCapacity(host1, docker2Resources)); - assertTrue(capacity.hasCapacity(host2, dockerResources)); - assertTrue(capacity.hasCapacity(host2, docker2Resources)); - assertFalse(capacity.hasCapacity(host3, dockerResources)); // No ip available - assertFalse(capacity.hasCapacity(host3, docker2Resources)); // No ip available + assertTrue(capacity.hasCapacity(host1, resources0)); + assertTrue(capacity.hasCapacity(host1, resources1)); + assertTrue(capacity.hasCapacity(host2, resources0)); + assertTrue(capacity.hasCapacity(host2, resources1)); + assertFalse(capacity.hasCapacity(host3, resources0)); // No ip available + assertFalse(capacity.hasCapacity(host3, resources1)); // No ip available // Add a new node to host1 to deplete the memory resource - Node nodeF = Node.createDockerNode(Set.of("::6"), "nodeF", "host1", dockerResources, NodeType.tenant).build(); + Node nodeF = Node.reserve(Set.of("::6"), "nodeF", "host1", resources0, NodeType.tenant).build(); nodes.add(nodeF); capacity = new HostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); - assertFalse(capacity.hasCapacity(host1, dockerResources)); - assertFalse(capacity.hasCapacity(host1, docker2Resources)); + assertFalse(capacity.hasCapacity(host1, resources0)); + assertFalse(capacity.hasCapacity(host1, resources1)); } @Test public void freeIPs() { - assertEquals(2, capacity.freeIPs(host1)); - assertEquals(1, capacity.freeIPs(host2)); - assertEquals(0, capacity.freeIPs(host3)); + assertEquals(2, capacity.freeIps(host1)); + assertEquals(1, capacity.freeIps(host2)); + assertEquals(0, capacity.freeIps(host3)); } @Test @@ -113,58 +113,58 @@ public class HostCapacityTest { // 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", nodeFlavors.getFlavorOrThrow("devhost"), NodeType.devhost).build(); + var devHost = Node.create("devhost", new IP.Config(Set.of("::1"), createIps(2, 10)), "devhost", nodeFlavors.getFlavorOrThrow("devhost"), NodeType.devhost).build(); - var cfg = Node.createDockerNode(Set.of("::2"), "cfg", "devhost", dockerResources, NodeType.config).build(); + var cfg = Node.reserve(Set.of("::2"), "cfg", "devhost", resources0, NodeType.config).build(); var nodes = new ArrayList<>(List.of(cfg)); var capacity = new HostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); - assertTrue(capacity.hasCapacity(devHost, dockerResources)); + assertTrue(capacity.hasCapacity(devHost, resources0)); - var container1 = Node.createDockerNode(Set.of("::3"), "container1", "devhost", dockerResources, NodeType.tenant).build(); + var container1 = Node.reserve(Set.of("::3"), "container1", "devhost", resources0, NodeType.tenant).build(); nodes = new ArrayList<>(List.of(cfg, container1)); capacity = new HostCapacity(new LockedNodeList(nodes, () -> {}), hostResourcesCalculator); - assertFalse(capacity.hasCapacity(devHost, dockerResources)); + assertFalse(capacity.hasCapacity(devHost, resources0)); } @Test public void verifyCapacityFromAddresses() { - Node nodeA = Node.createDockerNode(Set.of("::2"), "nodeA", "host1", dockerResources, NodeType.tenant).build(); - Node nodeB = Node.createDockerNode(Set.of("::3"), "nodeB", "host1", dockerResources, NodeType.tenant).build(); - Node nodeC = Node.createDockerNode(Set.of("::4"), "nodeC", "host1", dockerResources, NodeType.tenant).build(); + Node nodeA = Node.reserve(Set.of("::2"), "nodeA", "host1", resources0, NodeType.tenant).build(); + Node nodeB = Node.reserve(Set.of("::3"), "nodeB", "host1", resources0, NodeType.tenant).build(); + Node nodeC = Node.reserve(Set.of("::4"), "nodeC", "host1", resources0, NodeType.tenant).build(); // host1 is a host with resources = 7-100-120-5 (7 vcpus, 100G memory, 120G disk, and 5Gbps), - // while nodeA-C have resources = dockerResources = 1-30-20-1.5 + // while nodeA-C have resources = resources0 = 1-30-20-1.5 Node host1 = setupHostWithAdditionalHostnames("host1", "nodeA"); // Allocating nodeA should be OK - assertTrue(hasCapacity(dockerResources, host1)); + assertTrue(hasCapacity(resources0, host1)); // then, the second node lacks hostname address - assertFalse(hasCapacity(dockerResources, host1, nodeA)); + assertFalse(hasCapacity(resources0, host1, nodeA)); host1 = setupHostWithAdditionalHostnames("host1", "nodeA", "nodeB"); // Allocating nodeA and nodeB should be OK - assertTrue(hasCapacity(dockerResources, host1)); - assertTrue(hasCapacity(dockerResources, host1, nodeA)); + assertTrue(hasCapacity(resources0, host1)); + assertTrue(hasCapacity(resources0, host1, nodeA)); // but the third node lacks hostname address - assertFalse(hasCapacity(dockerResources, host1, nodeA, nodeB)); + assertFalse(hasCapacity(resources0, host1, nodeA, nodeB)); host1 = setupHostWithAdditionalHostnames("host1", "nodeA", "nodeB", "nodeC"); // Allocating nodeA, nodeB, and nodeC should be OK - assertTrue(hasCapacity(dockerResources, host1)); - assertTrue(hasCapacity(dockerResources, host1, nodeA)); - assertTrue(hasCapacity(dockerResources, host1, nodeA, nodeB)); + assertTrue(hasCapacity(resources0, host1)); + assertTrue(hasCapacity(resources0, host1, nodeA)); + assertTrue(hasCapacity(resources0, host1, nodeA, nodeB)); // but the fourth node lacks hostname address - assertFalse(hasCapacity(dockerResources, host1, nodeA, nodeB, nodeC)); + assertFalse(hasCapacity(resources0, host1, nodeA, nodeB, nodeC)); host1 = setupHostWithAdditionalHostnames("host1", "nodeA", "nodeB", "nodeC", "nodeD"); // Allocating nodeA, nodeB, and nodeC should be OK - assertTrue(hasCapacity(dockerResources, host1)); - assertTrue(hasCapacity(dockerResources, host1, nodeA)); - assertTrue(hasCapacity(dockerResources, host1, nodeA, nodeB)); + assertTrue(hasCapacity(resources0, host1)); + assertTrue(hasCapacity(resources0, host1, nodeA)); + assertTrue(hasCapacity(resources0, host1, nodeA, nodeB)); // but the fourth lacks memory (host has 100G, while 4x30G = 120G - assertFalse(hasCapacity(dockerResources, host1, nodeA, nodeB, nodeC)); + assertFalse(hasCapacity(resources0, host1, nodeA, nodeB, nodeC)); } private Node setupHostWithAdditionalHostnames(String hostHostname, String... additionalHostnames) { @@ -175,7 +175,7 @@ public class HostCapacityTest { NodeFlavors nodeFlavors = FlavorConfigBuilder.createDummies( "host", // 7-100-120-5 - "docker"); // 2- 40- 40-0.5 = docker2Resources + "docker"); // 2- 40- 40-0.5 = resources1 return Node.create(hostHostname, IP.Config.of(Set.of("::1"), Set.of(), addresses), hostHostname, nodeFlavors.getFlavorOrThrow("host"), NodeType.host).build(); @@ -187,7 +187,7 @@ public class HostCapacityTest { return capacity.hasCapacity(host, requestedCapacity); } - private Set<String> generateIPs(int start, int count) { + private Set<String> createIps(int start, int count) { // Allow 4 containers Set<String> ipAddressPool = new LinkedHashSet<>(); for (int i = start; i < (start + count); i++) { |