summaryrefslogtreecommitdiffstats
path: root/node-admin
diff options
context:
space:
mode:
authorHÃ¥kon Hallingstad <hakon@oath.com>2019-02-10 10:03:01 +0100
committerGitHub <noreply@github.com>2019-02-10 10:03:01 +0100
commit74d98e665d9844983e104de95958715ed3e5a592 (patch)
tree8c0b5f75ec323ee3005eacc3963b610e0c742f7e /node-admin
parent0ba8693afeffb3ae7f3ce85d59b4e379c85fa158 (diff)
parent82e5f9a7623a44b4e82e94e77768b47b015f6671 (diff)
Merge pull request #8457 from vespa-engine/hakonhall/util-methods-on-basereport-and-nodeattributesisempty
Util methods on BaseReport and NodeAttributes.isEmpty
Diffstat (limited to 'node-admin')
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/NodeAttributes.java4
-rw-r--r--node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReport.java37
-rw-r--r--node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReportTest.java13
3 files changed, 48 insertions, 6 deletions
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 28e812e6ca1..a5635507ab7 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
@@ -145,6 +145,10 @@ public class NodeAttributes {
currentFirmwareCheck, hardwareDivergence, hardwareFailureDescription, wantToDeprovision, reports);
}
+ public boolean isEmpty() {
+ return equals(new NodeAttributes());
+ }
+
@Override
public boolean equals(final Object o) {
if (!(o instanceof NodeAttributes)) {
diff --git a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReport.java b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReport.java
index 26c1b90218f..42804b69b17 100644
--- a/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReport.java
+++ b/node-admin/src/main/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReport.java
@@ -10,6 +10,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.Objects;
+import java.util.Optional;
import static com.yahoo.yolean.Exceptions.uncheck;
@@ -21,8 +22,8 @@ import static com.yahoo.yolean.Exceptions.uncheck;
* <p><strong>Subclass requirements</strong>
*
* <ol>
- * <li>A subclass must maintain the property that {@link ObjectMapper} can map an instance to {@link JsonNode},
- * see {@link #toJsonNode()}.</li>
+ * <li>A subclass mush be a Jackson class that can be mapped to {@link JsonNode} with {@link #toJsonNode()},
+ * and from {@link JsonNode} with {@link #fromJsonNode(JsonNode, Class)}.</li>
* <li>A subclass must override {@link #updates(BaseReport)} and make sure to return false if
* {@code !super.updates(current)}.</li>
* </ol>
@@ -52,12 +53,12 @@ public class BaseReport {
}
@JsonGetter(CREATED_FIELD)
- public Long getCreatedMillisOrNull() {
+ public final Long getCreatedMillisOrNull() {
return createdMillis;
}
@JsonGetter(DESCRIPTION_FIELD)
- public String getDescriptionOrNull() {
+ public final String getDescriptionOrNull() {
return description;
}
@@ -73,8 +74,36 @@ public class BaseReport {
return !Objects.equals(description, current.description);
}
+ /** A variant of {@link #updates(BaseReport)} handling possibly absent reports, whether new or old. */
+ public static <TNEW extends BaseReport, TOLD extends BaseReport>
+ boolean updates2(Optional<TNEW> newReport, Optional<TOLD> oldReport) {
+ if (newReport.isPresent() ^ oldReport.isPresent()) return true;
+ return newReport.map(r -> r.updates(oldReport.get())).orElse(false);
+ }
+
+ public static BaseReport fromJsonNode(JsonNode jsonNode) {
+ return fromJsonNode(jsonNode, BaseReport.class);
+ }
+
+ public static <R extends BaseReport> R fromJsonNode(JsonNode jsonNode, Class<R> jacksonClass) {
+ return uncheck(() -> mapper.treeToValue(jsonNode, jacksonClass));
+ }
+
+ public static BaseReport fromJson(String json) {
+ return fromJson(json, BaseReport.class);
+ }
+
+ public static <R extends BaseReport> R fromJson(String json, Class<R> jacksonClass) {
+ return uncheck(() -> mapper.readValue(json, jacksonClass));
+ }
+
/** Returns {@code this} as a {@link JsonNode}. */
public JsonNode toJsonNode() {
return uncheck(() -> mapper.valueToTree(this));
}
+
+ /** Returns {@code this} as a compact JSON string. */
+ public String toJson() {
+ return uncheck(() -> mapper.writeValueAsString(this));
+ }
}
diff --git a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReportTest.java b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReportTest.java
index eec17f019bd..561733d7d76 100644
--- a/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReportTest.java
+++ b/node-admin/src/test/java/com/yahoo/vespa/hosted/node/admin/configserver/noderepository/reports/BaseReportTest.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.hosted.node.admin.configserver.noderepository.reports;
import com.yahoo.test.json.JsonTestHelper;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
@@ -11,11 +12,11 @@ import static org.junit.Assert.assertTrue;
* @author hakonhall
*/
public class BaseReportTest {
+ private static final String JSON_1 = "{\"createdMillis\": 1, \"description\": \"desc\"}";
@Test
public void testSerialization() {
- BaseReport report = new BaseReport(1L, "desc");
JsonTestHelper.assertJsonEquals(new BaseReport(1L, "desc").toJsonNode(),
- "{\"createdMillis\": 1, \"description\": \"desc\"}");
+ JSON_1);
JsonTestHelper.assertJsonEquals(new BaseReport(null, "desc").toJsonNode(),
"{\"description\": \"desc\"}");
JsonTestHelper.assertJsonEquals(new BaseReport(1L, null).toJsonNode(),
@@ -35,4 +36,12 @@ public class BaseReportTest {
assertTrue(new BaseReport(1L, "desc 2").updates(report));
assertTrue(new BaseReport(1L, null).updates(report));
}
+
+ @Test
+ public void testJsonSerialization() {
+ BaseReport report = BaseReport.fromJson(JSON_1);
+ assertEquals(1L, (long) report.getCreatedMillisOrNull());
+ assertEquals("desc", report.getDescriptionOrNull());
+ JsonTestHelper.assertJsonEquals(report.toJson(), JSON_1);
+ }
} \ No newline at end of file