Repository: sentry
Updated Branches:
  refs/heads/master 5d4465284 -> d4c622845


SENTRY-2329: Integrate sentry with Hadoop 3.1.1 (kalyan kumar kalvagadda, 
reviewed by Sergio Pena)

This integration is compatible with old Hadoop 2.x versions. You can compile 
with Hadoop 2.x by
changing the pom.xml or you can add the Sentry/HDFS binding jars built with 
Hadoop3 in the
Hadoop 2 classpath. Both ways are verified and working.


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

Branch: refs/heads/master
Commit: d4c622845b9d32f214d1704e81fe443ce8c63290
Parents: 5d44652
Author: Sergio Pena <sergio.p...@cloudera.com>
Authored: Mon Nov 5 13:58:48 2018 -0600
Committer: Sergio Pena <sergio.p...@cloudera.com>
Committed: Mon Nov 5 13:58:48 2018 -0600

----------------------------------------------------------------------
 pom.xml                                         | 22 +++++++++++++++++++-
 sentry-binding/sentry-binding-solr/pom.xml      | 16 ++++++++++++++
 sentry-hdfs/sentry-hdfs-common/pom.xml          |  6 ++++++
 .../org/apache/sentry/hdfs/PathsUpdate.java     |  8 +++----
 .../hdfs/SentryINodeAttributesProvider.java     |  5 +++++
 .../thrift/TestSentryWebServerWithKerberos.java | 21 ++++++++++++++++---
 6 files changed, 69 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sentry/blob/d4c62284/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index acbdcc2..46ca38e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -70,7 +70,6 @@ limitations under the License.
     <easymock.version>3.0</easymock.version>
     <fest.reflect.version>1.4.1</fest.reflect.version>
     <guava.version>14.0.1</guava.version>
-    <hadoop.version>2.7.5</hadoop.version>
     <hamcrest.version>1.3</hamcrest.version>
     <hive.version>2.3.3</hive.version>
     <jackson.version>1.9.13</jackson.version>
@@ -101,6 +100,10 @@ limitations under the License.
     
<test.sentry.hadoop.classpath>${maven.test.classpath}</test.sentry.hadoop.classpath>
     <zookeeper.version>3.4.5</zookeeper.version>
     <maven.jar.plugin.version>3.0.2</maven.jar.plugin.version>
+    <httpcomponents.version>4.5.3</httpcomponents.version>
+
+    <!-- Package versions for Sentry binding components -->
+    <hadoop.version>3.1.1</hadoop.version>
 
     <!-- Datanucleus package versions -->
     <datanucleus.maven.plugin.version>4.0.5</datanucleus.maven.plugin.version>
@@ -197,6 +200,7 @@ limitations under the License.
         <groupId>org.apache.hadoop</groupId>
         <artifactId>hadoop-minicluster</artifactId>
         <version>${hadoop.version}</version>
+        <scope>test</scope>
         <exclusions>
           <exclusion>
             <artifactId>curator-client</artifactId>
@@ -410,6 +414,10 @@ limitations under the License.
             <artifactId>jackson-mapper-asl</artifactId>
             <groupId>org.codehaus.jackson</groupId>
           </exclusion>
+          <exclusion>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-archives</artifactId>
+          </exclusion>
         </exclusions>
       </dependency>
       <dependency>
@@ -521,6 +529,10 @@ limitations under the License.
             <artifactId>jackson-xc</artifactId>
             <groupId>org.codehaus.jackson</groupId>
           </exclusion>
+          <exclusion>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-yarn-server-resourcemanager</artifactId>
+          </exclusion>
         </exclusions>
       </dependency>
       <dependency>
@@ -608,6 +620,10 @@ limitations under the License.
             <artifactId>jackson-xc</artifactId>
             <groupId>org.codehaus.jackson</groupId>
           </exclusion>
+          <exclusion>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-yarn-registry</artifactId>
+          </exclusion>
         </exclusions>
       </dependency>
       <dependency>
@@ -945,6 +961,10 @@ limitations under the License.
             <artifactId>jackson-xc</artifactId>
             <groupId>org.codehaus.jackson</groupId>
           </exclusion>
+          <exclusion>
+            <groupId>org.apache.hadoop</groupId>
+            <artifactId>hadoop-archives</artifactId>
+          </exclusion>
         </exclusions>
       </dependency>
     </dependencies>

