Repository: sentry
Updated Branches:
  refs/heads/master 112cdcd4f -> 4f75cc1c4


SENTRY-2260: Update HDFS ACL's based on owner privileges. (Kalyan Kumar 
kalvagadda, reviewed-by Na Li)


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

Branch: refs/heads/master
Commit: 4f75cc1c4be7e10f48abf42caeee6e500808cee8
Parents: 112cdcd
Author: Kalyan Kumar Kalvagadda <kkal...@cloudera.com>
Authored: Tue Jun 12 10:02:41 2018 -0500
Committer: Kalyan Kumar Kalvagadda <kkal...@cloudera.com>
Committed: Tue Jun 12 10:02:41 2018 -0500

----------------------------------------------------------------------
 .../apache/sentry/hdfs/DBUpdateForwarder.java   | 20 +++++++
 .../apache/sentry/hdfs/PermDeltaRetriever.java  |  6 +++
 .../apache/sentry/hdfs/PermImageRetriever.java  |  5 +-
 .../apache/sentry/hdfs/TestDeltaRetriever.java  | 56 ++++++++++++++++++++
 .../apache/sentry/hdfs/TestImageRetriever.java  | 41 ++++++++++++++
 5 files changed, 126 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/sentry/blob/4f75cc1c/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/DBUpdateForwarder.java
----------------------------------------------------------------------
diff --git 
a/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/DBUpdateForwarder.java
 
b/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/DBUpdateForwarder.java
index 71ef5f9..065adb7 100644
--- 
a/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/DBUpdateForwarder.java
+++ 
b/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/DBUpdateForwarder.java
@@ -22,7 +22,11 @@ import static 
org.apache.sentry.hdfs.ServiceConstants.SEQUENCE_NUMBER_FULL_UPDAT
 
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import javax.annotation.concurrent.ThreadSafe;
+
+import org.apache.sentry.core.model.db.AccessConstants;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeEntity;
 import org.apache.sentry.service.thrift.SentryServiceState;
 import org.apache.sentry.service.thrift.SentryStateBank;
 import org.slf4j.Logger;
@@ -142,4 +146,20 @@ class DBUpdateForwarder<K extends Updateable.Update> {
       return Collections.singletonList(imageRetriever.retrieveFullImage());
     }
   }
