summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2023-01-04 11:07:39 +0100
committerMartin Polden <mpolden@mpolden.no>2023-01-10 12:47:08 +0100
commit0433a3ae96b1200f24385ce24a4b7e58b6a4c723 (patch)
tree928badf4f3975a34eabcbcaba995b8ff8346e34e /node-repository
parentc6191deb7c5fd1501c1d07b3cae0c8e8b9486434 (diff)
Read node objects from unified path
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java3
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java3
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/IP.java3
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/node/Nodes.java35
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CachingCurator.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java68
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java14
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java14
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java3
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/MetricsReporterTest.java7
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java13
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDbTest.java6
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java104
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java13
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java8
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/ProvisioningTester.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/active-nodes.json22
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2-nodes.json4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/content-nodes.json4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes-recursive.json4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes.json4
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json24
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive.json22
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes.json38
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/states-recursive.json22
27 files changed, 210 insertions, 238 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java
index a94adc5aaae..bcc571355e3 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/MaintenanceDeployment.java
@@ -190,7 +190,8 @@ class MaintenanceDeployment implements Closeable {
markPreferToRetire(node, false, agent, nodeRepository); // Necessary if this failed, no-op otherwise
// Immediately clean up if we reserved the node but could not activate or reserved a node on the wrong host
- expectedNewNode.flatMap(node -> nodeRepository.nodes().node(node.hostname(), Node.State.reserved))
+ expectedNewNode.flatMap(node -> nodeRepository.nodes().node(node.hostname()))
+ .filter(node -> node.state() == Node.State.reserved)
.ifPresent(node -> nodeRepository.nodes().deallocate(node, agent, "Expired by " + agent));
}
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java
index b602d2ac7cd..94683d463af 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/maintenance/NodeHealthTracker.java
@@ -96,7 +96,8 @@ public class NodeHealthTracker extends NodeRepositoryMaintainer {
/** Get node by given hostname and application. The applicationLock must be held when calling this */
private Optional<Node> getNode(String hostname, ApplicationId application, @SuppressWarnings("unused") Mutex applicationLock) {
- return nodeRepository().nodes().node(hostname, Node.State.active)
+ return nodeRepository().nodes().node(hostname)
+ .filter(node -> node.state() == Node.State.active)
.filter(node -> node.allocation().isPresent())
.filter(node -> node.allocation().get().owner().equals(application));
}
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 c0d0b220767..b2becc7ecfd 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
@@ -131,8 +131,9 @@ public class IP {
* @throws IllegalArgumentException if there are IP conflicts with existing nodes
*/
public static List<Node> verify(List<Node> nodes, LockedNodeList allNodes) {
+ NodeList sortedNodes = allNodes.sortedBy(Comparator.comparing(Node::hostname));
for (var node : nodes) {
- for (var other : allNodes) {
+ for (var other : sortedNodes) {
if (node.equals(other)) continue;
if (canAssignIpOf(other, node)) continue;
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 b507d66e14f..5c2a6601ad8 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
@@ -76,11 +76,11 @@ public class Nodes {
public void rewrite() {
Instant start = clock.instant();
int nodesWritten = 0;
- for (Node.State state : Node.State.values()) {
- List<Node> nodes = db.readNodes(state);
+ Map<Node.State, NodeList> nodes = list().groupingBy(Node::state);
+ for (var kv : nodes.entrySet()) {
// TODO(mpolden): This should take the lock before writing
- db.writeTo(state, nodes, Agent.system, Optional.empty());
- nodesWritten += nodes.size();
+ db.writeTo(kv.getKey(), kv.getValue().asList(), Agent.system, Optional.empty());
+ nodesWritten += kv.getValue().size();
}
Instant end = clock.instant();
log.log(Level.INFO, String.format("Rewrote %d nodes in %s", nodesWritten, Duration.between(start, end)));
@@ -88,24 +88,19 @@ public class Nodes {
// ---------------- Query API ----------------------------------------------------------------
- /**
- * Finds and returns the node with the hostname in any of the given states, or empty if not found
- *
- * @param hostname the full host name of the node
- * @param inState the states the node may be in. If no states are given, it will be returned from any state
- * @return the node, or empty if it was not found in any of the given states
- */
- public Optional<Node> node(String hostname, Node.State... inState) {
- return db.readNode(hostname, inState);
+ /** Finds and returns the node with given hostname, or empty if not found */
+ public Optional<Node> node(String hostname) {
+ return db.readNode(hostname);
}
/**
- * Returns a list of nodes in this repository in any of the given states
+ * Returns an unsorted list of all nodes in this repository, in any of the given states
*
- * @param inState the states to return nodes from. If no states are given, all nodes of the given type are returned
+ * @param inState the states to return nodes from. If no states are given, all nodes are returned
*/
public NodeList list(Node.State... inState) {
- return NodeList.copyOf(db.readNodes(inState));
+ NodeList nodes = NodeList.copyOf(db.readNodes());
+ return inState.length == 0 ? nodes : nodes.state(Set.of(inState));
}
/** Returns a locked list of all nodes in this repository */
@@ -768,13 +763,9 @@ public class Nodes {
for (int i = 0; i < maxRetries; ++i) {
Mutex lockToClose = lock(staleNode, timeout);
try {
- // As an optimization we first try finding the node in the same state
- Optional<Node> freshNode = node(staleNode.hostname(), staleNode.state());
+ Optional<Node> freshNode = node(staleNode.hostname());
if (freshNode.isEmpty()) {
- freshNode = node(staleNode.hostname());
- if (freshNode.isEmpty()) {
- return Optional.empty();
- }
+ return Optional.empty();
}
if (node.type() != NodeType.tenant ||
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CachingCurator.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CachingCurator.java
index 90d30a3a8bc..589468c48b8 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CachingCurator.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CachingCurator.java
@@ -208,7 +208,7 @@ public class CachingCurator {
List<String> getChildren(Path path);
/**
- * Returns the a copy of the content of this child - which may be empty.
+ * Returns a copy of the content of this child - which may be empty.
*/
Optional<byte[]> getData(Path path);
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java
index cebc185360a..b9821b48fba 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDb.java
@@ -96,7 +96,7 @@ public class CuratorDb {
db.create(nodesPath);
// TODO(mpolden): Remove state paths after migration to nodesPath
for (Node.State state : Node.State.values())
- db.create(toPath(state));
+ db.create(toLegacyPath(state));
db.create(applicationsPath);
db.create(inactiveJobsPath);
db.create(infrastructureVersionsPath);
@@ -117,7 +117,7 @@ public class CuratorDb {
node = node.with(node.history().recordStateTransition(null, expectedState, agent, clock.instant()));
// TODO(mpolden): Remove after migration to nodesPath
byte[] serialized = nodeSerializer.toJson(node);
- curatorTransaction.add(CuratorOperations.create(toPath(node).getAbsolute(), serialized));
+ curatorTransaction.add(CuratorOperations.create(toLegacyPath(node).getAbsolute(), serialized));
curatorTransaction.add(CuratorOperations.create(nodePath(node).getAbsolute(), serialized));
}
@@ -137,7 +137,7 @@ public class CuratorDb {
/** Removes given nodes in transaction */
public void removeNodes(List<Node> nodes, NestedTransaction transaction) {
for (Node node : nodes) {
- Path path = toPath(node.state(), node.hostname());
+ Path path = toLegacyPath(node.state(), node.hostname());
CuratorTransaction curatorTransaction = db.newCuratorTransactionIn(transaction);
// TODO(mpolden): Remove after migration to nodesPath
curatorTransaction.add(CuratorOperations.delete(path.getAbsolute()));
@@ -237,8 +237,8 @@ public class CuratorDb {
private void writeNode(Node.State toState, CuratorTransaction curatorTransaction, Node node, Node newNode) {
byte[] nodeData = nodeSerializer.toJson(newNode);
{ // TODO(mpolden): Remove this after migration to nodesPath
- String currentNodePath = toPath(node).getAbsolute();
- String newNodePath = toPath(toState, newNode.hostname()).getAbsolute();
+ String currentNodePath = toLegacyPath(node).getAbsolute();
+ String newNodePath = toLegacyPath(toState, newNode.hostname()).getAbsolute();
if (newNodePath.equals(currentNodePath)) {
curatorTransaction.add(CuratorOperations.setData(currentNodePath, nodeData));
} else {
@@ -255,61 +255,39 @@ public class CuratorDb {
return node.status();
}
- /**
- * Returns all nodes which are in one of the given states.
- * If no states are given this returns all nodes.
- *
- * @return the nodes in a mutable list owned by the caller
- */
- public List<Node> readNodes(Node.State ... states) {
- List<Node> nodes = new ArrayList<>();
- if (states.length == 0)
- states = Node.State.values();
+ /** Returns all existing nodes */
+ public List<Node> readNodes() {
CachingCurator.Session session = db.getSession();
- for (Node.State state : states) {
- for (String hostname : session.getChildren(toPath(state))) {
- Optional<Node> node = readNode(session, hostname, state);
- node.ifPresent(nodes::add); // node might disappear between getChildren and getNode
- }
- }
- return nodes;
+ return session.getChildren(nodesPath).stream()
+ .flatMap(hostname -> readNode(session, hostname).stream())
+ .toList();
}
- /**
- * Returns a particular node, or empty if this node is not in any of the given states.
- * If no states are given this returns the node if it is present in any state.
- */
- public Optional<Node> readNode(CachingCurator.Session session, String hostname, Node.State ... states) {
- if (states.length == 0)
- states = Node.State.values();
- for (Node.State state : states) {
- Optional<byte[]> nodeData = session.getData(toPath(state, hostname));
- if (nodeData.isPresent())
- return nodeData.map((data) -> nodeSerializer.fromJson(state, data));
- }
- return Optional.empty();
+ private Optional<Node> readNode(CachingCurator.Session session, String hostname) {
+ return session.getData(nodePath(hostname)).map(nodeSerializer::fromJson);
}
- /**
- * Returns a particular node, or empty if this noe is not in any of the given states.
- * If no states are given this returns the node if it is present in any state.
- */
- public Optional<Node> readNode(String hostname, Node.State ... states) {
- return readNode(db.getSession(), hostname, states);
+ /** Read node with given hostname, if any such node exists */
+ public Optional<Node> readNode(String hostname) {
+ return readNode(db.getSession(), hostname);
}
- private Path toPath(Node.State nodeState) { return root.append(toDir(nodeState)); }
+ private Path toLegacyPath(Node.State nodeState) { return root.append(toDir(nodeState)); }
- private Path toPath(Node node) {
+ private Path toLegacyPath(Node node) {
return root.append(toDir(node.state())).append(node.hostname());
}
- private Path toPath(Node.State nodeState, String nodeName) {
+ private Path toLegacyPath(Node.State nodeState, String nodeName) {
return root.append(toDir(nodeState)).append(nodeName);
}
private Path nodePath(Node node) {
- return nodesPath.append(node.hostname());
+ return nodePath(node.hostname());
+ }
+
+ private Path nodePath(String hostname) {
+ return nodesPath.append(hostname);
}
/** Creates and returns the path to the lock for this application */
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java
index f448266b94b..39cccafb8ef 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java
@@ -40,7 +40,6 @@ import com.yahoo.vespa.hosted.provision.node.Status;
import com.yahoo.vespa.hosted.provision.node.TrustStoreItem;
import java.io.IOException;
-import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
@@ -266,19 +265,16 @@ public class NodeSerializer {
// ---------------- Deserialization --------------------------------------------------
- public Node fromJson(Node.State state, byte[] data) {
- long key = Hashing.sipHash24().newHasher()
- .putString(state.name(), StandardCharsets.UTF_8)
- .putBytes(data).hash()
- .asLong();
+ public Node fromJson(byte[] data) {
+ long key = Hashing.sipHash24().newHasher().putBytes(data).hash().asLong();
try {
- return cache.get(key, () -> nodeFromSlime(state, SlimeUtils.jsonToSlime(data).get()));
+ return cache.get(key, () -> nodeFromSlime(SlimeUtils.jsonToSlime(data).get()));
} catch (ExecutionException e) {
throw new UncheckedExecutionException(e);
}
}
- private Node nodeFromSlime(Node.State state, Inspector object) {
+ private Node nodeFromSlime(Inspector object) {
Flavor flavor = flavorFromSlime(object);
return new Node(object.field(idKey).asString(),
new IP.Config(ipAddressesFromSlime(object, ipAddressesKey),
@@ -288,7 +284,7 @@ public class NodeSerializer {
SlimeUtils.optionalString(object.field(parentHostnameKey)),
flavor,
statusFromSlime(object),
- state,
+ nodeStateFromString(object.field(stateKey).asString()),
allocationFromSlime(flavor.resources(), object.field(instanceKey)),
historyFromSlime(object),
nodeTypeFromString(object.field(nodeTypeKey).asString()),
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
index 942f029bc6a..fd466108063 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/NodesResponse.java
@@ -105,16 +105,12 @@ class NodesResponse extends SlimeJsonResponse {
}
/** Outputs the nodes in the given states to a node array */
- private void nodesToSlime(Set<Node.State> statesToRead, Cursor parentObject) {
+ private void nodesToSlime(Set<Node.State> states, Cursor parentObject) {
Cursor nodeArray = parentObject.setArray("nodes");
- boolean sortByNodeType = statesToRead.size() == 1;
- statesToRead.stream().sorted().forEach(state -> {
- NodeList nodes = nodeRepository.nodes().list(state);
- if (sortByNodeType) {
- nodes = nodes.sortedBy(Comparator.comparing(Node::type));
- }
- toSlime(nodes, nodeArray);
- });
+ NodeList nodes = nodeRepository.nodes().list()
+ .state(states)
+ .sortedBy(Comparator.comparing(Node::hostname));
+ toSlime(nodes, nodeArray);
}
private void toSlime(NodeList nodes, Cursor array) {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java
index 0a179babc10..7d9a48f6773 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/NodeRepositoryTest.java
@@ -214,8 +214,6 @@ public class NodeRepositoryTest {
tester.addHost("id2", "host1", "default", NodeType.host);
host1 = tester.nodeRepository().nodes().node("host1").get();
assertEquals("This is the newly added node", "id2", host1.id());
- assertFalse("The old 'host1' is removed",
- tester.nodeRepository().nodes().node("host1", Node.State.deprovisioned).isPresent());
assertFalse("Not transferred from deprovisioned host", host1.status().wantToRetire());
assertFalse("Not transferred from deprovisioned host", host1.status().wantToDeprovision());
assertTrue("Transferred from deprovisioned host", host1.history().hasEventAfter(History.Event.Type.deprovisioned, testStart));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java
index e569e9b0382..dc1e1320ff2 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/RealDataScenarioTest.java
@@ -48,7 +48,6 @@ import java.util.function.Consumer;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import java.util.stream.Collectors;
import java.util.stream.IntStream;
import static com.yahoo.config.provision.NodeResources.DiskSpeed.any;
@@ -142,7 +141,7 @@ public class RealDataScenarioTest {
Consumer<String> consumer = input -> {
if (state.get() != null) {
String json = input.substring(input.indexOf("{\""), input.lastIndexOf('}') + 1);
- Node node = nodeSerializer.fromJson(state.get(), json.getBytes(UTF_8));
+ Node node = nodeSerializer.fromJson(json.getBytes(UTF_8));
nodeRepository.database().addNodesInState(List.of(node), state.get(), Agent.system);
state.set(null);
} else {
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 4f23ea3a578..44050fa747c 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
@@ -40,7 +40,6 @@ import java.util.Map;
import java.util.Optional;
import java.util.Set;
import java.util.TreeMap;
-import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.mockito.ArgumentMatchers.any;
@@ -118,14 +117,14 @@ public class MetricsReporterTest {
expectedMetrics.put("suspendedSeconds", 123L);
expectedMetrics.put("numberOfServices", 0L);
- expectedMetrics.put("cache.nodeObject.hitRate", 0.6D);
+ expectedMetrics.put("cache.nodeObject.hitRate", 0.7142857142857143D);
expectedMetrics.put("cache.nodeObject.evictionCount", 0L);
expectedMetrics.put("cache.nodeObject.size", 2L);
nodeRepository.nodes().list();
- expectedMetrics.put("cache.curator.hitRate", 0.52D);
+ expectedMetrics.put("cache.curator.hitRate", 2D/3D);
expectedMetrics.put("cache.curator.evictionCount", 0L);
- expectedMetrics.put("cache.curator.size", 12L);
+ expectedMetrics.put("cache.curator.size", 3L);
tester.clock().setInstant(Instant.ofEpochSecond(124));
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java
index 9f9e6b85545..b5735cfae84 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/os/OsVersionsTest.java
@@ -121,17 +121,16 @@ public class OsVersionsTest {
// Activate target
for (int i = 0; i < totalNodes; i += maxActiveUpgrades) {
versions.resumeUpgradeOf(NodeType.host, true);
- var nodes = hostNodes.get();
- var nodesUpgrading = nodes.changingOsVersion();
+ NodeList nodes = hostNodes.get();
+ NodeList nodesUpgrading = nodes.changingOsVersion();
assertEquals("Target is changed for a subset of nodes", maxActiveUpgrades, nodesUpgrading.size());
assertEquals("Wanted version is set for nodes upgrading", version1,
minVersion(nodesUpgrading, OsVersion::wanted));
- var nodesOnLowestVersion = nodes.asList().stream()
- .sorted(Comparator.comparing(node -> node.status().osVersion().current().orElse(Version.emptyVersion)))
- .toList()
- .subList(0, maxActiveUpgrades);
+ NodeList nodesOnLowestVersion = nodes.sortedBy(Comparator.comparing(node -> node.status().osVersion().current().orElse(Version.emptyVersion)))
+ .first(maxActiveUpgrades);
assertEquals("Nodes on lowest version are told to upgrade",
- nodesUpgrading.asList(), nodesOnLowestVersion);
+ nodesUpgrading.hostnames(),
+ nodesOnLowestVersion.hostnames());
completeReprovisionOf(nodesUpgrading.asList());
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDbTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDbTest.java
index 42a0dd982ad..c0d6ab90f06 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDbTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDbTest.java
@@ -28,10 +28,10 @@ public class CuratorDbTest {
@Test
public void can_read_stored_host_information() throws Exception {
- String zkline = "{\"hostname\":\"host1\",\"ipAddresses\":[\"127.0.0.1\"],\"additionalIpAddresses\":[\"127.0.0.2\"],\"openStackId\":\"7951bb9d-3989-4a60-a21c-13690637c8ea\",\"flavor\":\"default\",\"created\":1421054425159, \"type\":\"host\"}";
- curator.framework().create().creatingParentsIfNeeded().forPath("/provision/v1/ready/host1", zkline.getBytes());
+ String zkline = "{\"hostname\":\"host1\",\"state\":\"ready\",\"ipAddresses\":[\"127.0.0.1\"],\"additionalIpAddresses\":[\"127.0.0.2\"],\"openStackId\":\"7951bb9d-3989-4a60-a21c-13690637c8ea\",\"flavor\":\"default\",\"created\":1421054425159, \"type\":\"host\"}";
+ curator.framework().create().creatingParentsIfNeeded().forPath("/provision/v1/nodes/host1", zkline.getBytes());
- List<Node> allocatedNodes = zkClient.readNodes(Node.State.ready);
+ List<Node> allocatedNodes = zkClient.readNodes();
assertEquals(1, allocatedNodes.size());
assertEquals(NodeType.host, allocatedNodes.get(0).type());
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java
index ab487cc7d04..d61a3d95a65 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializerTest.java
@@ -67,7 +67,7 @@ public class NodeSerializerTest {
public void provisioned_node_serialization() {
Node node = createNode();
- Node copy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ Node copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(node.hostname(), copy.hostname());
assertEquals(node.id(), copy.id());
assertEquals(node.state(), copy.state());
@@ -99,7 +99,7 @@ public class NodeSerializerTest {
node = node.downAt(Instant.ofEpochMilli(5), Agent.system)
.upAt(Instant.ofEpochMilli(6), Agent.system)
.downAt(Instant.ofEpochMilli(7), Agent.system);
- Node copy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ Node copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(node.id(), copy.id());
assertEquals(node.hostname(), copy.hostname());
@@ -129,6 +129,7 @@ public class NodeSerializerTest {
String nodeData =
"{\n" +
" \"type\" : \"tenant\",\n" +
+ " \"state\" : \"provisioned\",\n" +
" \"rebootGeneration\" : 1,\n" +
" \"currentRebootGeneration\" : 2,\n" +
" \"flavor\" : \"large\",\n" +
@@ -159,7 +160,7 @@ public class NodeSerializerTest {
" \"ipAddresses\" : [\"127.0.0.1\"]\n" +
"}";
- Node node = nodeSerializer.fromJson(Node.State.provisioned, Utf8.toBytes(nodeData));
+ Node node = nodeSerializer.fromJson(Utf8.toBytes(nodeData));
assertEquals("large", node.flavor().name());
assertEquals(1, node.status().reboot().wanted());
@@ -187,7 +188,7 @@ public class NodeSerializerTest {
assertEquals(1, node.history().events().size());
clock.advance(Duration.ofMinutes(2));
node = node.retire(Agent.application, clock.instant());
- Node copy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ Node copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(2, copy.history().events().size());
assertEquals(clock.instant().truncatedTo(MILLIS), copy.history().event(History.Event.Type.retired).get().at());
assertEquals(Agent.application,
@@ -195,34 +196,37 @@ public class NodeSerializerTest {
assertTrue(copy.allocation().get().membership().retired());
Node removable = copy.with(node.allocation().get().removable(true, true));
- Node removableCopy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(removable));
+ Node removableCopy = nodeSerializer.fromJson( nodeSerializer.toJson(removable));
assertTrue(removableCopy.allocation().get().removable());
assertTrue(removableCopy.allocation().get().reusable());
}
@Test
public void assimilated_node_deserialization() {
- Node node = nodeSerializer.fromJson(Node.State.active, ("{\n" +
- " \"type\": \"tenant\",\n" +
- " \"hostname\": \"assimilate2.vespahosted.yahoo.tld\",\n" +
- " \"ipAddresses\": [\"127.0.0.1\"],\n" +
- " \"openStackId\": \"\",\n" +
- " \"flavor\": \"ugccloud-container\",\n" +
- " \"instance\": {\n" +
- " \"tenantId\": \"by_mortent\",\n" +
- " \"applicationId\": \"ugc-assimilate\",\n" +
- " \"instanceId\": \"default\",\n" +
- " \"serviceId\": \"container/ugccloud-container/0/0\",\n" +
- " \"restartGeneration\": 0,\n" +
- " \"wantedVespaVersion\": \"6.42.2\"\n" +
- " }\n" +
- "}\n").getBytes());
+ Node node = nodeSerializer.fromJson(("""
+ {
+ "type": "tenant",
+ "hostname": "assimilate2.vespahosted.yahoo.tld",
+ "state": "provisioned",
+ "ipAddresses": ["127.0.0.1"],
+ "openStackId": "",
+ "flavor": "ugccloud-container",
+ "instance": {
+ "tenantId": "by_mortent",
+ "applicationId": "ugc-assimilate",
+ "instanceId": "default",
+ "serviceId": "container/ugccloud-container/0/0",
+ "restartGeneration": 0,
+ "wantedVespaVersion": "6.42.2"
+ }
+ }
+ """).getBytes());
assertEquals(0, node.history().events().size());
assertTrue(node.allocation().isPresent());
assertEquals("ugccloud-container", node.allocation().get().membership().cluster().id().value());
assertEquals("container", node.allocation().get().membership().cluster().type().name());
assertEquals(0, node.allocation().get().membership().cluster().group().get().index());
- Node copy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ Node copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(0, copy.history().events().size());
}
@@ -237,7 +241,7 @@ public class NodeSerializerTest {
clock.instant());
node = node.with(node.status().withFailCount(0));
- Node copy2 = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ Node copy2 = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(0, copy2.status().failCount());
}
@@ -249,7 +253,7 @@ public class NodeSerializerTest {
.parentHostname(parentHostname)
.build();
- Node deserializedNode = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(node));
+ Node deserializedNode = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(parentHostname, deserializedNode.parentHostname().get());
}
@@ -257,7 +261,7 @@ public class NodeSerializerTest {
@Test
public void serializes_multiple_ip_addresses() {
byte[] nodeWithMultipleIps = createNodeJson("node4.yahoo.tld", "127.0.0.4", "::4");
- Node deserializedNode = nodeSerializer.fromJson(State.provisioned, nodeWithMultipleIps);
+ Node deserializedNode = nodeSerializer.fromJson(nodeWithMultipleIps);
assertEquals(ImmutableSet.of("127.0.0.4", "::4"), deserializedNode.ipConfig().primary());
}
@@ -269,13 +273,13 @@ public class NodeSerializerTest {
node = node.with(node.ipConfig().withPool(IP.Pool.of(
Set.of("::1", "::2", "::3"),
List.of(new Address("a"), new Address("b"), new Address("c")))));
- Node copy = nodeSerializer.fromJson(node.state(), nodeSerializer.toJson(node));
+ Node copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(node.ipConfig().pool().ipSet(), copy.ipConfig().pool().ipSet());
assertEquals(Set.copyOf(node.ipConfig().pool().getAddressList()), Set.copyOf(copy.ipConfig().pool().getAddressList()));
// Test round-trip without address pool (handle empty pool)
node = createNode();
- copy = nodeSerializer.fromJson(node.state(), nodeSerializer.toJson(node));
+ copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(node.ipConfig().pool().ipSet(), copy.ipConfig().pool().ipSet());
assertEquals(Set.copyOf(node.ipConfig().pool().getAddressList()), Set.copyOf(copy.ipConfig().pool().getAddressList()));
}
@@ -286,11 +290,12 @@ public class NodeSerializerTest {
"{\n" +
" \"type\" : \"tenant\",\n" +
" \"flavor\" : \"large\",\n" +
+ " \"state\" : \"provisioned\",\n" +
" \"openStackId\" : \"myId\",\n" +
" \"hostname\" : \"myHostname\",\n" +
" \"ipAddresses\" : [\"127.0.0.1\"]\n" +
"}";
- Node node = nodeSerializer.fromJson(State.provisioned, Utf8.toBytes(nodeData));
+ Node node = nodeSerializer.fromJson(Utf8.toBytes(nodeData));
assertFalse(node.status().wantToRetire());
}
@@ -301,7 +306,7 @@ public class NodeSerializerTest {
node = node.with(node.flavor().with(FlavorOverrides.ofDisk(1234)), Agent.system, clock.instant());
assertEquals(1234, node.flavor().resources().diskGb(), 0);
- Node copy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ Node copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(1234, copy.flavor().resources().diskGb(), 0);
assertEquals(node, copy);
assertTrue(node.history().event(History.Event.Type.resized).isPresent());
@@ -312,21 +317,22 @@ public class NodeSerializerTest {
String nodeData =
"{\n" +
" \"type\" : \"tenant\",\n" +
+ " \"state\" : \"provisioned\",\n" +
" \"flavor\" : \"large\",\n" +
" \"openStackId\" : \"myId\",\n" +
" \"hostname\" : \"myHostname\",\n" +
" \"ipAddresses\" : [\"127.0.0.1\"]\n" +
"}";
- Node node = nodeSerializer.fromJson(State.provisioned, Utf8.toBytes(nodeData));
+ Node node = nodeSerializer.fromJson(Utf8.toBytes(nodeData));
assertFalse(node.status().wantToDeprovision());
}
@Test
public void want_to_rebuild() {
- Node node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(createNode()));
+ Node node = nodeSerializer.fromJson(nodeSerializer.toJson(createNode()));
assertFalse(node.status().wantToRebuild());
node = node.with(node.status().withWantToRetire(true, false, true));
- node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertTrue(node.status().wantToRetire());
assertFalse(node.status().wantToDeprovision());
assertTrue(node.status().wantToRebuild());
@@ -337,6 +343,7 @@ public class NodeSerializerTest {
String nodeWithWantedVespaVersion =
"{\n" +
" \"type\" : \"tenant\",\n" +
+ " \"state\" : \"provisioned\",\n" +
" \"flavor\" : \"large\",\n" +
" \"openStackId\" : \"myId\",\n" +
" \"hostname\" : \"myHostname\",\n" +
@@ -349,13 +356,13 @@ public class NodeSerializerTest {
" \"wantedVespaVersion\": \"6.42.2\"\n" +
" }\n" +
"}";
- Node node = nodeSerializer.fromJson(State.active, Utf8.toBytes(nodeWithWantedVespaVersion));
+ Node node = nodeSerializer.fromJson(Utf8.toBytes(nodeWithWantedVespaVersion));
assertEquals("6.42.2", node.allocation().get().membership().cluster().vespaVersion().toString());
}
@Test
public void os_version_serialization() {
- Node serialized = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(createNode()));
+ Node serialized = nodeSerializer.fromJson(nodeSerializer.toJson(createNode()));
assertFalse(serialized.status().osVersion().current().isPresent());
// Update OS version
@@ -364,7 +371,7 @@ public class NodeSerializerTest {
serialized.history().event(History.Event.Type.osUpgraded).isPresent());
serialized = serialized.withCurrentOsVersion(Version.fromString("7.2"), Instant.ofEpochMilli(123))
.withCurrentOsVersion(Version.fromString("7.2"), Instant.ofEpochMilli(456));
- serialized = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(serialized));
+ serialized = nodeSerializer.fromJson(nodeSerializer.toJson(serialized));
assertEquals(Version.fromString("7.2"), serialized.status().osVersion().current().get());
var osUpgradedEvents = serialized.history().events().stream()
.filter(event -> event.type() == History.Event.Type.osUpgraded)
@@ -376,11 +383,11 @@ public class NodeSerializerTest {
@Test
public void firmware_check_serialization() {
- Node node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(createNode()));
+ Node node = nodeSerializer.fromJson(nodeSerializer.toJson(createNode()));
assertFalse(node.status().firmwareVerifiedAt().isPresent());
node = node.withFirmwareVerifiedAt(Instant.ofEpochMilli(100));
- node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(100, node.status().firmwareVerifiedAt().get().toEpochMilli());
assertEquals(Instant.ofEpochMilli(100), node.history().event(History.Event.Type.firmwareVerified).get().at());
}
@@ -394,7 +401,7 @@ public class NodeSerializerTest {
@Test
public void reports_serialization() {
- Node node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(createNode()));
+ Node node = nodeSerializer.fromJson(nodeSerializer.toJson(createNode()));
assertTrue(node.reports().isEmpty());
var slime = new Slime();
@@ -407,7 +414,7 @@ public class NodeSerializerTest {
var reports = new Reports.Builder().setReport(report).build();
node = node.with(reports);
- node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
reports = node.reports();
assertFalse(reports.isEmpty());
@@ -422,11 +429,11 @@ public class NodeSerializerTest {
@Test
public void model_id_serialization() {
- Node node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(createNode()));
+ Node node = nodeSerializer.fromJson(nodeSerializer.toJson(createNode()));
assertFalse(node.modelName().isPresent());
node = node.withModelName("some model");
- node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals("some model", node.modelName().get());
}
@@ -447,7 +454,7 @@ public class NodeSerializerTest {
node = node.with(node.allocation().get().withNetworkPorts(ports));
assertTrue(node.allocation().isPresent());
assertTrue(node.allocation().get().networkPorts().isPresent());
- Node copy = nodeSerializer.fromJson(Node.State.provisioned, nodeSerializer.toJson(node));
+ Node copy = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertTrue(copy.allocation().isPresent());
assertTrue(copy.allocation().get().networkPorts().isPresent());
NetworkPorts portsCopy = node.allocation().get().networkPorts().get();
@@ -457,11 +464,11 @@ public class NodeSerializerTest {
@Test
public void switch_hostname_serialization() {
- Node node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(createNode()));
+ Node node = nodeSerializer.fromJson(nodeSerializer.toJson(createNode()));
assertFalse(node.switchHostname().isPresent());
String switchHostname = "switch0.example.com";
node = node.withSwitchHostname(switchHostname);
- node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(switchHostname, node.switchHostname().get());
}
@@ -469,25 +476,25 @@ public class NodeSerializerTest {
public void exclusive_to_serialization() {
Node.Builder builder = Node.create("myId", IP.Config.EMPTY, "myHostname",
nodeFlavors.getFlavorOrThrow("default"), NodeType.host);
- Node node = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(builder.build()));
+ Node node = nodeSerializer.fromJson(nodeSerializer.toJson(builder.build()));
assertFalse(node.exclusiveToApplicationId().isPresent());
assertFalse(node.exclusiveToClusterType().isPresent());
ApplicationId exclusiveToApp = ApplicationId.from("tenant1", "app1", "instance1");
ClusterSpec.Type exclusiveToCluster = ClusterSpec.Type.admin;
node = builder.exclusiveToApplicationId(exclusiveToApp).exclusiveToClusterType(exclusiveToCluster).build();
- node = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(exclusiveToApp, node.exclusiveToApplicationId().get());
assertEquals(exclusiveToCluster, node.exclusiveToClusterType().get());
}
@Test
public void truststore_serialization() {
- Node node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(createNode()));
+ Node node = nodeSerializer.fromJson(nodeSerializer.toJson(createNode()));
assertEquals(List.of(), node.trustedCertificates());
List<TrustStoreItem> trustStoreItems = List.of(new TrustStoreItem("foo", Instant.parse("2023-09-01T23:59:59Z")), new TrustStoreItem("bar", Instant.parse("2025-05-20T23:59:59Z")));
node = node.with(trustStoreItems);
- node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(trustStoreItems, node.trustedCertificates());
}
@@ -498,7 +505,7 @@ public class NodeSerializerTest {
.cloudAccount(account)
.exclusiveToApplicationId(ApplicationId.defaultId())
.build();
- node = nodeSerializer.fromJson(State.provisioned, nodeSerializer.toJson(node));
+ node = nodeSerializer.fromJson(nodeSerializer.toJson(node));
assertEquals(account, node.cloudAccount());
}
@@ -514,6 +521,7 @@ public class NodeSerializerTest {
return ("{\"hostname\":\"" + hostname + "\"," +
ipAddressJsonPart +
"\"openStackId\":\"myId\"," +
+ "\"state\":\"provisioned\"," +
"\"flavor\":\"default\",\"rebootGeneration\":0," +
"\"currentRebootGeneration\":0,\"failCount\":0,\"history\":[],\"type\":\"tenant\"}")
.getBytes(StandardCharsets.UTF_8);
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java
index d26ac4d3916..30a49a89e12 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AclProvisioningTest.java
@@ -196,11 +196,16 @@ public class AclProvisioningTest {
// ACL for nodes with allocation trust their respective load balancer networks, if any
for (var host : hosts) {
- var acls = tester.nodeRepository().getChildAcls(host);
+ List<NodeAcl> acls = tester.nodeRepository().getChildAcls(host);
assertEquals(2, acls.size());
- assertEquals(Set.of(), acls.get(0).trustedNetworks());
- assertEquals(application, acls.get(1).node().allocation().get().owner());
- assertEquals(lbNetworks, acls.get(1).trustedNetworks());
+ for (var acl : acls) {
+ if (acl.node().allocation().isPresent()) {
+ assertEquals(lbNetworks, acl.trustedNetworks());
+ assertEquals(application, acl.node().allocation().get().owner());
+ } else {
+ assertEquals(Set.of(), acl.trustedNetworks());
+ }
+ }
}
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
index 30bd1250430..e32643860f5 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/LoadBalancerProvisionerTest.java
@@ -85,8 +85,8 @@ public class LoadBalancerProvisionerTest {
assertEquals(4443, get(lbApp1.get().get(0).instance().get().reals(), 1).port());
// A container is failed
- Supplier<List<Node>> containers = () -> tester.getNodes(app1).container().asList();
- Node toFail = containers.get().get(0);
+ Supplier<NodeList> containers = () -> tester.getNodes(app1).container();
+ Node toFail = containers.get().first().get();
tester.nodeRepository().nodes().fail(toFail.hostname(), Agent.system, this.getClass().getSimpleName());
// Redeploying replaces failed node and removes it from load balancer
@@ -99,8 +99,8 @@ public class LoadBalancerProvisionerTest {
.map(Real::hostname)
.map(DomainName::value)
.noneMatch(hostname -> hostname.equals(toFail.hostname())));
- assertEquals(containers.get().get(0).hostname(), get(loadBalancer.instance().get().reals(), 0).hostname().value());
- assertEquals(containers.get().get(1).hostname(), get(loadBalancer.instance().get().reals(), 1).hostname().value());
+ assertEquals(containers.get().state(Node.State.active).hostnames(),
+ loadBalancer.instance().get().reals().stream().map(r -> r.hostname().value()).collect(Collectors.toSet()));
assertSame("State is unchanged", LoadBalancer.State.active, loadBalancer.state());
// Add another container cluster to first app
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 110569a371a..5e9549aafbb 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
@@ -328,7 +328,7 @@ public class ProvisioningTester {
}
public void fail(String hostname) {
- int beforeFailCount = nodeRepository.nodes().node(hostname, Node.State.active).get().status().failCount();
+ int beforeFailCount = nodeRepository.nodes().node(hostname).get().status().failCount();
Node failedNode = nodeRepository.nodes().fail(hostname, Agent.system, "Failing to unit test");
assertTrue(nodeRepository.nodes().list(Node.State.failed).nodeType(NodeType.tenant).asList().contains(failedNode));
assertEquals(beforeFailCount + 1, failedNode.status().failCount());
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java
index f5fe0e6aafd..9cc7d81055d 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodesV2ApiTest.java
@@ -796,8 +796,8 @@ public class NodesV2ApiTest {
// Filter nodes by osVersion
assertResponse(new Request("http://localhost:8080/nodes/v2/node/?osVersion=7.5.2"),
"{\"nodes\":[" +
- "{\"url\":\"http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com\"}," +
- "{\"url\":\"http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com\"}" +
+ "{\"url\":\"http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com\"}," +
+ "{\"url\":\"http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com\"}" +
"]}");
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/active-nodes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/active-nodes.json
index c46bc6acbd2..15e93ce40a0 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/active-nodes.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/active-nodes.json
@@ -1,19 +1,19 @@
{
"nodes": [
+ @include(cfg1.json),
+ @include(cfg2.json),
+ @include(docker-node1.json),
+ @include(docker-node2.json),
+ @include(docker-node3.json),
+ @include(docker-node4.json),
+ @include(docker-node5.json),
+ @include(node1.json),
@include(node10.json),
+ @include(node13.json),
@include(node14.json),
+ @include(node2.json),
@include(node4.json),
@include(node6.json),
- @include(docker-container1.json),
- @include(node13.json),
- @include(node2.json),
- @include(node1.json),
- @include(docker-node3.json),
- @include(docker-node4.json),
- @include(docker-node5.json),
- @include(docker-node2.json),
- @include(docker-node1.json),
- @include(cfg1.json),
- @include(cfg2.json)
+ @include(docker-container1.json)
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2-nodes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2-nodes.json
index 4581ecba73d..6ffdb05fa67 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2-nodes.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/application2-nodes.json
@@ -1,6 +1,6 @@
{
"nodes": [
- @include(node6.json),
- @include(node2.json)
+ @include(node2.json),
+ @include(node6.json)
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/content-nodes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/content-nodes.json
index 134d27f5717..cbf79f5b55d 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/content-nodes.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/content-nodes.json
@@ -1,8 +1,8 @@
{
"nodes": [
+ @include(node2.json),
@include(node4.json),
@include(node6.json),
- @include(docker-container1.json),
- @include(node2.json)
+ @include(docker-container1.json)
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes-recursive.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes-recursive.json
index 5c728d77920..540a0086cbf 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes-recursive.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes-recursive.json
@@ -1,6 +1,6 @@
{
"nodes": [
- @include(node3.json),
- @include(docker-node2.json)
+ @include(docker-node2.json),
+ @include(node3.json)
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes.json
index 5bbc683c92a..33fd4daa699 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/enclave-nodes.json
@@ -1,10 +1,10 @@
{
"nodes":[
{
- "url":"http://localhost:8080/nodes/v2/node/host3.yahoo.com"
+ "url":"http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com"
},
{
- "url":"http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com"
+ "url":"http://localhost:8080/nodes/v2/node/host3.yahoo.com"
}
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json
index 66b44726e7e..dc6fd3a317d 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive-include-deprovisioned.json
@@ -1,24 +1,24 @@
{
"nodes": [
- @include(node7.json),
- @include(node3.json),
- @include(node10.json),
@include(cfg1.json),
@include(cfg2.json),
+ @include(docker-node1.json),
+ @include(docker-node2.json),
@include(docker-node3.json),
- @include(node14.json),
- @include(node4.json),
@include(docker-node4.json),
- @include(node6.json),
- @include(docker-container1.json),
@include(docker-node5.json),
- @include(docker-node2.json),
+ @include(dockerhost6.json),
+ @include(node1.json),
+ @include(node10.json),
@include(node13.json),
+ @include(node14.json),
@include(node2.json),
- @include(docker-node1.json),
- @include(node1.json),
- @include(node55.json),
+ @include(node3.json),
+ @include(node4.json),
@include(node5.json),
- @include(dockerhost6.json)
+ @include(node55.json),
+ @include(node6.json),
+ @include(node7.json),
+ @include(docker-container1.json)
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive.json
index 7b52bc576ae..bd3b743e98e 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes-recursive.json
@@ -1,23 +1,23 @@
{
"nodes": [
- @include(node7.json),
- @include(node3.json),
- @include(node10.json),
@include(cfg1.json),
@include(cfg2.json),
+ @include(docker-node1.json),
+ @include(docker-node2.json),
@include(docker-node3.json),
- @include(node14.json),
- @include(node4.json),
@include(docker-node4.json),
- @include(node6.json),
- @include(docker-container1.json),
@include(docker-node5.json),
- @include(docker-node2.json),
+ @include(node1.json),
+ @include(node10.json),
@include(node13.json),
+ @include(node14.json),
@include(node2.json),
- @include(docker-node1.json),
- @include(node1.json),
+ @include(node3.json),
+ @include(node4.json),
+ @include(node5.json),
@include(node55.json),
- @include(node5.json)
+ @include(node6.json),
+ @include(node7.json),
+ @include(docker-container1.json)
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes.json
index 86da5fb6e62..8147f92df31 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/nodes.json
@@ -1,61 +1,61 @@
{
"nodes": [
{
- "url": "http://localhost:8080/nodes/v2/node/host7.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/cfg1.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host3.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/cfg2.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host10.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/cfg1.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/cfg2.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/dockerhost3.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/dockerhost3.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/dockerhost4.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host14.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/dockerhost5.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host4.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host1.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/dockerhost4.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host10.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host6.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host13.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/test-node-pool-102-2"
+ "url": "http://localhost:8080/nodes/v2/node/host14.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/dockerhost5.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host2.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/dockerhost2.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host3.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host13.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host4.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host2.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host5.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/dockerhost1.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host55.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host1.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host6.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host55.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/host7.yahoo.com"
},
{
- "url": "http://localhost:8080/nodes/v2/node/host5.yahoo.com"
+ "url": "http://localhost:8080/nodes/v2/node/test-node-pool-102-2"
}
]
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/states-recursive.json b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/states-recursive.json
index 5ece0e642f1..2bdffea108a 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/states-recursive.json
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/responses/states-recursive.json
@@ -20,21 +20,21 @@
"active": {
"url": "http://localhost:8080/nodes/v2/state/active",
"nodes": [
+ @include(cfg1.json),
+ @include(cfg2.json),
+ @include(docker-node1.json),
+ @include(docker-node2.json),
+ @include(docker-node3.json),
+ @include(docker-node4.json),
+ @include(docker-node5.json),
+ @include(node1.json),
@include(node10.json),
+ @include(node13.json),
@include(node14.json),
+ @include(node2.json),
@include(node4.json),
@include(node6.json),
- @include(docker-container1.json),
- @include(node13.json),
- @include(node2.json),
- @include(node1.json),
- @include(docker-node3.json),
- @include(docker-node4.json),
- @include(docker-node5.json),
- @include(docker-node2.json),
- @include(docker-node1.json),
- @include(cfg1.json),
- @include(cfg2.json)
+ @include(docker-container1.json)
]
},
"inactive": {