http://git-wip-us.apache.org/repos/asf/sentry/blob/d4c62284/sentry-binding/sentry-binding-solr/pom.xml
----------------------------------------------------------------------
diff --git a/sentry-binding/sentry-binding-solr/pom.xml 
b/sentry-binding/sentry-binding-solr/pom.xml
index f2a5fca..97b1879 100644
--- a/sentry-binding/sentry-binding-solr/pom.xml
+++ b/sentry-binding/sentry-binding-solr/pom.xml
@@ -29,6 +29,22 @@ limitations under the License.
   <name>Sentry Binding for Solr</name>
 
   <dependencies>
+    <!-- This jetty dependency must be added before the solr-core dependency 
to avoid conflicting
+         other jetty dependencies -->
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-server</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
+    <!-- This jetty dependency must be added before the solr-core dependency 
to avoid conflicting
+         other jetty dependencies -->
+    <dependency>
+      <groupId>org.eclipse.jetty</groupId>
+      <artifactId>jetty-webapp</artifactId>
+      <version>${jetty.version}</version>
+      <scope>test</scope>
+    </dependency>
     <dependency>
       <groupId>org.apache.solr</groupId>
       <artifactId>solr-core</artifactId>

http://git-wip-us.apache.org/repos/asf/sentry/blob/d4c62284/sentry-hdfs/sentry-hdfs-common/pom.xml
----------------------------------------------------------------------
diff --git a/sentry-hdfs/sentry-hdfs-common/pom.xml 
b/sentry-hdfs/sentry-hdfs-common/pom.xml
index df6f04c..4d70d13 100644
--- a/sentry-hdfs/sentry-hdfs-common/pom.xml
+++ b/sentry-hdfs/sentry-hdfs-common/pom.xml
@@ -80,6 +80,12 @@ limitations under the License.
       <artifactId>mockito-all</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.httpcomponents</groupId>
+      <artifactId>httpclient</artifactId>
+      <version>${httpcomponents.version}</version>
+      <scope>provided</scope>
+    </dependency>
 
   </dependencies>
   <build>

http://git-wip-us.apache.org/repos/asf/sentry/blob/d4c62284/sentry-hdfs/sentry-hdfs-common/src/main/java/org/apache/sentry/hdfs/PathsUpdate.java
----------------------------------------------------------------------
diff --git 
a/sentry-hdfs/sentry-hdfs-common/src/main/java/org/apache/sentry/hdfs/PathsUpdate.java
 
b/sentry-hdfs/sentry-hdfs-common/src/main/java/org/apache/sentry/hdfs/PathsUpdate.java
index c9ecc40..edc3afc 100644
--- 
a/sentry-hdfs/sentry-hdfs-common/src/main/java/org/apache/sentry/hdfs/PathsUpdate.java
+++ 
b/sentry-hdfs/sentry-hdfs-common/src/main/java/org/apache/sentry/hdfs/PathsUpdate.java
@@ -26,11 +26,10 @@ import java.util.List;
 import com.google.common.annotations.VisibleForTesting;
 import org.apache.sentry.hdfs.service.thrift.TPathChanges;
 import org.apache.sentry.hdfs.service.thrift.TPathsUpdate;
-import org.apache.commons.httpclient.util.URIUtil;
-import org.apache.commons.httpclient.URIException;
 import org.apache.commons.lang.StringUtils;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.conf.Configuration;
+import org.apache.http.client.utils.URIBuilder;
 
 import org.apache.thrift.TException;
 
