diff options
author | Martin Polden <mpolden@mpolden.no> | 2018-10-03 10:41:53 +0200 |
---|---|---|
committer | Martin Polden <mpolden@mpolden.no> | 2018-10-03 10:41:53 +0200 |
commit | 3d9bd3fb08ae4d3d6302aff0ebb9134f686d9be6 (patch) | |
tree | 6049acef6f02e968d67ed9ccdf179a4a7e55ab41 /node-repository | |
parent | 362fd88a17af9bde6fbcdebdbfd6fe7448a254d0 (diff) |
Merge NodeStateSerializer into NodeSerializer
Diffstat (limited to 'node-repository')
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))); + } + } + +} |