summaryrefslogtreecommitdiffstats
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
parentaf9e6a485a69ce0a39a1e94f0915189d360b1291 (diff)
Added patchable model Id field. (#8442)
* Added patchable modelId field. * Fixed some tests * Misc fixes
-rw-r--r--controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java11
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java6
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java11
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java1
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java3
-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
13 files changed, 76 insertions, 7 deletions
diff --git a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java
index e12908f6aa8..cf7b61212f3 100644
--- a/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java
+++ b/controller-api/src/main/java/com/yahoo/vespa/hosted/controller/api/integration/noderepository/NodeRepositoryNode.java
@@ -86,6 +86,8 @@ public class NodeRepositoryNode {
private NodeHistory[] history;
@JsonProperty("allowedToBeDown")
private Boolean allowedToBeDown;
+ @JsonProperty("modelId")
+ private String modelId;
public String getUrl() {
return url;
@@ -377,6 +379,14 @@ public class NodeRepositoryNode {
this.wantedOsVersion = wantedOsVersion;
}
+ public String getModelId() {
+ return modelId;
+ }
+
+ public void setModelId(String modelId) {
+ this.modelId = modelId;
+ }
+
@Override
public String toString() {
return "NodeRepositoryNode{" +
@@ -417,6 +427,7 @@ public class NodeRepositoryNode {
", description='" + description + '\'' +
", history=" + Arrays.toString(history) +
", allowedToBeDown=" + allowedToBeDown +
+ ", modelId=" + modelId +
'}';
}
}
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java
index a5635507ab7..78938e9c5b2 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java
@@ -30,6 +30,7 @@ public class NodeAttributes {
private Optional<String> hardwareDivergence = Optional.empty();
private Optional<String> hardwareFailureDescription = Optional.empty();
private Optional<Boolean> wantToDeprovision = Optional.empty();
+ private Optional<String> modelId = Optional.empty();
/** The list of reports to patch. A null value is used to remove the report. */
private Map<String, JsonNode> reports = new TreeMap<>();
@@ -84,6 +85,11 @@ public class NodeAttributes {
return this;
}
+ public NodeAttributes withModelId(String modelId) {
+ this.modelId = Optional.of(modelId);
+ return this;
+ }
+
public NodeAttributes withReports(Map<String, JsonNode> nodeReports) {
this.reports = new TreeMap<>(nodeReports);
return this;
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java
index edba4956e90..858088d23e2 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeSpec.java
@@ -41,6 +41,8 @@ public class NodeSpec {
private final Optional<Instant> wantedFirmwareCheck;
private final Optional<Instant> currentFirmwareCheck;
+ private final Optional<String> modelId;
+
private final Optional<Boolean> allowedToBeDown;
private final Optional<Boolean> wantToDeprovision;
private final Optional<Owner> owner;
@@ -82,6 +84,7 @@ public class NodeSpec {
long currentRebootGeneration,
Optional<Instant> wantedFirmwareCheck,
Optional<Instant> currentFirmwareCheck,
+ Optional<String> modelId,
double minCpuCores,
double minMainMemoryAvailableGb,
double minDiskAvailableGb,
@@ -99,6 +102,7 @@ public class NodeSpec {
this.nodeType = Objects.requireNonNull(nodeType);
this.flavor = Objects.requireNonNull(flavor);
this.canonicalFlavor = canonicalFlavor;
+ this.modelId = modelId;
this.wantedVespaVersion = Objects.requireNonNull(wantedVespaVersion);
this.vespaVersion = Objects.requireNonNull(vespaVersion);
this.wantedOsVersion = Objects.requireNonNull(wantedOsVersion);
@@ -193,6 +197,10 @@ public class NodeSpec {
return currentFirmwareCheck;
}
+ public Optional<String> getModelId() {
+ return modelId;
+ }
+
public Optional<Boolean> getAllowedToBeDown() {
return allowedToBeDown;
}
@@ -511,6 +519,7 @@ public class NodeSpec {
private long currentRebootGeneration;
private Optional<Instant> wantedFirmwareCheck = Optional.empty();
private Optional<Instant> currentFirmwareCheck = Optional.empty();
+ private Optional<String> modelId = Optional.empty();
private double minCpuCores;
private double minMainMemoryAvailableGb;
private double minDiskAvailableGb;
@@ -860,7 +869,7 @@ public class NodeSpec {
owner, membership,
wantedRestartGeneration, currentRestartGeneration,
wantedRebootGeneration, currentRebootGeneration,
- wantedFirmwareCheck, currentFirmwareCheck,
+ wantedFirmwareCheck, currentFirmwareCheck, modelId,
minCpuCores, minMainMemoryAvailableGb, minDiskAvailableGb,
fastDisk, bandwidth, ipAddresses, hardwareDivergence, hardwareFailureDescription,
reports, parentHostname);
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java
index 45e57ae2e67..ccc1693546e 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/RealNodeRepository.java
@@ -207,6 +207,7 @@ public class RealNodeRepository implements NodeRepository {
node.currentRebootGeneration,
Optional.ofNullable(node.wantedFirmwareCheck).map(Instant::ofEpochMilli),
Optional.ofNullable(node.currentFirmwareCheck).map(Instant::ofEpochMilli),
+ Optional.ofNullable(node.modelId),
node.minCpuCores,
node.minMainMemoryAvailableGb,
node.minDiskAvailableGb,
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java
index 777d60de17d..a74a2809bab 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/bindings/NodeRepositoryNode.java
@@ -54,6 +54,8 @@ public class NodeRepositoryNode {
public Long currentFirmwareCheck;
@JsonProperty("wantedFirmwareCheck")
public Long wantedFirmwareCheck;
+ @JsonProperty("modelId")
+ public String modelId;
@JsonProperty("failCount")
public Integer failCount;
@JsonProperty("fastDisk")
@@ -100,6 +102,7 @@ public class NodeRepositoryNode {
", ipAddresses=" + ipAddresses +
", additionalIpAddresses=" + additionalIpAddresses +
", openStackId='" + openStackId + '\'' +
+ ", modelId='" + modelId + '\'' +
", flavor='" + flavor + '\'' +
", canonicalFlavor='" + canonicalFlavor + '\'' +
", membership=" + membership +
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() {