From 1efbf2120d9df1b11fecf80b1adbed80c26bf7a5 Mon Sep 17 00:00:00 2001 From: Martin Polden Date: Thu, 9 Aug 2018 12:56:51 +0200 Subject: Make serializer for node type versions reusable --- .../persistence/CuratorDatabaseClient.java | 6 +-- .../InfrastructureVersionsSerializer.java | 42 ------------------- .../persistence/NodeTypeVersionsSerializer.java | 47 ++++++++++++++++++++++ .../provision/restapi/v2/UpgradeResponse.java | 5 +-- 4 files changed, 51 insertions(+), 49 deletions(-) delete mode 100644 node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/InfrastructureVersionsSerializer.java create mode 100644 node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeTypeVersionsSerializer.java (limited to 'node-repository') 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 7245e1dd19a..f559ec0037b 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 @@ -23,12 +23,12 @@ import java.time.Clock; import java.time.Duration; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Optional; import java.util.Set; +import java.util.TreeMap; import java.util.function.Function; import java.util.logging.Level; import java.util.logging.Logger; @@ -355,14 +355,14 @@ public class CuratorDatabaseClient { } public Map readInfrastructureVersions() { - return read(infrastructureVersionsPath(), InfrastructureVersionsSerializer::fromJson).orElseGet(HashMap::new); + return read(infrastructureVersionsPath(), NodeTypeVersionsSerializer::fromJson).orElseGet(TreeMap::new); } public void writeInfrastructureVersions(Map infrastructureVersions) { NestedTransaction transaction = new NestedTransaction(); CuratorTransaction curatorTransaction = curatorDatabase.newCuratorTransactionIn(transaction); curatorTransaction.add(CuratorOperations.setData(infrastructureVersionsPath().getAbsolute(), - InfrastructureVersionsSerializer.toJson(infrastructureVersions))); + NodeTypeVersionsSerializer.toJson(infrastructureVersions))); transaction.commit(); } diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/InfrastructureVersionsSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/InfrastructureVersionsSerializer.java deleted file mode 100644 index a48888fb4f0..00000000000 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/InfrastructureVersionsSerializer.java +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.hosted.provision.persistence; - -import com.yahoo.component.Version; -import com.yahoo.config.provision.NodeType; -import com.yahoo.slime.Cursor; -import com.yahoo.slime.Inspector; -import com.yahoo.slime.ObjectTraverser; -import com.yahoo.slime.Slime; -import com.yahoo.vespa.config.SlimeUtils; - -import java.io.IOException; -import java.util.HashMap; -import java.util.Map; - -/** - * @author freva - */ -class InfrastructureVersionsSerializer { - - private InfrastructureVersionsSerializer() {} - - static byte[] toJson(Map versionsByNodeType) { - try { - Slime slime = new Slime(); - Cursor object = slime.setObject(); - versionsByNodeType.forEach((nodeType, version) -> - object.setString(NodeSerializer.toString(nodeType), version.toFullString())); - return SlimeUtils.toJsonBytes(slime); - } catch (IOException e) { - throw new RuntimeException("Serialization of a infrastructure version failed", e); - } - } - - static Map fromJson(byte[] data) { - Map infrastructureVersions = new HashMap<>(); - Inspector inspector = SlimeUtils.jsonToSlime(data).get(); - inspector.traverse((ObjectTraverser) (key, value) -> - infrastructureVersions.put(NodeSerializer.nodeTypeFromString(key), Version.fromString(value.asString()))); - return infrastructureVersions; - } -} diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeTypeVersionsSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeTypeVersionsSerializer.java new file mode 100644 index 00000000000..dfa79a4fd9a --- /dev/null +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/persistence/NodeTypeVersionsSerializer.java @@ -0,0 +1,47 @@ +// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.vespa.hosted.provision.persistence; + +import com.yahoo.component.Version; +import com.yahoo.config.provision.NodeType; +import com.yahoo.slime.Cursor; +import com.yahoo.slime.Inspector; +import com.yahoo.slime.ObjectTraverser; +import com.yahoo.slime.Slime; +import com.yahoo.vespa.config.SlimeUtils; + +import java.io.IOException; +import java.io.UncheckedIOException; +import java.util.Map; +import java.util.TreeMap; + +/** + * Serializer for version numbers that are set per node type. + * + * @author freva + * @author mpolden + */ +public class NodeTypeVersionsSerializer { + + private NodeTypeVersionsSerializer() {} + + public static byte[] toJson(Map versions) { + Slime slime = new Slime(); + Cursor object = slime.setObject(); + versions.forEach((nodeType, version) -> object.setString(NodeSerializer.toString(nodeType), + version.toFullString())); + try { + return SlimeUtils.toJsonBytes(slime); + } catch (IOException e) { + throw new UncheckedIOException(e); + } + } + + public static Map fromJson(byte[] data) { + Map versions = new TreeMap<>(); // Use TreeMap to sort by node type + Inspector inspector = SlimeUtils.jsonToSlime(data).get(); + inspector.traverse((ObjectTraverser) (key, value) -> + versions.put(NodeSerializer.nodeTypeFromString(key), Version.fromString(value.asString()))); + return versions; + } + +} diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/UpgradeResponse.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/UpgradeResponse.java index 20a0139a178..3fb712e182f 100644 --- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/UpgradeResponse.java +++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/UpgradeResponse.java @@ -32,10 +32,7 @@ public class UpgradeResponse extends HttpResponse { Cursor root = slime.setObject(); Cursor versionsObject = root.setObject("versions"); - infrastructureVersions.getTargetVersions().entrySet().stream() - .sorted(Comparator.comparing(Map.Entry::getKey)) // Sort for stable tests - .forEach(entry -> - versionsObject.setString(entry.getKey().name(), entry.getValue().toFullString())); + infrastructureVersions.getTargetVersions().forEach((nodeType, version) -> versionsObject.setString(nodeType.name(), version.toFullString())); new JsonFormat(true).encode(stream, slime); } -- cgit v1.2.3