diff options
author | olaaun <olaa@oath.com> | 2019-02-13 14:35:30 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-13 14:35:30 +0100 |
commit | cd586570d4ee78be18f6f19d27d167993281882c (patch) | |
tree | 26a6bd9a3aa424a36da1384e319bb09dee8f57bd /node-repository | |
parent | af9e6a485a69ce0a39a1e94f0915189d360b1291 (diff) |
Added patchable model Id field. (#8442)
* Added patchable modelId field.
* Fixed some tests
* Misc fixes
Diffstat (limited to 'node-repository')
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() { |