summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--athenz-identity-provider-service/src/test/java/com/yahoo/vespa/hosted/athenz/instanceproviderservice/identitydocument/IdentityDocumentGeneratorTest.java10
-rw-r--r--config-provisioning/src/main/java/com/yahoo/config/provision/NodeType.java35
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/NodeRepository.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/FailedExpirer.java4
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporter.java10
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeFailer.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/RetiredExpirer.java11
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/IP.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/NodeAcl.java7
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/GroupPreparer.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacity.java49
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodeCandidate.java10
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/NodePrioritizer.java1
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisionedHost.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java14
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/DynamicDockerProvisionTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/HostCapacityTest.java96
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++) {