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)
