diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java index 4ce2b54..09b1964 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/RMWebServices.java @@ -93,6 +93,7 @@ import org.apache.hadoop.yarn.api.records.FinalApplicationStatus; import org.apache.hadoop.yarn.api.records.LocalResource; import org.apache.hadoop.yarn.api.records.NodeId; +import org.apache.hadoop.yarn.api.records.NodeLabel; import org.apache.hadoop.yarn.api.records.NodeState; import org.apache.hadoop.yarn.api.records.Priority; import org.apache.hadoop.yarn.api.records.QueueACL; @@ -135,8 +136,11 @@ import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.LocalResourceInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NewApplication; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelsInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelsName; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeToLabelsInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeToLabelsName; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodesInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.ResourceInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.SchedulerInfo; @@ -796,7 +800,7 @@ public Response updateAppState(AppState targetState, @GET @Path("/get-node-to-labels") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public NodeToLabelsInfo getNodeToLabels(@Context HttpServletRequest hsr) + public NodeToLabelsInfo getNodeToLabels(@Context HttpServletRequest hsr) throws IOException { init(); @@ -821,7 +825,7 @@ public LabelsToNodesInfo getLabelsToNodes( init(); LabelsToNodesInfo lts = new LabelsToNodesInfo(); - Map ltsMap = lts.getLabelsToNodes(); + Map ltsMap = lts.getLabelsToNodes(); Map> labelsToNodeId = null; if (labels == null || labels.size() == 0) { labelsToNodeId = @@ -836,7 +840,8 @@ public LabelsToNodesInfo getLabelsToNodes( for (NodeId nodeId : entry.getValue()) { nodeIdStrList.add(nodeId.toString()); } - ltsMap.put(entry.getKey(), new NodeIDsInfo(nodeIdStrList)); + ltsMap.put(new NodeLabelInfo(entry.getKey()), new NodeIDsInfo( + nodeIdStrList)); } return lts; } @@ -844,12 +849,12 @@ public LabelsToNodesInfo getLabelsToNodes( @POST @Path("/replace-node-to-labels") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response replaceLabelsOnNodes(final NodeToLabelsInfo newNodeToLabels, + public Response replaceLabelsOnNodes(final NodeToLabelsName newNodeToLabels, @Context HttpServletRequest hsr) throws IOException { Map> nodeIdToLabels = new HashMap>(); - for (Map.Entry nitle : newNodeToLabels + for (Map.Entry nitle : newNodeToLabels .getNodeToLabels().entrySet()) { nodeIdToLabels.put( ConverterUtils.toNodeIdWithDefaultPort(nitle.getKey()), @@ -862,14 +867,14 @@ public Response replaceLabelsOnNodes(final NodeToLabelsInfo newNodeToLabels, @POST @Path("/nodes/{nodeId}/replace-labels") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response replaceLabelsOnNode(NodeLabelsInfo newNodeLabelsInfo, + public Response replaceLabelsOnNode(NodeLabelsName newNodeLabelsName, @Context HttpServletRequest hsr, @PathParam("nodeId") String nodeId) throws Exception { NodeId nid = ConverterUtils.toNodeIdWithDefaultPort(nodeId); Map> newLabelsForNode = new HashMap>(); newLabelsForNode.put(nid, - new HashSet(newNodeLabelsInfo.getNodeLabels())); + new HashSet(newNodeLabelsName.getNodeLabels())); return replaceLabelsOnNode(newLabelsForNode, hsr, "/nodes/nodeid/replace-labels"); } @@ -909,9 +914,9 @@ public NodeLabelsInfo getClusterNodeLabels(@Context HttpServletRequest hsr) throws IOException { init(); - NodeLabelsInfo ret = - new NodeLabelsInfo(rm.getRMContext().getNodeLabelManager() - .getClusterNodeLabelNames()); + List nodeLabels = rm.getRMContext().getNodeLabelManager() + .getClusterNodeLabels(); + NodeLabelsInfo ret = new NodeLabelsInfo(nodeLabels); return ret; } @@ -937,8 +942,7 @@ public Response addToClusterNodeLabels(final NodeLabelsInfo newNodeLabels, } rm.getRMContext().getNodeLabelManager() - .addToCluserNodeLabelsWithDefaultExclusivity(new HashSet( - newNodeLabels.getNodeLabels())); + .addToCluserNodeLabels(newNodeLabels.getNodeLabels()); return Response.status(Status.OK).build(); @@ -947,7 +951,7 @@ public Response addToClusterNodeLabels(final NodeLabelsInfo newNodeLabels, @POST @Path("/remove-node-labels") @Produces({ MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML }) - public Response removeFromCluserNodeLabels(final NodeLabelsInfo oldNodeLabels, + public Response removeFromCluserNodeLabels(final NodeLabelsName oldNodeLabels, @Context HttpServletRequest hsr) throws Exception { init(); diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/LabelsToNodesInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/LabelsToNodesInfo.java index 625fedd..41dd410 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/LabelsToNodesInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/LabelsToNodesInfo.java @@ -31,13 +31,13 @@ @XmlAccessorType(XmlAccessType.FIELD) public class LabelsToNodesInfo { - protected Map labelsToNodes = - new HashMap(); + protected Map labelsToNodes = + new HashMap(); public LabelsToNodesInfo() { } // JAXB needs this - public Map getLabelsToNodes() { + public Map getLabelsToNodes() { return labelsToNodes; } } \ No newline at end of file diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelInfo.java new file mode 100644 index 0000000..cfee644 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelInfo.java @@ -0,0 +1,80 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.resourcemanager.webapp.dao; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +import org.apache.hadoop.yarn.api.records.NodeLabel; + +@XmlRootElement(name = "nodeLabelInfo") +@XmlAccessorType(XmlAccessType.FIELD) +public class NodeLabelInfo { + + protected String name; + protected boolean exclusivity; + + public NodeLabelInfo() { + } // JAXB needs this + + public NodeLabelInfo(String name) { + this.name = name; + this.exclusivity = true; + } + + public NodeLabelInfo(String name, boolean exclusivity) { + this.name = name; + this.exclusivity = exclusivity; + } + + public NodeLabelInfo(NodeLabel label) { + this.name = label.getName(); + this.exclusivity = label.isExclusive(); + } + + public String getName() { + return name; + } + + public boolean getExclusivity() { + return exclusivity; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + NodeLabelInfo other = (NodeLabelInfo) obj; + if (!getName().equals(other.getName())) + return false; + if (getExclusivity() != other.getExclusivity()) + return false; + return true; + } + + @Override + public int hashCode() { + return (getName().hashCode() << 16) + (getExclusivity() ? 1 : 0); + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelsInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelsInfo.java index 1cb895a..be2cfa2 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelsInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelsInfo.java @@ -22,31 +22,61 @@ import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; +import org.apache.hadoop.yarn.api.records.NodeLabel; + @XmlRootElement(name = "nodeLabelsInfo") @XmlAccessorType(XmlAccessType.FIELD) public class NodeLabelsInfo { - protected ArrayList nodeLabels = new ArrayList(); + @XmlElement(name = "nodeLabels") + protected ArrayList nodeLabelsInfo = new ArrayList(); public NodeLabelsInfo() { } // JAXB needs this - - public NodeLabelsInfo(ArrayList nodeLabels) { - this.nodeLabels = nodeLabels; + + public NodeLabelsInfo(ArrayList nodeLabels) { + this.nodeLabelsInfo = nodeLabels; } - - public NodeLabelsInfo(Set nodeLabelsSet) { - this.nodeLabels = new ArrayList(nodeLabelsSet); + + public NodeLabelsInfo(List nodeLabels) { + this.nodeLabelsInfo = new ArrayList(); + for (NodeLabel label : nodeLabels) { + this.nodeLabelsInfo.add(new NodeLabelInfo(label)); + } } - public ArrayList getNodeLabels() { + public NodeLabelsInfo(Set nodeLabelsName) { + this.nodeLabelsInfo = new ArrayList(); + for (String labelName : nodeLabelsName) { + this.nodeLabelsInfo.add(new NodeLabelInfo(labelName)); + } + } + + public ArrayList getNodeLabelsInfo() { + return nodeLabelsInfo; + } + + public Set getNodeLabels() { + Set nodeLabels = new HashSet(); + for (NodeLabelInfo label : nodeLabelsInfo) { + nodeLabels.add(NodeLabel.newInstance(label.getName(), + label.getExclusivity())); + } return nodeLabels; } - public void setNodeLabels(ArrayList nodeLabels) { - this.nodeLabels = nodeLabels; + public List getNodeLabelsName() { + ArrayList nodeLabelsName = new ArrayList(); + for (NodeLabelInfo label : nodeLabelsInfo) { + nodeLabelsName.add(label.getName()); + } + return nodeLabelsName; + } + + public void setNodeLabelsInfo(ArrayList nodeLabelsInfo) { + this.nodeLabelsInfo = nodeLabelsInfo; } - } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelsName.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelsName.java new file mode 100644 index 0000000..7aac796 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeLabelsName.java @@ -0,0 +1,51 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.resourcemanager.webapp.dao; + +import java.util.*; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "nodeLabelsName") +@XmlAccessorType(XmlAccessType.FIELD) +public class NodeLabelsName { + + protected ArrayList nodeLabels = new ArrayList(); + + public NodeLabelsName() { + } // JAXB needs this + + public NodeLabelsName(ArrayList nodeLabels) { + this.nodeLabels = nodeLabels; + } + + public NodeLabelsName(Set nodeLabelsSet) { + this.nodeLabels = new ArrayList(nodeLabelsSet); + } + + public ArrayList getNodeLabels() { + return nodeLabels; + } + + public void setNodeLabels(ArrayList nodeLabels) { + this.nodeLabels = nodeLabels; + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeToLabelsInfo.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeToLabelsInfo.java index f2e6441..a1802ff 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeToLabelsInfo.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeToLabelsInfo.java @@ -29,13 +29,12 @@ public class NodeToLabelsInfo { protected HashMap nodeToLabels = - new HashMap(); + new HashMap(); public NodeToLabelsInfo() { } // JAXB needs this - + public HashMap getNodeToLabels() { - return nodeToLabels; + return nodeToLabels; } - } diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeToLabelsName.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeToLabelsName.java new file mode 100644 index 0000000..0354c15 --- /dev/null +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/main/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/dao/NodeToLabelsName.java @@ -0,0 +1,40 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.hadoop.yarn.server.resourcemanager.webapp.dao; + +import java.util.*; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "nodeToLabelsName") +@XmlAccessorType(XmlAccessType.FIELD) +public class NodeToLabelsName { + + protected HashMap nodeToLabels = + new HashMap(); + + public NodeToLabelsName() { + } // JAXB needs this + + public HashMap getNodeToLabels() { + return nodeToLabels; + } +} diff --git a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java index 2d5518d..86c1235 100644 --- a/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java +++ b/hadoop-yarn-project/hadoop-yarn/hadoop-yarn-server/hadoop-yarn-server-resourcemanager/src/test/java/org/apache/hadoop/yarn/server/resourcemanager/webapp/TestRMWebServicesNodeLabels.java @@ -34,13 +34,14 @@ import org.apache.hadoop.yarn.server.resourcemanager.MockRM; import org.apache.hadoop.yarn.server.resourcemanager.ResourceManager; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.LabelsToNodesInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelInfo; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelsInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeLabelsName; import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeToLabelsInfo; +import org.apache.hadoop.yarn.server.resourcemanager.webapp.dao.NodeToLabelsName; import org.apache.hadoop.yarn.webapp.GenericExceptionHandler; import org.apache.hadoop.yarn.webapp.JerseyTestBase; -import org.codehaus.jettison.json.JSONArray; import org.codehaus.jettison.json.JSONException; -import org.codehaus.jettison.json.JSONObject; import org.junit.Test; import com.google.inject.Guice; @@ -113,32 +114,35 @@ public void testNodeLabels() throws JSONException, Exception { WebResource r = resource(); ClientResponse response; - JSONObject json; - JSONArray jarr; - + // Add a label + NodeLabelsInfo nlsifo = new NodeLabelsInfo(); + nlsifo.getNodeLabelsInfo().add(new NodeLabelInfo("a")); response = r.path("ws").path("v1").path("cluster") .path("add-node-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON) - .entity("{\"nodeLabels\":\"a\"}", MediaType.APPLICATION_JSON) + .entity(toJson(nlsifo, NodeLabelsInfo.class), MediaType.APPLICATION_JSON) .post(ClientResponse.class); // Verify response = r.path("ws").path("v1").path("cluster") .path("get-node-labels").queryParam("user.name", userName) - .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); + .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("a", json.getString("nodeLabels")); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertEquals("a", nlsifo.getNodeLabelsInfo().get(0).getName()); + assertEquals(1, nlsifo.getNodeLabels().size()); // Add another + nlsifo = new NodeLabelsInfo(); + nlsifo.getNodeLabelsInfo().add(new NodeLabelInfo("b")); response = r.path("ws").path("v1").path("cluster") .path("add-node-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON) - .entity("{\"nodeLabels\":\"b\"}", MediaType.APPLICATION_JSON) + .entity(toJson(nlsifo, NodeLabelsInfo.class), MediaType.APPLICATION_JSON) .post(ClientResponse.class); // Verify @@ -147,9 +151,8 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-node-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - jarr = json.getJSONArray("nodeLabels"); - assertEquals(2, jarr.length()); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertEquals(2, nlsifo.getNodeLabels().size()); // Add labels to a node response = @@ -195,13 +198,13 @@ public void testNodeLabels() throws JSONException, Exception { assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); LabelsToNodesInfo ltni = response.getEntity(LabelsToNodesInfo.class); assertEquals(2, ltni.getLabelsToNodes().size()); - NodeIDsInfo nodes = ltni.getLabelsToNodes().get("b"); + NodeIDsInfo nodes = ltni.getLabelsToNodes().get(new NodeLabelInfo("b")); assertTrue(nodes.getNodeIDs().contains("nid2:0")); assertTrue(nodes.getNodeIDs().contains("nid1:0")); - nodes = ltni.getLabelsToNodes().get("a"); + nodes = ltni.getLabelsToNodes().get(new NodeLabelInfo("a")); assertTrue(nodes.getNodeIDs().contains("nid:0")); - // Verify, using get-labels-to-Nodes for specifiedset of labels + // Verify, using get-labels-to-Nodes for specified set of labels MultivaluedMapImpl params = new MultivaluedMapImpl(); params.add("labels", "a"); response = @@ -213,7 +216,7 @@ public void testNodeLabels() throws JSONException, Exception { assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); ltni = response.getEntity(LabelsToNodesInfo.class); assertEquals(1, ltni.getLabelsToNodes().size()); - nodes = ltni.getLabelsToNodes().get("a"); + nodes = ltni.getLabelsToNodes().get(new NodeLabelInfo("a")); assertTrue(nodes.getNodeIDs().contains("nid:0")); // Verify @@ -223,8 +226,8 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("a", json.getString("nodeLabels")); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertTrue(nlsifo.getNodeLabelsName().contains("a")); // Replace @@ -245,12 +248,12 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("b", json.getString("nodeLabels")); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertTrue(nlsifo.getNodeLabelsName().contains("b")); // Replace labels using node-to-labels - NodeToLabelsInfo ntli = new NodeToLabelsInfo(); - NodeLabelsInfo nli = new NodeLabelsInfo(); + NodeToLabelsName ntli = new NodeToLabelsName(); + NodeLabelsName nli = new NodeLabelsName(); nli.getNodeLabels().add("a"); ntli.getNodeToLabels().put("nid:0", nli); response = @@ -258,7 +261,7 @@ public void testNodeLabels() throws JSONException, Exception { .path("replace-node-to-labels") .queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON) - .entity(toJson(ntli, NodeToLabelsInfo.class), + .entity(toJson(ntli, NodeToLabelsName.class), MediaType.APPLICATION_JSON) .post(ClientResponse.class); @@ -268,10 +271,10 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-node-to-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - ntli = response.getEntity(NodeToLabelsInfo.class); - nli = ntli.getNodeToLabels().get("nid:0"); - assertEquals(1, nli.getNodeLabels().size()); - assertTrue(nli.getNodeLabels().contains("a")); + NodeToLabelsInfo ntlinfo = response.getEntity(NodeToLabelsInfo.class); + NodeLabelsInfo nlinfo = ntlinfo.getNodeToLabels().get("nid:0"); + assertEquals(1, nlinfo.getNodeLabels().size()); + assertTrue(nlinfo.getNodeLabelsName().contains("a")); // Remove all response = @@ -290,8 +293,8 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("", json.getString("nodeLabels")); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertTrue(nlsifo.getNodeLabelsName().contains("")); // Add a label back for auth tests response = @@ -312,8 +315,8 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("a", json.getString("nodeLabels")); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertTrue(nlsifo.getNodeLabelsName().contains("a")); // Auth fail replace labels on node response = @@ -332,8 +335,8 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("a", json.getString("nodeLabels")); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertTrue(nlsifo.getNodeLabelsName().contains("a")); // Fail to add a label with post response = @@ -349,9 +352,8 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-node-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - jarr = json.getJSONArray("nodeLabels"); - assertEquals(2, jarr.length()); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertEquals(2, nlsifo.getNodeLabels().size()); // Remove cluster label (succeed, we no longer need it) response = @@ -367,9 +369,9 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-node-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("a", json.getString("nodeLabels")); - + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertEquals("a", nlsifo.getNodeLabelsInfo().get(0).getName()); + assertEquals(1, nlsifo.getNodeLabels().size()); // Remove cluster label with post response = @@ -385,12 +387,15 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-node-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - String res = response.getEntity(String.class); - assertTrue(res.equals("null")); - + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertEquals(0, nlsifo.getNodeLabels().size()); + // Following test cases are to test replace when distributed node label // configuration is on // Reset for testing : add cluster labels + nlsifo = new NodeLabelsInfo(); + nlsifo.getNodeLabelsInfo().add(new NodeLabelInfo("x")); + nlsifo.getNodeLabelsInfo().add(new NodeLabelInfo("y")); response = r.path("ws") .path("v1") @@ -398,14 +403,17 @@ public void testNodeLabels() throws JSONException, Exception { .path("add-node-labels") .queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON) - .entity("{\"nodeLabels\":[\"x\",\"y\"]}", + .entity(toJson(nlsifo, NodeLabelsInfo.class), MediaType.APPLICATION_JSON).post(ClientResponse.class); // Reset for testing : Add labels to a node + nlsifo = new NodeLabelsInfo(); + nlsifo.getNodeLabelsInfo().add(new NodeLabelInfo("y")); response = r.path("ws").path("v1").path("cluster").path("nodes").path("nid:0") .path("replace-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON) - .entity("{\"nodeLabels\": [\"y\"]}", MediaType.APPLICATION_JSON) + .entity(toJson(nlsifo, NodeLabelsInfo.class), + MediaType.APPLICATION_JSON) .post(ClientResponse.class); LOG.info("posted node nodelabel"); @@ -413,8 +421,8 @@ public void testNodeLabels() throws JSONException, Exception { rmWebService.isDistributedNodeLabelConfiguration = true; // Case1 : Replace labels using node-to-labels - ntli = new NodeToLabelsInfo(); - nli = new NodeLabelsInfo(); + ntli = new NodeToLabelsName(); + nli = new NodeLabelsName(); nli.getNodeLabels().add("x"); ntli.getNodeToLabels().put("nid:0", nli); response = @@ -424,7 +432,7 @@ public void testNodeLabels() throws JSONException, Exception { .path("replace-node-to-labels") .queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON) - .entity(toJson(ntli, NodeToLabelsInfo.class), + .entity(toJson(ntli, NodeToLabelsName.class), MediaType.APPLICATION_JSON).post(ClientResponse.class); // Verify, using node-to-labels that previous operation has failed @@ -433,10 +441,10 @@ public void testNodeLabels() throws JSONException, Exception { .queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - ntli = response.getEntity(NodeToLabelsInfo.class); - nli = ntli.getNodeToLabels().get("nid:0"); - assertEquals(1, nli.getNodeLabels().size()); - assertFalse(nli.getNodeLabels().contains("x")); + ntlinfo = response.getEntity(NodeToLabelsInfo.class); + nlinfo = ntlinfo.getNodeToLabels().get("nid:0"); + assertEquals(1, nlinfo.getNodeLabels().size()); + assertFalse(nlinfo.getNodeLabels().contains("x")); // Case2 : failure to Replace labels using replace-labels response = @@ -453,12 +461,12 @@ public void testNodeLabels() throws JSONException, Exception { .queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - ntli = response.getEntity(NodeToLabelsInfo.class); - nli = ntli.getNodeToLabels().get("nid:0"); - assertEquals(1, nli.getNodeLabels().size()); - assertFalse(nli.getNodeLabels().contains("x")); + ntlinfo = response.getEntity(NodeToLabelsInfo.class); + nlinfo = ntlinfo.getNodeToLabels().get("nid:0"); + assertEquals(1, nlinfo.getNodeLabels().size()); + assertFalse(nlinfo.getNodeLabels().contains("x")); - // Case3 : Remove cluster label should be successfull + // Case3 : Remove cluster label should be successful response = r.path("ws").path("v1").path("cluster") .path("remove-node-labels") @@ -472,8 +480,50 @@ public void testNodeLabels() throws JSONException, Exception { .path("get-node-labels").queryParam("user.name", userName) .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); - json = response.getEntity(JSONObject.class); - assertEquals("y", json.getString("nodeLabels")); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertEquals("y", nlsifo.getNodeLabelsInfo().get(0).getName()); + + // Remove y + response = + r.path("ws").path("v1").path("cluster") + .path("remove-node-labels") + .queryParam("user.name", userName) + .accept(MediaType.APPLICATION_JSON) + .entity("{\"nodeLabels\":\"y\"}", MediaType.APPLICATION_JSON) + .post(ClientResponse.class); + + // Verify + response = + r.path("ws").path("v1").path("cluster") + .path("get-node-labels").queryParam("user.name", userName) + .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertTrue(nlsifo.getNodeLabelsInfo().isEmpty()); + + // add a new nodelabel with exclusity + nlsifo = new NodeLabelsInfo(); + nlsifo.getNodeLabelsInfo().add(new NodeLabelInfo("z", false)); + response = + r.path("ws") + .path("v1") + .path("cluster") + .path("add-node-labels") + .queryParam("user.name", userName) + .accept(MediaType.APPLICATION_JSON) + .entity(toJson(nlsifo, NodeLabelsInfo.class), + MediaType.APPLICATION_JSON).post(ClientResponse.class); + + // Verify + response = + r.path("ws").path("v1").path("cluster") + .path("get-node-labels").queryParam("user.name", userName) + .accept(MediaType.APPLICATION_JSON).get(ClientResponse.class); + assertEquals(MediaType.APPLICATION_JSON_TYPE, response.getType()); + nlsifo = response.getEntity(NodeLabelsInfo.class); + assertEquals("z", nlsifo.getNodeLabelsInfo().get(0).getName()); + assertEquals(false, nlsifo.getNodeLabelsInfo().get(0).getExclusivity()); + assertEquals(1, nlsifo.getNodeLabels().size()); } @SuppressWarnings("rawtypes") -- 1.9.4.msysgit.1