diff options
author | HÃ¥kon Hallingstad <hakon@oath.com> | 2019-02-10 10:03:01 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-02-10 10:03:01 +0100 |
commit | 74d98e665d9844983e104de95958715ed3e5a592 (patch) | |
tree | 8c0b5f75ec323ee3005eacc3963b610e0c742f7e /node-admin | |
parent | 0ba8693afeffb3ae7f3ce85d59b4e379c85fa158 (diff) | |
parent | 82e5f9a7623a44b4e82e94e77768b47b015f6671 (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')
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 |