@@ -137,11 +136,10 @@ public class PathsUpdate implements Updateable.Update {
 
     URI uri;
     try {
-      uri = new URI(URIUtil.encodePath(path));
+      // Below converts unescaped path to escaped string and the constructs a 
URI from it.
+      uri = new URI(StringUtils.stripStart(new 
URIBuilder().setPath(path).toString(), "/"));
     } catch (URISyntaxException e) {
       throw new SentryMalformedPathException("Incomprehensible path [" + path 
+ "]", e);
-    } catch (URIException e) {
-      throw new SentryMalformedPathException("Unable to create URI from path[" 
+ path + "]", e);
     }
 
     String scheme = uri.getScheme();

http://git-wip-us.apache.org/repos/asf/sentry/blob/d4c62284/sentry-hdfs/sentry-hdfs-namenode-plugin/src/main/java/org/apache/sentry/hdfs/SentryINodeAttributesProvider.java
----------------------------------------------------------------------
diff --git 
a/sentry-hdfs/sentry-hdfs-namenode-plugin/src/main/java/org/apache/sentry/hdfs/SentryINodeAttributesProvider.java
 
b/sentry-hdfs/sentry-hdfs-namenode-plugin/src/main/java/org/apache/sentry/hdfs/SentryINodeAttributesProvider.java
index 18b6265..4d2ef00 100644
--- 
a/sentry-hdfs/sentry-hdfs-namenode-plugin/src/main/java/org/apache/sentry/hdfs/SentryINodeAttributesProvider.java
+++ 
b/sentry-hdfs/sentry-hdfs-namenode-plugin/src/main/java/org/apache/sentry/hdfs/SentryINodeAttributesProvider.java
@@ -331,6 +331,11 @@ public class SentryINodeAttributesProvider extends 
INodeAttributeProvider
   public INodeAttributes getAttributes(String[] pathElements,
                                        INodeAttributes inode) {
     Preconditions.checkNotNull(pathElements);
+    
+    if (pathElements.length == 0) {
+      return inode;
+    }
+
     pathElements = "".equals(pathElements[0]) && pathElements.length > 1 ?
             Arrays.copyOfRange(pathElements, 1, pathElements.length) :
             pathElements;

http://git-wip-us.apache.org/repos/asf/sentry/blob/d4c62284/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryWebServerWithKerberos.java
----------------------------------------------------------------------
diff --git 
a/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryWebServerWithKerberos.java
 
b/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryWebServerWithKerberos.java
index 5d94d4b..add2c28 100644
--- 
a/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryWebServerWithKerberos.java
+++ 
b/sentry-service/sentry-service-server/src/test/java/org/apache/sentry/api/service/thrift/TestSentryWebServerWithKerberos.java
@@ -88,7 +88,7 @@ public class TestSentryWebServerWithKerberos extends 
SentryServiceIntegrationBas
       new AuthenticatedURL(new KerberosAuthenticator()).openConnection(url, 
new AuthenticatedURL.Token());
       fail("Here should fail.");
     } catch (Exception e) {
-      boolean isExpectError = e.getMessage().contains("No valid credentials 
provided");
+      boolean isExpectError = exceptionContainsMessage(e,"No valid credentials 
provided");
       Assert.assertTrue("Here should fail by 'No valid credentials provided'," 
+
           " but the exception is:" + e, isExpectError);
     }
@@ -124,7 +124,7 @@ public class TestSentryWebServerWithKerberos extends 
SentryServiceIntegrationBas
           fail("Here should fail.");
         } catch (AuthenticationException e) {
           String expectedError = "status code: 403";
-          if (!e.getMessage().contains(expectedError)) {
+          if (!exceptionContainsMessage(e, expectedError)) {
             LOG.error("UnexpectedError: " + e.getMessage(), e);
             fail("UnexpectedError: " + e.getMessage());
           }
@@ -155,7 +155,7 @@ public class TestSentryWebServerWithKerberos extends 
SentryServiceIntegrationBas
           fail("Login with user1 should fail");
         } catch (AuthenticationException e) {
           String expectedError = "status code: 403";
-          if (!e.getMessage().contains(expectedError)) {
+          if (!exceptionContainsMessage(e, expectedError)) {
             LOG.error("UnexpectedError: " + e.getMessage(), e);
             fail("UnexpectedError: " + e.getMessage());
           }
@@ -172,4 +172,19 @@ public class TestSentryWebServerWithKerberos extends 
SentryServiceIntegrationBas
     conn.setRequestMethod("TRACE");
     Assert.assertEquals(HttpURLConnection.HTTP_FORBIDDEN, 
conn.getResponseCode());
   }
+
+  /*
+   * Check if the exception contains the specified message in any of the 
exception message
+   * or cause message.
+   *
+   * <p/>i.e. Hadoop 2.x has a 'no valid privileges' message in the 
e.getMessage() whereas
+   * Hadoop 3.x has the 'no valid privileges' message in the 
e.getCause().getMessage().
+   */
+  private boolean exceptionContainsMessage(Exception e, String message) {
+    if (e.getMessage().contains(message)) {
+      return true;
+    }
+
+    return e.getCause().getMessage().contains(message);
+  }
 }

Reply via email to