summaryrefslogtreecommitdiffstats
path: root/node-repository
diff options
context:
space:
mode:
authorMartin Polden <mpolden@mpolden.no>2018-10-03 10:41:53 +0200
committerMartin Polden <mpolden@mpolden.no>2018-10-03 10:41:53 +0200
commit3d9bd3fb08ae4d3d6302aff0ebb9134f686d9be6 (patch)
tree6049acef6f02e968d67ed9ccdf179a4a7e55ab41 /node-repository
parent362fd88a17af9bde6fbcdebdbfd6fe7448a254d0 (diff)
Merge NodeStateSerializer into NodeSerializer
Diffstat (limited to 'node-repository')
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializer.java70
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeStateSerializer.java50
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java5
-rw-r--r--node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesResponse.java17
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodeStateSerializerTest.java46
-rw-r--r--node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializerTest.java32
6 files changed, 111 insertions, 109 deletions
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializer.java
new file mode 100644
index 00000000000..75a8dbdcffc
--- /dev/null
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializer.java
@@ -0,0 +1,70 @@
+// 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.restapi.v2;
+
+import com.yahoo.config.provision.NodeType;
+import com.yahoo.vespa.hosted.provision.Node;
+
+/**
+ * Serializer for node wire format. Used to serialize node objects sent over the wire (HTTP).
+ *
+ * @author mpolden
+ */
+public class NodeSerializer {
+
+ public Node.State stateFrom(String state) {
+ switch (state) {
+ case "active": return Node.State.active;
+ case "dirty": return Node.State.dirty;
+ case "failed": return Node.State.failed;
+ case "inactive": return Node.State.inactive;
+ case "parked": return Node.State.parked;
+ case "provisioned": return Node.State.provisioned;
+ case "ready": return Node.State.ready;
+ case "reserved": return Node.State.reserved;
+ default: throw new IllegalArgumentException("Unknown node state '" + state + "'");
+ }
+ }
+
+ public String toString(Node.State state) {
+ switch (state) {
+ case active: return "active";
+ case dirty: return "dirty";
+ case failed: return "failed";
+ case inactive: return "inactive";
+ case parked: return "parked";
+ case provisioned: return "provisioned";
+ case ready: return "ready";
+ case reserved: return "reserved";
+ default: throw new IllegalArgumentException("Unknown node state '" + state + "'");
+ }
+ }
+
+ public NodeType typeFrom(String nodeType) {
+ switch (nodeType) {
+ case "tenant": return NodeType.tenant;
+ case "host": return NodeType.host;
+ case "proxy": return NodeType.proxy;
+ case "proxyhost": return NodeType.proxyhost;
+ case "config": return NodeType.config;
+ case "confighost": return NodeType.confighost;
+ case "controller": return NodeType.controller;
+ case "controllerhost": return NodeType.controllerhost;
+ default: throw new IllegalArgumentException("Unknown node type '" + nodeType + "'");
+ }
+ }
+
+ public String toString(NodeType type) {
+ switch (type) {
+ case tenant: return "tenant";
+ case host: return "host";
+ case proxy: return "proxy";
+ case proxyhost: return "proxyhost";
+ case config: return "config";
+ case confighost: return "confighost";
+ case controller: return "controller";
+ case controllerhost: return "controllerhost";
+ default: throw new IllegalArgumentException("Unknown node type '" + type.name() + "'");
+ }
+ }
+
+}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeStateSerializer.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeStateSerializer.java
deleted file mode 100644
index 8c7f297eca8..00000000000
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeStateSerializer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.restapi.v2;
-
-import com.yahoo.vespa.hosted.provision.Node;
-
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * Converts {@link Node.State} to/from serialized form in REST APIs.
- *
- * @author bakksjo
- */
-public class NodeStateSerializer {
-
- private static final Map<Node.State, String> serializationMap = new HashMap<>();
- private static final Map<String, Node.State> deserializationMap = new HashMap<>();
-
- private static void addMapping(final Node.State nodeState, final String wireName) {
- serializationMap.put(nodeState, wireName);
- deserializationMap.put(wireName, nodeState);
- }
-
- static {
- // Alphabetical order. No cheating, please - don't use .name(), .toString(), reflection etc. to get wire name.
- addMapping(Node.State.active, "active");
- addMapping(Node.State.dirty, "dirty");
- addMapping(Node.State.failed, "failed");
- addMapping(Node.State.inactive, "inactive");
- addMapping(Node.State.parked, "parked");
- addMapping(Node.State.provisioned, "provisioned");
- addMapping(Node.State.ready, "ready");
- addMapping(Node.State.reserved, "reserved");
- }
-
- private NodeStateSerializer() {} // Utility class, no instances.
-
- public static Optional<Node.State> fromWireName(final String wireName) {
- return Optional.ofNullable(deserializationMap.get(wireName));
- }
-
- public static String wireNameOf(final Node.State nodeState) {
- final String wireName = serializationMap.get(nodeState);
- if (wireName == null) {
- throw new RuntimeException("Bug: Unknown serialization form of node state " + nodeState.name());
- }
- return wireName;
- }
-}
diff --git a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
index bbc5d824559..6b31adf10fa 100644
--- a/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
+++ b/node-repository/src/main/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodesApiHandler.java
@@ -55,6 +55,7 @@ public class NodesApiHandler extends LoggingRequestHandler {
private final NodeRepository nodeRepository;
private final NodeRepositoryMaintenance maintenance;
private final NodeFlavors nodeFlavors;
+ private final NodeSerializer serializer = new NodeSerializer();
@Inject
public NodesApiHandler(LoggingRequestHandler.Context parentCtx, Orchestrator orchestrator,
@@ -227,9 +228,9 @@ public class NodesApiHandler extends LoggingRequestHandler {
nodeTypeFromSlime(inspector.field("type")));
}
- private static NodeType nodeTypeFromSlime(Inspector object) {
+ private NodeType nodeTypeFromSlime(Inspector object) {
if (! object.valid()) return NodeType.tenant; // default
- return NodeSerializer.typeFrom(object.asString());
+ return serializer.typeFrom(object.asString());
}
public static NodeFilter toNodeFilter(HttpRequest request) {
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 ddd8d6b4904..94145ea3029 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
@@ -42,8 +42,8 @@ class NodesResponse extends HttpResponse {
private final boolean recursive;
private final Orchestrator orchestrator;
private final NodeRepository nodeRepository;
-
private final Slime slime;
+ private final NodeSerializer serializer = new NodeSerializer();
public NodesResponse(ResponseType responseType, HttpRequest request,
Orchestrator orchestrator, NodeRepository nodeRepository) {
@@ -60,7 +60,7 @@ class NodesResponse extends HttpResponse {
switch (responseType) {
case nodeList: nodesToSlime(root); break;
case stateList : statesToSlime(root); break;
- case nodesInStateList: nodesToSlime(stateFromString(lastElement(parentUrl)), root); break;
+ case nodesInStateList: nodesToSlime(serializer.stateFrom(lastElement(parentUrl)), root); break;
case singleNode : nodeToSlime(lastElement(parentUrl), root); break;
default: throw new IllegalArgumentException();
}
@@ -96,11 +96,11 @@ class NodesResponse extends HttpResponse {
private void statesToSlime(Cursor root) {
Cursor states = root.setObject("states");
for (Node.State state : Node.State.values())
- toSlime(state, states.setObject(NodeStateSerializer.wireNameOf(state)));
+ toSlime(state, states.setObject(serializer.toString(state)));
}
private void toSlime(Node.State state, Cursor object) {
- object.setString("url", parentUrl + NodeStateSerializer.wireNameOf(state));
+ object.setString("url", parentUrl + serializer.toString(state));
if (recursive)
nodesToSlime(state, object);
}
@@ -135,10 +135,10 @@ class NodesResponse extends HttpResponse {
object.setString("url", nodeParentUrl + node.hostname());
if ( ! allFields) return;
object.setString("id", node.id());
- object.setString("state", NodeStateSerializer.wireNameOf(node.state()));
+ object.setString("state", serializer.toString(node.state()));
object.setString("type", node.type().name());
object.setString("hostname", node.hostname());
- object.setString("type", NodeSerializer.toString(node.type()));
+ object.setString("type", serializer.toString(node.type()));
if (node.parentHostname().isPresent()) {
object.setString("parentHostname", node.parentHostname().get());
}
@@ -223,9 +223,4 @@ class NodesResponse extends HttpResponse {
return path.substring(lastSlash+1);
}
- private static Node.State stateFromString(String stateString) {
- return NodeStateSerializer.fromWireName(stateString)
- .orElseThrow(() -> new RuntimeException("Node state '" + stateString + "' is not known"));
- }
-
}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodeStateSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodeStateSerializerTest.java
deleted file mode 100644
index f3f128ab19a..00000000000
--- a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/NodeStateSerializerTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
-package com.yahoo.vespa.hosted.provision.restapi;
-
-import com.yahoo.vespa.hosted.provision.Node;
-import com.yahoo.vespa.hosted.provision.restapi.v2.NodeStateSerializer;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-
-/**
- * @author bakksjo
- */
-public class NodeStateSerializerTest {
-
- @Test
- public void allStatesHaveASerializedForm() {
- for (Node.State nodeState : Node.State.values()) {
- assertNotNull(NodeStateSerializer.wireNameOf(nodeState));
- }
- }
-
- @Test
- public void wireNamesDoNotOverlap() {
- Set<String> wireNames = new HashSet<>();
- for (Node.State nodeState : Node.State.values()) {
- wireNames.add(NodeStateSerializer.wireNameOf(nodeState));
- }
- assertEquals(Node.State.values().length, wireNames.size());
- }
-
- @Test
- public void serializationAndDeserializationIsSymmetric() {
- for (Node.State nodeState : Node.State.values()) {
- String serialized = NodeStateSerializer.wireNameOf(nodeState);
- Node.State deserialized = NodeStateSerializer.fromWireName(serialized)
- .orElseThrow(() -> new RuntimeException(
- "Cannot deserialize '" + serialized + "', serialized form of " + nodeState.name()));
- assertEquals(nodeState, deserialized);
- }
- }
-
-}
diff --git a/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializerTest.java b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializerTest.java
new file mode 100644
index 00000000000..05b23addddf
--- /dev/null
+++ b/node-repository/src/test/java/com/yahoo/vespa/hosted/provision/restapi/v2/NodeSerializerTest.java
@@ -0,0 +1,32 @@
+// 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.restapi.v2;
+
+
+import com.yahoo.config.provision.NodeType;
+import com.yahoo.vespa.hosted.provision.Node;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author mpolden
+ */
+public class NodeSerializerTest {
+
+ private final NodeSerializer serializer = new NodeSerializer();
+
+ @Test
+ public void serialize_node_types() {
+ for (NodeType t : NodeType.values()) {
+ assertEquals(t, serializer.typeFrom(serializer.toString(t)));
+ }
+ }
+
+ @Test
+ public void serialize_node_states() {
+ for (Node.State s : Node.State.values()) {
+ assertEquals(s, serializer.stateFrom(serializer.toString(s)));
+ }
+ }
+
+}