summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorolaaun <olaa@oath.com>2019-02-13 14:35:30 +0100
committerGitHub <noreply@github.com>2019-02-13 14:35:30 +0100
commitcd586570d4ee78be18f6f19d27d167993281882c (patch)
tree26a6bd9a3aa424a36da1384e319bb09dee8f57bd /node-repository
parentaf9e6a485a69ce0a39a1e94f0915189d360b1291 (diff)
Added patchable model Id field. (#8442)
* Added patchable modelId field. * Fixed some tests * Misc fixes
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/Node.java20
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeSerializer.java12
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java2
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java1
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java2
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java10
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java2
8 files changed, 45 insertions, 6 deletions
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 b2597e9cc50..e2d4aaca59d 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
@@ -40,6 +40,7 @@ public final class Node {
private final State state;
private final NodeType type;
private final Reports reports;
+ private final Optional<String> modelId;
/** Record of the last event of each type happening to this node */
private final History history;
@@ -71,7 +72,7 @@ public final class Node {
*/
public Node(String id, Set<String> ipAddresses, Set<String> ipAddressPool, String hostname, Optional<String> parentHostname,
Flavor flavor, Status status, State state, Optional<Allocation> allocation, History history, NodeType type,
- Reports reports) {
+ Reports reports, Optional<String> modelId) {
Objects.requireNonNull(id, "A node must have an ID");
requireNonEmptyString(hostname, "A node must have a hostname");
requireNonEmptyString(parentHostname, "A parent host name must be a proper value");
@@ -82,6 +83,7 @@ public final class Node {
Objects.requireNonNull(history, "A null node history is not permitted");
Objects.requireNonNull(type, "A null node type is not permitted");
Objects.requireNonNull(reports, "A null reports is not permitted");
+ Objects.requireNonNull(modelId, "A null modelId is not permitted");
if (state == State.active)
requireNonEmpty(ipAddresses, "An active node must have at least one valid IP address");
@@ -98,6 +100,7 @@ public final class Node {
this.history = history;
this.type = type;
this.reports = reports;
+ this.modelId = modelId;
}
/** Helper for creating and mutating node objects. */
@@ -110,6 +113,7 @@ public final class Node {
private Flavor flavor;
private Set<String> ipAddresses;
+ private Optional<String> modelId = Optional.empty();
private Set<String> ipAddressPool = Collections.emptySet();
private Optional<String> parentHostname = Optional.empty();
private Status status = Status.initial();
@@ -142,6 +146,11 @@ public final class Node {
return this;
}
+ public Builder withModelId(Optional<String> modelId) {
+ this.modelId = modelId;
+ return this;
+ }
+
public Builder withType(NodeType nodeType) {
this.type = nodeType;
return this;
@@ -203,7 +212,7 @@ public final class Node {
public Node build() {
return new Node(id, ipAddresses, ipAddressPool, hostname, parentHostname, flavor, status,
- state, allocation, history, type, reports);
+ state, allocation, history, type, reports, modelId);
}
}
@@ -262,6 +271,9 @@ public final class Node {
/** Returns all the reports on this node. */
public Reports reports() { return reports; }
+ /** Returns the hardware model of this node */
+ public Optional<String> modelId() { return modelId; }
+
/**
* Returns a copy of this node with wantToRetire set to the given value and updated history.
* If given wantToRetire is equal to the current, the method is no-op.
@@ -333,6 +345,10 @@ public final class Node {
return new Builder(this).withId(openStackId).build();
}
+ public Node withModelId(String modelId) {
+ return new Builder(this).withModelId(Optional.of(modelId)).build();
+ }
+
/** Returns a copy of this with a history record saying it was detected to be down at this instant */
public Node downAt(Instant instant) {
return new Builder(this).withHistoryEvent(History.Event.Type.down, Agent.system, instant).build();
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
index 281da191603..de8fb703462 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/CuratorDatabaseClient.java
@@ -212,7 +212,7 @@ public class CuratorDatabaseClient {
toState,
toState.isAllocated() ? node.allocation() : Optional.empty(),
node.history().recordStateTransition(node.state(), toState, agent, clock.instant()),
- node.type(), node.reports());
+ node.type(), node.reports(), node.modelId());
curatorTransaction.add(CuratorOperations.delete(toPath(node).getAbsolute()))
.add(CuratorOperations.create(toPath(toState, newNode.hostname()).getAbsolute(), nodeSerializer.toJson(newNode)));
writtenNodes.add(newNode);
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 7f1beee27b5..8f0f10cd9a1 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
@@ -64,6 +64,7 @@ public class NodeSerializer {
private static final String osVersionKey = "osVersion";
private static final String firmwareCheckKey = "firmwareCheck";
private static final String reportsKey = "reports";
+ private static final String modelIdKey = "modelId";
// Configuration fields
private static final String flavorKey = "flavor";
@@ -123,6 +124,7 @@ public class NodeSerializer {
node.status().osVersion().ifPresent(version -> object.setString(osVersionKey, version.toString()));
node.status().firmwareVerifiedAt().ifPresent(instant -> object.setLong(firmwareCheckKey, instant.toEpochMilli()));
node.reports().toSlime(object, reportsKey);
+ node.modelId().ifPresent(modelId -> object.setString(modelIdKey, modelId));
}
private void toSlime(Allocation allocation, Cursor object) {
@@ -170,7 +172,8 @@ public class NodeSerializer {
allocationFromSlime(object.field(instanceKey)),
historyFromSlime(object.field(historyKey)),
nodeTypeFromString(object.field(nodeTypeKey).asString()),
- Reports.fromSlime(object.field(reportsKey)));
+ Reports.fromSlime(object.field(reportsKey)),
+ modelIdFromSlime(object));
}
private Status statusFromSlime(Inspector object) {
@@ -275,6 +278,13 @@ public class NodeSerializer {
return Optional.empty();
}
+ private Optional<String> modelIdFromSlime(Inspector object) {
+ if (object.field(modelIdKey).valid()) {
+ return Optional.of(object.field(modelIdKey).asString());
+ }
+ return Optional.empty();
+ }
+
// ----------------- Enum <-> string mappings ----------------------------------------
/** Returns the event type, or null if this event type should be ignored */
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java
index 28ba6a59d41..29dd8646939 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodePatcher.java
@@ -144,6 +144,8 @@ public class NodePatcher {
return nodeWithPatchedReports(node, value);
case "openStackId" :
return node.withOpenStackId(asString(value));
+ case "modelId":
+ return node.withModelId(asString(value));
default :
throw new IllegalArgumentException("Could not apply field '" + name + "' on a node: No such modifiable field");
}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java
index 5b942497be8..55da42c7ebb 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java
@@ -187,6 +187,7 @@ class NodesResponse extends HttpResponse {
ipAddressesToSlime(node.ipAddressPool().asSet(), object.setArray("additionalIpAddresses"));
node.status().hardwareDivergence().ifPresent(hardwareDivergence -> object.setString("hardwareDivergence", hardwareDivergence));
node.reports().toSlime(object, "reports");
+ node.modelId().ifPresent(modelId -> object.setString("modelId", modelId));
}
private void toSlime(ApplicationId id, Cursor object) {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java
index ebfb838fafa..1857a4ad74d 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/maintenance/HostProvisionMaintainerTest.java
@@ -144,7 +144,7 @@ public class HostProvisionMaintainerTest {
false));
Set<String> ips = state == Node.State.active ? Set.of("::1") : Set.of();
return new Node("fake-id-" + hostname, ips, Set.of(), hostname,
- parentHostname, flavor, Status.initial(), state, allocation, History.empty(), nodeType, new Reports());
+ parentHostname, flavor, Status.initial(), state, allocation, History.empty(), nodeType, new Reports(), Optional.empty());
}
NodeRepository nodeRepository() {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
index 74c53e72030..beec8d19a2e 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/persistence/SerializationTest.java
@@ -361,6 +361,16 @@ public class SerializationTest {
assertEquals(Type.NIX, report.getInspector().field("bogus").type());
}
+ @Test
+ public void model_id_serialization() {
+ Node node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(createNode()));
+ assertFalse(node.modelId().isPresent());
+
+ node = node.withModelId("some model");
+ node = nodeSerializer.fromJson(State.active, nodeSerializer.toJson(node));
+ assertEquals("some model", node.modelId().get());
+ }
+
private byte[] createNodeJson(String hostname, String... ipAddress) {
String ipAddressJsonPart = "";
if (ipAddress.length > 0) {
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java
index 4e211145e20..78fbca554f0 100644
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/provisioning/AllocationSimulator.java
@@ -83,7 +83,7 @@ public class AllocationSimulator {
return new Node("fake", Collections.singleton("127.0.0.1"),
parent.isPresent() ? Collections.emptySet() : getAdditionalIP(), hostname, parent, flavor, Status.initial(),
parent.isPresent() ? Node.State.ready : Node.State.active, allocation(tenant), History.empty(),
- parent.isPresent() ? NodeType.tenant : NodeType.host, new Reports());
+ parent.isPresent() ? NodeType.tenant : NodeType.host, new Reports(), Optional.empty());
}
private Set<String> getAdditionalIP() {