Repository: sqoop
Updated Branches:
  refs/heads/sqoop2 4459bd925 -> 8ea1c8580


SQOOP-2670. Sqoop2: RESTiliency: Allow getting links by connector only for all

(Jarcec via Hari)


Project: http://git-wip-us.apache.org/repos/asf/sqoop/repo
Commit: http://git-wip-us.apache.org/repos/asf/sqoop/commit/8ea1c858
Tree: http://git-wip-us.apache.org/repos/asf/sqoop/tree/8ea1c858
Diff: http://git-wip-us.apache.org/repos/asf/sqoop/diff/8ea1c858

Branch: refs/heads/sqoop2
Commit: 8ea1c8580efce3c8e006ac81c5b455c1093e71ef
Parents: 4459bd9
Author: Hari Shreedharan <[email protected]>
Authored: Mon Nov 9 14:23:47 2015 -0800
Committer: Hari Shreedharan <[email protected]>
Committed: Mon Nov 9 14:23:47 2015 -0800

----------------------------------------------------------------------
 .../sqoop/handler/LinkRequestHandler.java       | 62 ++++++---------
 .../org/apache/sqoop/server/v1/LinkServlet.java |  4 +
 .../server/InvalidRESTCallsTest.java            | 83 ++++++++++++++++++--
 3 files changed, 104 insertions(+), 45 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sqoop/blob/8ea1c858/server/src/main/java/org/apache/sqoop/handler/LinkRequestHandler.java
----------------------------------------------------------------------
diff --git 
a/server/src/main/java/org/apache/sqoop/handler/LinkRequestHandler.java 
b/server/src/main/java/org/apache/sqoop/handler/LinkRequestHandler.java
index fe0c4d8..bd818b3 100644
--- a/server/src/main/java/org/apache/sqoop/handler/LinkRequestHandler.java
+++ b/server/src/main/java/org/apache/sqoop/handler/LinkRequestHandler.java
@@ -18,10 +18,11 @@
 package org.apache.sqoop.handler;
 
 import java.io.IOException;
-import java.util.Arrays;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Locale;
 
+import org.apache.commons.lang.StringUtils;
 import org.apache.log4j.Logger;
 import org.apache.sqoop.audit.AuditLoggerManager;
 import org.apache.sqoop.common.SqoopException;