+
+  /**
+   * Translate Owner Privilege
+   * @param privMap Collection of privileges on an privilege entity.
+   */
+  public static void translateOwnerPrivileges(Map<TPrivilegeEntity,String> 
privMap) {
+    if(privMap == null) {
+      return;
+    }
+    for (Map.Entry<TPrivilegeEntity, String> priv : privMap.entrySet()) {
+      if (priv.getValue().equalsIgnoreCase(AccessConstants.OWNER)) {
+        //Translate owner privilege
+        priv.setValue(AccessConstants.ALL);
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/sentry/blob/4f75cc1c/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermDeltaRetriever.java
----------------------------------------------------------------------
diff --git 
a/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermDeltaRetriever.java
 
b/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermDeltaRetriever.java
index 6974d37..7cd2c31 100644
--- 
a/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermDeltaRetriever.java
+++ 
b/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermDeltaRetriever.java
@@ -18,6 +18,7 @@
 package org.apache.sentry.hdfs;
 
 import com.codahale.metrics.Timer.Context;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeChanges;
 import org.apache.sentry.provider.db.service.model.MSentryPermChange;
 import org.apache.sentry.provider.db.service.persistent.SentryStore;
 
@@ -66,6 +67,11 @@ public class PermDeltaRetriever implements 
DeltaRetriever<PermissionsUpdate> {
         PermissionsUpdate permsUpdate = new PermissionsUpdate();
         permsUpdate.JSONDeserialize(mSentryPermChange.getPermChange());
         permsUpdate.setSeqNum(changeID);
+        Collection<TPrivilegeChanges> privChanges = 
permsUpdate.getPrivilegeUpdates();
+        for(TPrivilegeChanges privChange : privChanges) {
+          
DBUpdateForwarder.translateOwnerPrivileges(privChange.getAddPrivileges());
+          
DBUpdateForwarder.translateOwnerPrivileges(privChange.getDelPrivileges());
+        }
         updates.add(permsUpdate);
       }
       return updates;

http://git-wip-us.apache.org/repos/asf/sentry/blob/4f75cc1c/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermImageRetriever.java
----------------------------------------------------------------------
diff --git 
a/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermImageRetriever.java
 
b/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermImageRetriever.java
index 10d52b4..ef0203f 100644
--- 
a/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermImageRetriever.java
+++ 
b/sentry-hdfs/sentry-hdfs-service/src/main/java/org/apache/sentry/hdfs/PermImageRetriever.java
@@ -73,9 +73,10 @@ public class PermImageRetriever implements 
ImageRetriever<PermissionsUpdate> {
 
       for (Map.Entry<String, Map<TPrivilegeEntity, String>> privEnt : 
privilegeImage.entrySet()) {
         String authzObj = privEnt.getKey();
-        Map<TPrivilegeEntity,String> privs = privEnt.getValue();
+        Map<TPrivilegeEntity,String> privMap = privEnt.getValue();
+        DBUpdateForwarder.translateOwnerPrivileges(privMap);
         tPermUpdate.putToPrivilegeChanges(authzObj, new TPrivilegeChanges(
-        authzObj, privs, new HashMap<TPrivilegeEntity, String>()));
+        authzObj, privMap, new HashMap<TPrivilegeEntity, String>()));
       }
 
       for (Map.Entry<String, List<String>> privEnt : roleImage.entrySet()) {

http://git-wip-us.apache.org/repos/asf/sentry/blob/4f75cc1c/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestDeltaRetriever.java
----------------------------------------------------------------------
diff --git 
a/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestDeltaRetriever.java
 
b/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestDeltaRetriever.java
index 60696cc..d7bc748 100644
--- 
a/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestDeltaRetriever.java
+++ 
b/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestDeltaRetriever.java
@@ -17,15 +17,24 @@
  */
 package org.apache.sentry.hdfs;
 
+import org.apache.sentry.core.model.db.AccessConstants;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeEntity;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeEntityType;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeChanges;
 import org.apache.sentry.provider.db.service.model.MSentryPathChange;
+import org.apache.sentry.provider.db.service.model.MSentryPermChange;
 import org.apache.sentry.provider.db.service.persistent.SentryStore;
 import org.junit.Before;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
+import java.util.ArrayList;
+import java.util.Map;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -73,4 +82,51 @@ public class TestDeltaRetriever {
     assertEquals(false, pathsUpdates.get(1).hasFullImage());
     assertEquals(3, pathsUpdates.get(1).getImgNum());
   }
+
+  @Test
+  public void testDeltaPermUpdatesRetrievedWhenOwnerPrivileges() throws 
Exception {
+    PermDeltaRetriever deltaRetriever;
+    List<PermissionsUpdate> permUpdates;
+
+    Mockito.when(sentryStoreMock.getMSentryPermChanges(Mockito.anyLong())).
+            thenAnswer(new Answer() {
+              @Override
+              public List<MSentryPermChange> answer(InvocationOnMock 
invocation)
+                      throws Throwable {
+                List<MSentryPermChange> permChanges = new ArrayList<>();
+                PermissionsUpdate update = new PermissionsUpdate();
+                update.addPrivilegeUpdate("obj1").putToAddPrivileges( new 
TPrivilegeEntity(TPrivilegeEntityType.ROLE,
+                        "role1"), AccessConstants.OWNER);
+                MSentryPermChange perm1 = new MSentryPermChange(1,update);
+                permChanges.add(perm1);
+                update = new PermissionsUpdate();
+                update.addPrivilegeUpdate("obj1").putToAddPrivileges( new 
TPrivilegeEntity(TPrivilegeEntityType.USER,
+                        "user1"), AccessConstants.OWNER);
+                MSentryPermChange perm2 = new MSentryPermChange(2,update);
+                permChanges.add(perm2);
+                update = new PermissionsUpdate();
+                update.addPrivilegeUpdate("obj1").putToDelPrivileges( new 
TPrivilegeEntity(TPrivilegeEntityType.ROLE,
+                        "user1"), AccessConstants.OWNER);
+                MSentryPermChange perm3 = new MSentryPermChange(2,update);
+                permChanges.add(perm3);
+                return permChanges;
+              }
+            });
+
+    deltaRetriever = new PermDeltaRetriever(sentryStoreMock);
+    permUpdates = deltaRetriever.retrieveDelta(0, 3);
+    assertEquals(3, permUpdates.size());
+    assertEquals(1, permUpdates.get(0).getSeqNum());
+
+    for(PermissionsUpdate update : permUpdates) {
+      for(TPrivilegeChanges priv : update.getPrivilegeUpdates()) {
+        for(Map.Entry<TPrivilegeEntity,String> privEntry : 
priv.getAddPrivileges().entrySet()) {
+          assertEquals(AccessConstants.ALL, privEntry.getValue());
+        }
+        for(Map.Entry<TPrivilegeEntity,String> privEntry : 
priv.getDelPrivileges().entrySet()) {
+          assertEquals(AccessConstants.ALL, privEntry.getValue());
+        }
+      }
+    }
+  }
 }

http://git-wip-us.apache.org/repos/asf/sentry/blob/4f75cc1c/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestImageRetriever.java
----------------------------------------------------------------------
diff --git 
a/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestImageRetriever.java
 
b/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestImageRetriever.java
index d2d5391..b86136d 100644
--- 
a/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestImageRetriever.java
+++ 
b/sentry-hdfs/sentry-hdfs-service/src/test/java/org/apache/sentry/hdfs/TestImageRetriever.java
@@ -18,13 +18,21 @@
 package org.apache.sentry.hdfs;
 
 import com.google.common.collect.Sets;
+import junit.framework.Assert;
 import org.apache.commons.lang.StringUtils;
+import org.apache.sentry.core.model.db.AccessConstants;
 import org.apache.sentry.hdfs.service.thrift.TPathChanges;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeChanges;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeEntity;
+import org.apache.sentry.hdfs.service.thrift.TPrivilegeEntityType;
+import org.apache.sentry.provider.db.service.persistent.PermissionsImage;
 import org.apache.sentry.provider.db.service.persistent.SentryStore;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
 import org.mockito.Mockito;
+import org.mockito.invocation.InvocationOnMock;
+import org.mockito.stubbing.Answer;
 
 import java.util.Collection;
 import java.util.HashMap;
@@ -65,6 +73,39 @@ public class TestImageRetriever {
     assertTrue(comparePaths(fullPathsImage, pathsUpdate.getPathChanges()));
   }
 
+
+  @Test
+  public void testFullPermUpdatesRetrievedWithOwnerPrivileges() throws 
Exception {
+    PermImageRetriever imageRetriever;
+    PermissionsUpdate permUpdate;
+
+    Mockito.when(sentryStoreMock.retrieveFullPermssionsImage()).
+            thenAnswer(new Answer() {
+              @Override
+              public PermissionsImage answer(InvocationOnMock invocation)
+                      throws Throwable {
+                Map<String, Map<TPrivilegeEntity, String>> privilegeMap = new 
HashMap<>();
+                Map<TPrivilegeEntity, String> privMap = new HashMap<>();
+                privMap.put(new TPrivilegeEntity(TPrivilegeEntityType.ROLE, 
"role1"), AccessConstants.OWNER);
+                privMap.put(new TPrivilegeEntity(TPrivilegeEntityType.USER, 
"user1"), AccessConstants.OWNER);
+                privilegeMap.put("obj1", privMap);
+                privilegeMap.put("obj2", privMap);
+                return new PermissionsImage(new HashMap<>(), privilegeMap, 1L);
+              }
+            });
+
+    imageRetriever = new PermImageRetriever(sentryStoreMock);
+    permUpdate = imageRetriever.retrieveFullImage();
+    Assert.assertNotNull(permUpdate);
+
+    assertEquals(2, permUpdate.getPrivilegeUpdates().size());
+    for(TPrivilegeChanges privUpdate : permUpdate.getPrivilegeUpdates()) {
+      for(Map.Entry<TPrivilegeEntity,String> priv : 
privUpdate.getAddPrivileges().entrySet()) {
+        assertEquals(priv.getValue(), AccessConstants.ALL);
+      }
+    }
+  }
+
   private boolean comparePaths(Map<String, Collection<String>> expected, 
List<TPathChanges> actual) {
     if (expected.size() != actual.size()) {
       return false;

Reply via email to