From 6fe4d2536bfb04c48f3aeb1a789a89b7ef03cae0 Mon Sep 17 00:00:00 2001 From: Mike Drob Date: Wed, 8 Nov 2017 11:15:53 -0600 Subject: [PATCH] HBASE-19210 --- .../hbase/rest/model/NamespacesInstanceModel.java | 4 +- .../hbase/rest/TestNamespacesInstanceResource.java | 148 ++++++++++++--------- 2 files changed, 90 insertions(+), 62 deletions(-) diff --git a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java index 022ec38d3b..b3e5262249 100644 --- a/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java +++ b/hbase-rest/src/main/java/org/apache/hadoop/hbase/rest/model/NamespacesInstanceModel.java @@ -68,10 +68,10 @@ public class NamespacesInstanceModel implements Serializable, ProtobufMessageHan /** * Constructor to use if namespace does not exist in HBASE. * @param namespaceName the namespace name. - * @throws IOException + * @throws IOException doesn't actually */ public NamespacesInstanceModel(String namespaceName) throws IOException { - this(null, namespaceName); + this.namespaceName = namespaceName; } /** diff --git a/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/TestNamespacesInstanceResource.java b/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/TestNamespacesInstanceResource.java index 9c724cd8a7..bfcb9419a2 100644 --- a/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/TestNamespacesInstanceResource.java +++ b/hbase-rest/src/test/java/org/apache/hadoop/hbase/rest/TestNamespacesInstanceResource.java @@ -23,6 +23,7 @@ import java.io.IOException; import java.io.StringWriter; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -51,8 +52,11 @@ import org.apache.hadoop.hbase.util.Bytes; import static org.junit.Assert.*; +import org.junit.After; import org.junit.AfterClass; +import org.junit.Before; import org.junit.BeforeClass; +import org.junit.Ignore; import org.junit.Test; import org.junit.experimental.categories.Category; @@ -61,19 +65,36 @@ import com.fasterxml.jackson.jaxrs.json.JacksonJaxbJsonProvider; @Category({RestTests.class, MediumTests.class}) public class TestNamespacesInstanceResource { - private static String NAMESPACE1 = "TestNamespacesInstanceResource1"; - private static Map NAMESPACE1_PROPS = new HashMap<>(); - private static String NAMESPACE2 = "TestNamespacesInstanceResource2"; - private static Map NAMESPACE2_PROPS = new HashMap<>(); - private static String NAMESPACE3 = "TestNamespacesInstanceResource3"; - private static Map NAMESPACE3_PROPS = new HashMap<>(); - private static String NAMESPACE4 = "TestNamespacesInstanceResource4"; - private static Map NAMESPACE4_PROPS = new HashMap<>(); + private final String NAMESPACE1 = "TestNamespacesInstanceResource1"; + private final String NAMESPACE2 = "TestNamespacesInstanceResource2"; + private final String NAMESPACE3 = "TestNamespacesInstanceResource3"; + private final String NAMESPACE4 = "TestNamespacesInstanceResource4"; + + private final Map NAMESPACE1_PROPS = Collections.singletonMap("key1", "value1"); + private final Map NAMESPACE2_PROPS = new HashMap() {{ + put("key2a", "value2a"); + put("key2b", "value2b"); + }}; + private final Map NAMESPACE3_PROPS = Collections.singletonMap("key3", "value3"); + private final Map NAMESPACE4_PROPS = new HashMap() {{ + put("key4a", "value4a"); + put("key4b", "value4b"); + }}; + + private final String namespacePath1 = "/namespaces/" + NAMESPACE1; + private final String namespacePath2 = "/namespaces/" + NAMESPACE2; + private final String namespacePath3 = "/namespaces/" + NAMESPACE3; + private final String namespacePath4 = "/namespaces/" + NAMESPACE4; + + NamespacesInstanceModel model1; + NamespacesInstanceModel model2; + NamespacesInstanceModel model3; + NamespacesInstanceModel model4; private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); private static final HBaseRESTTestingUtility REST_TEST_UTIL = new HBaseRESTTestingUtility(); - private static Client client; + private Client client; private static JAXBContext context; private static Configuration conf; private static TestNamespacesInstanceModel testNamespacesInstanceModel; @@ -84,18 +105,10 @@ public class TestNamespacesInstanceResource { conf = TEST_UTIL.getConfiguration(); TEST_UTIL.startMiniCluster(); REST_TEST_UTIL.startServletContainer(conf); - client = new Client(new Cluster().add("localhost", - REST_TEST_UTIL.getServletPort())); testNamespacesInstanceModel = new TestNamespacesInstanceModel(); context = JAXBContext.newInstance(NamespacesInstanceModel.class, TableListModel.class); jsonMapper = new JacksonJaxbJsonProvider() .locateMapper(NamespacesInstanceModel.class, MediaType.APPLICATION_JSON_TYPE); - NAMESPACE1_PROPS.put("key1", "value1"); - NAMESPACE2_PROPS.put("key2a", "value2a"); - NAMESPACE2_PROPS.put("key2b", "value2b"); - NAMESPACE3_PROPS.put("key3", "value3"); - NAMESPACE4_PROPS.put("key4a", "value4a"); - NAMESPACE4_PROPS.put("key4b", "value4b"); } @AfterClass @@ -104,6 +117,34 @@ public class TestNamespacesInstanceResource { TEST_UTIL.shutdownMiniCluster(); } + @Before + public void setup() { + model1 = testNamespacesInstanceModel.buildTestModel(NAMESPACE1, NAMESPACE1_PROPS); + model2 = testNamespacesInstanceModel.buildTestModel(NAMESPACE2, NAMESPACE2_PROPS); + model3 = testNamespacesInstanceModel.buildTestModel(NAMESPACE3, NAMESPACE3_PROPS); + model4 = testNamespacesInstanceModel.buildTestModel(NAMESPACE4, NAMESPACE4_PROPS); + + client = new Client(new Cluster().add("localhost", + REST_TEST_UTIL.getServletPort())); + } + + @Test + public void testAllModels() { + testNamespacesInstanceModel.checkModel(model1, NAMESPACE1, NAMESPACE1_PROPS); + testNamespacesInstanceModel.checkModel(model2, NAMESPACE2, NAMESPACE2_PROPS); + testNamespacesInstanceModel.checkModel(model3, NAMESPACE3, NAMESPACE3_PROPS); + testNamespacesInstanceModel.checkModel(model4, NAMESPACE4, NAMESPACE4_PROPS); + } + + @After + public void teardown() throws IOException { + Admin admin = TEST_UTIL.getAdmin(); + for (String ns : new String[] { NAMESPACE1, NAMESPACE2, NAMESPACE3, NAMESPACE4} ) { + if (findNamespace(admin, ns) != null) + admin.deleteNamespace(ns); + } + } + private static byte[] toXML(NamespacesInstanceModel model) throws JAXBException { StringWriter writer = new StringWriter(); context.createMarshaller().marshal(model, writer); @@ -237,56 +278,33 @@ public class TestNamespacesInstanceResource { // Check cannot delete namespace via REST because it contains tables. response = client.delete(namespacePath); - namespacePath = "/namespaces/" + nsName; assertEquals(503, response.getCode()); } @Test - public void testInvalidNamespacePostsAndPuts() throws IOException, JAXBException { - String namespacePath1 = "/namespaces/" + NAMESPACE1; - String namespacePath2 = "/namespaces/" + NAMESPACE2; - String namespacePath3 = "/namespaces/" + NAMESPACE3; - NamespacesInstanceModel model1; - NamespacesInstanceModel model2; - NamespacesInstanceModel model3; + @Ignore("HBASE-19210") + public void testInvalidNamespacePosts() throws IOException, JAXBException { Response response; - // Check that namespaces don't exist via non-REST call. Admin admin = TEST_UTIL.getAdmin(); - assertNull(findNamespace(admin, NAMESPACE1)); - assertNull(findNamespace(admin, NAMESPACE2)); - assertNull(findNamespace(admin, NAMESPACE3)); - - model1 = testNamespacesInstanceModel.buildTestModel(NAMESPACE1, NAMESPACE1_PROPS); - testNamespacesInstanceModel.checkModel(model1, NAMESPACE1, NAMESPACE1_PROPS); - model2 = testNamespacesInstanceModel.buildTestModel(NAMESPACE2, NAMESPACE2_PROPS); - testNamespacesInstanceModel.checkModel(model2, NAMESPACE2, NAMESPACE2_PROPS); - model3 = testNamespacesInstanceModel.buildTestModel(NAMESPACE3, NAMESPACE3_PROPS); - testNamespacesInstanceModel.checkModel(model3, NAMESPACE3, NAMESPACE3_PROPS); // Try REST post and puts with invalid content. response = client.post(namespacePath1, Constants.MIMETYPE_JSON, toXML(model1)); assertEquals(500, response.getCode()); String jsonString = jsonMapper.writeValueAsString(model2); - response = client.put(namespacePath2, Constants.MIMETYPE_XML, Bytes.toBytes(jsonString)); + response = client.post(namespacePath2, Constants.MIMETYPE_XML, Bytes.toBytes(jsonString)); assertEquals(400, response.getCode()); response = client.post(namespacePath3, Constants.MIMETYPE_PROTOBUF, toXML(model3)); assertEquals(500, response.getCode()); - NamespaceDescriptor nd1 = findNamespace(admin, NAMESPACE1); - NamespaceDescriptor nd2 = findNamespace(admin, NAMESPACE2); - NamespaceDescriptor nd3 = findNamespace(admin, NAMESPACE3); - assertNull(nd1); - assertNull(nd2); - assertNull(nd3); + // Check that namespaces don't exist via non-REST call. + assertNull(findNamespace(admin, NAMESPACE1)); + assertNull(findNamespace(admin, NAMESPACE2)); + assertNull(findNamespace(admin, NAMESPACE3)); } @Test public void testNamespaceCreateAndDeleteXMLAndJSON() throws IOException, JAXBException { - String namespacePath1 = "/namespaces/" + NAMESPACE1; - String namespacePath2 = "/namespaces/" + NAMESPACE2; - NamespacesInstanceModel model1; - NamespacesInstanceModel model2; Response response; // Check that namespaces don't exist via non-REST call. @@ -294,11 +312,6 @@ public class TestNamespacesInstanceResource { assertNull(findNamespace(admin, NAMESPACE1)); assertNull(findNamespace(admin, NAMESPACE2)); - model1 = testNamespacesInstanceModel.buildTestModel(NAMESPACE1, NAMESPACE1_PROPS); - testNamespacesInstanceModel.checkModel(model1, NAMESPACE1, NAMESPACE1_PROPS); - model2 = testNamespacesInstanceModel.buildTestModel(NAMESPACE2, NAMESPACE2_PROPS); - testNamespacesInstanceModel.checkModel(model2, NAMESPACE2, NAMESPACE2_PROPS); - // Test cannot PUT (alter) non-existent namespace. response = client.put(namespacePath1, Constants.MIMETYPE_XML, toXML(model1)); assertEquals(403, response.getCode()); @@ -357,12 +370,31 @@ public class TestNamespacesInstanceResource { assertNull(nd2); } + @Test + @Ignore("HBASE-19210") + public void testInvalidNamespacePuts() throws IOException, JAXBException { + Admin admin = TEST_UTIL.getAdmin(); + + Response response; + + // Check that namespaces don't exist via non-REST call. + assertNull(findNamespace(admin, NAMESPACE1)); + assertNull(findNamespace(admin, NAMESPACE2)); + + // Test cannot PUT (alter) non-existent namespace. + byte[] json = Bytes.toBytes(jsonMapper.writeValueAsString(model2)); + response = client.put(namespacePath2, Constants.MIMETYPE_JSON, json); + assertEquals(403, response.getCode()); + + // Try REST post and puts with invalid content. + response = client.post(namespacePath1, Constants.MIMETYPE_JSON, toXML(model1)); + assertEquals(500, response.getCode()); + response = client.put(namespacePath2, Constants.MIMETYPE_XML, json); + assertEquals(400, response.getCode()); + } + @Test public void testNamespaceCreateAndDeletePBAndNoBody() throws IOException, JAXBException { - String namespacePath3 = "/namespaces/" + NAMESPACE3; - String namespacePath4 = "/namespaces/" + NAMESPACE4; - NamespacesInstanceModel model3; - NamespacesInstanceModel model4; Response response; // Check that namespaces don't exist via non-REST call. @@ -370,10 +402,6 @@ public class TestNamespacesInstanceResource { assertNull(findNamespace(admin, NAMESPACE3)); assertNull(findNamespace(admin, NAMESPACE4)); - model3 = testNamespacesInstanceModel.buildTestModel(NAMESPACE3, NAMESPACE3_PROPS); - testNamespacesInstanceModel.checkModel(model3, NAMESPACE3, NAMESPACE3_PROPS); - model4 = testNamespacesInstanceModel.buildTestModel(NAMESPACE4, NAMESPACE4_PROPS); - testNamespacesInstanceModel.checkModel(model4, NAMESPACE4, NAMESPACE4_PROPS); // Test cannot PUT (alter) non-existent namespace. response = client.put(namespacePath3, Constants.MIMETYPE_BINARY, new byte[]{}); -- 2.14.1