@@ -54,8 +55,6 @@ public class LinkRequestHandler implements RequestHandler {
 
   static final String ENABLE = "enable";
   static final String DISABLE = "disable";
-  static final String LINKS_PATH = "links";
-  static final String LINK_PATH = "link";
 
   public LinkRequestHandler() {
     LOG.info("LinkRequestHandler initialized");
@@ -197,52 +196,37 @@ public class LinkRequestHandler implements RequestHandler 
{
   private JsonBean getLinks(RequestContext ctx) {
     String identifier = ctx.getLastURLElement();
     LinkBean linkBean;
+    List<MLink> links;
     Locale locale = ctx.getAcceptLanguageHeader();
     Repository repository = RepositoryManager.getInstance().getRepository();
 
-    // links by connector
-    if (ctx.getParameterValue(CONNECTOR_NAME_QUERY_PARAM) != null) {
-      identifier = ctx.getParameterValue(CONNECTOR_NAME_QUERY_PARAM);
-      AuditLoggerManager.getInstance().logAuditEvent(ctx.getUserName(),
-          ctx.getRequest().getRemoteAddr(), "get", "linksByConnector", 
identifier);
-      if (repository.findConnector(identifier) != null) {
-        String connectorName = 
repository.findConnector(identifier).getUniqueName();
-        List<MLink> linkList = repository.findLinksForConnector(connectorName);
+    AuditLoggerManager.getInstance().logAuditEvent(ctx.getUserName(), 
ctx.getRequest().getRemoteAddr(), "get", "link", identifier);
 
-        // Authorization check
-        linkList = AuthorizationEngine.filterResource(ctx.getUserName(), 
MResource.TYPE.LINK, linkList);
+    if(identifier.equals("all")) { // Return all links (by perhaps only for 
given connector)
+      String connectorName = ctx.getParameterValue(CONNECTOR_NAME_QUERY_PARAM);
 
-        linkBean = createLinksBean(linkList, locale);
+      if(StringUtils.isEmpty(connectorName)) {
+        links = repository.findLinks();
       } else {
-        // this means name nor Id existed
-        throw new SqoopException(ServerError.SERVER_0005, "Invalid connector: 
" + identifier
-            + " name for links given");
+        if(repository.findConnector(connectorName) == null) {
+          throw new SqoopException(ServerError.SERVER_0005, "Invalid 
connector: " + connectorName);
+        }
+        links = repository.findLinksForConnector(connectorName);
       }
-    } else
-    // all links in the system
-    if (ctx.getPath().contains(LINKS_PATH)
-        || (ctx.getPath().contains(LINK_PATH) && identifier.equals("all"))) {
-      AuditLoggerManager.getInstance().logAuditEvent(ctx.getUserName(),
-          ctx.getRequest().getRemoteAddr(), "get", "links", "all");
-      List<MLink> linkList = repository.findLinks();
-
-      // Authorization check
-      linkList = AuthorizationEngine.filterResource(ctx.getUserName(), 
MResource.TYPE.LINK, linkList);
-
-      linkBean = createLinksBean(linkList, locale);
-    }
-    // link by Id
-    else {
-      AuditLoggerManager.getInstance().logAuditEvent(ctx.getUserName(),
-          ctx.getRequest().getRemoteAddr(), "get", "link", identifier);
-
+    } else { // Return one specific link with name or id stored in identifier
       String linkName = HandlerUtils.getLinkNameFromIdentifier(identifier);
-      MLink link = repository.findLink(linkName);
+      links = new LinkedList<>();
+      links.add(repository.findLink(linkName));
+    }
 
-      // Authorization check
-      AuthorizationEngine.readLink(ctx.getUserName(), link.getName());
+    // Authorization check
+    links = AuthorizationEngine.filterResource(ctx.getUserName(), 
MResource.TYPE.LINK, links);
 
-      linkBean = createLinkBean(Arrays.asList(link), locale);
+    // Return bean entity (we have to separate what we're returning here)
+    if(identifier.equals("all")) {
+      linkBean = createLinksBean(links, locale);
+    } else {
+      linkBean = createLinkBean(links, locale);
     }
     return linkBean;
   }

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8ea1c858/server/src/main/java/org/apache/sqoop/server/v1/LinkServlet.java
----------------------------------------------------------------------
diff --git a/server/src/main/java/org/apache/sqoop/server/v1/LinkServlet.java 
b/server/src/main/java/org/apache/sqoop/server/v1/LinkServlet.java
index 3fb542f..d803435 100644
--- a/server/src/main/java/org/apache/sqoop/server/v1/LinkServlet.java
+++ b/server/src/main/java/org/apache/sqoop/server/v1/LinkServlet.java
@@ -30,6 +30,10 @@ import org.apache.sqoop.server.SqoopProtocolServlet;
  *  Return details about one particular link with id lid
  * GET /v1/link/{lname}
  *  Return details about one particular link with name lname
+ * GET /v1/link/all
+ *  Return details about all links
+ * GET /v1/link/all?cname={cname}
+ *  Return details about all links for given connector (by name)
  *
  * POST /v1/link/ with {connector-id} and {link-config-id} in the post data
  *  Create link for connector with id connector-id

http://git-wip-us.apache.org/repos/asf/sqoop/blob/8ea1c858/test/src/test/java/org/apache/sqoop/integration/server/InvalidRESTCallsTest.java
----------------------------------------------------------------------
diff --git 
a/test/src/test/java/org/apache/sqoop/integration/server/InvalidRESTCallsTest.java
 
b/test/src/test/java/org/apache/sqoop/integration/server/InvalidRESTCallsTest.java
index 856d21f..14b7843 100644
--- 
a/test/src/test/java/org/apache/sqoop/integration/server/InvalidRESTCallsTest.java
+++ 
b/test/src/test/java/org/apache/sqoop/integration/server/InvalidRESTCallsTest.java
@@ -21,14 +21,15 @@ import org.apache.log4j.Logger;
 import com.google.common.collect.Iterables;
 import org.apache.commons.io.IOUtils;
 import 
org.apache.hadoop.security.token.delegation.web.DelegationTokenAuthenticatedURL;
+import org.apache.sqoop.model.MConfigList;
+import org.apache.sqoop.model.MLink;
 import org.apache.sqoop.test.infrastructure.Infrastructure;
 import org.apache.sqoop.test.infrastructure.SqoopTestCase;
-import 
org.apache.sqoop.test.infrastructure.providers.DatabaseInfrastructureProvider;
 import 
org.apache.sqoop.test.infrastructure.providers.HadoopInfrastructureProvider;
 import 
org.apache.sqoop.test.infrastructure.providers.SqoopInfrastructureProvider;
-import org.apache.sqoop.test.testcases.ConnectorTestCase;
 import org.apache.sqoop.test.utils.ParametrizedUtils;
-import org.testng.ITest;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeMethod;
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Factory;
 import org.testng.annotations.Test;
@@ -60,8 +61,8 @@ public class InvalidRESTCallsTest extends SqoopTestCase {
     public void setConnection(HttpURLConnection connection) throws Exception {
       this.connection = connection;
 
-      try { this.input = (connection.getInputStream() != null) ? 
IOUtils.toString(connection.getInputStream()) : "NOT PRESENT"; } 
catch(Exception e) { this.input = "NOT PRESENT"; }
-      this.error = connection.getErrorStream() != null ? 
IOUtils.toString(connection.getErrorStream()) : "NOT PRESENT";
+      try { this.input = (connection.getInputStream() != null) ? 
IOUtils.toString(connection.getInputStream()) : ""; } catch(Exception e) { 
this.input = ""; }
+      this.error = connection.getErrorStream() != null ? 
IOUtils.toString(connection.getErrorStream()) : "";
     }
 
     // Each test should implement whatever is needed here
@@ -81,6 +82,18 @@ public class InvalidRESTCallsTest extends SqoopTestCase {
       assertTrue(error.contains("error-code-class\":\"" + errorClass));
       assertTrue(error.contains("error-code\":\"" + errorCode));
     }
+
+    public void assertContains(String subString) throws Exception {
+      assertTrue(responseString().contains(subString), "Server response 
doesn't contain: " + subString);
+    }
+
+    private String responseString() {
+      if(input.isEmpty()) {
+        return error;
+      } else {
+        return input;
+      }
+    }
   }
 
   // Small internal class describing our test case
@@ -101,7 +114,28 @@ public class InvalidRESTCallsTest extends SqoopTestCase {
   }
 
   /**
-   * Poisoned requests that we'll be running with expected responses from the 
server
+   * Data preparation for links, jobs and other objects that we might need.
+   */
+  @BeforeMethod
+  public void loadTestData() {
+    // Link: first-link
+    MLink genericJDBCLink = getClient().createLink("generic-jdbc-connector");
+    genericJDBCLink.setName("first-link");
+    MConfigList configs = genericJDBCLink.getConnectorLinkConfig();
+    
configs.getStringInput("linkConfig.jdbcDriver").setValue("org.apache.derby.jdbc.ClientDriver");
+    
configs.getStringInput("linkConfig.connectionString").setValue("jdbc:derby:memory:invalid-rest-calls-test;create=true");
+    configs.getStringInput("linkConfig.username").setValue("sqoop");
+    configs.getStringInput("linkConfig.password").setValue("is-awesome");
+    getClient().saveLink(genericJDBCLink);
+  }
+
+  @AfterMethod
+  public void dropTestData() {
+    getClient().deleteLink("first-link");
+  }
+
+  /**
+   * Correct and poisoned requests that we'll be running with expected 
responses from the server
    */
   public static TestDescription []PROVDER_DATA = new TestDescription[] {
     // End point /version/
@@ -151,6 +185,43 @@ public class InvalidRESTCallsTest extends SqoopTestCase {
         assertResponseCode(500);
         assertServerException("org.apache.sqoop.server.common.ServerError", 
"SERVER_0002");
       }}),
+
+    // End point /v1/link
+
+    // Get
+    new TestDescription("Get all links", "v1/link/all", "GET", null, new 
Validator() {
+      @Override
+      void validate() throws Exception {
+        assertResponseCode(200);
+        assertContains("first-link");
+      }}),
+    new TestDescription("Get link by name", "v1/link/first-link", "GET", null, 
new Validator() {
+      @Override
+      void validate() throws Exception {
+        assertResponseCode(200);
+        assertContains("first-link");
+      }}),
+    new TestDescription("Get all links for connector", 
"v1/link/all?cname=generic-jdbc-connector", "GET", null, new Validator() {
+      @Override
+      void validate() throws Exception {
+        assertResponseCode(200);
+        assertContains("first-link");
+      }}),
+    new TestDescription("Get non existing link", "v1/link/i-dont-exists", 
"GET", null, new Validator() {
+      @Override
+      void validate() throws Exception {
+        assertResponseCode(500);
+        assertServerException("org.apache.sqoop.server.common.ServerError", 
"SERVER_0005");
+        assertContains("Invalid link: i-dont-exists");
+      }}),
+    new TestDescription("Get links for non existing connector", 
"v1/link/all?cname=i-dont-exists", "GET", null, new Validator() {
+      @Override
+      void validate() throws Exception {
+        assertResponseCode(500);
+        assertServerException("org.apache.sqoop.server.common.ServerError", 
"SERVER_0005");
+        assertContains("Invalid connector: i-dont-exists");
+      }}),
+
   };
 
   @DataProvider(name="invalid-rest-calls-test", parallel=false)

Reply via email to