You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ma...@apache.org on 2026/04/06 04:43:50 UTC

(ranger) branch master updated: RANGER-5463: Update userstore version after group-user mapping changes in createOrDeleteXGroupUserList

This is an automated email from the ASF dual-hosted git repository.

madhan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 160674812 RANGER-5463: Update userstore version after group-user mapping changes in createOrDeleteXGroupUserList
160674812 is described below

commit 16067481201487c156c10fec3c72c813bbcec376
Author: hayden <se...@a-bly.com>
AuthorDate: Sun Apr 5 21:15:32 2026 -0700

    RANGER-5463: Update userstore version after group-user mapping changes in createOrDeleteXGroupUserList
    
    Signed-off-by: Madhan Neethiraj <ma...@apache.org>
---
 .../main/java/org/apache/ranger/biz/XUserMgr.java  | 10 ++++-
 .../apache/ranger/service/XGroupUserService.java   |  8 ++--
 ...stXGroupUserServiceGroupUserMappingUpdator.java | 45 +++++++++++++++++++++-
 3 files changed, 57 insertions(+), 6 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
index 1d9ab6ca6..429da84f3 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/XUserMgr.java
@@ -2959,10 +2959,16 @@ public int createOrDeleteXGroupUserList(List<GroupUserInfo> groupUserInfoList) {
                 }
 
                 for (GroupUserInfo groupUserInfo : groupUserInfoList) {
-                    xGroupUserService.createOrDeleteXGroupUsers(groupUserInfo, usersFromDB);
+                    if (xGroupUserService.createOrDeleteXGroupUsers(groupUserInfo, usersFromDB)) {
+                        updatedGroups++;
+                    }
                 }
 
-                updatedGroups = groupUserInfoList.size();
+                logger.debug("No. of groups actually updated = {}", updatedGroups);
+            }
+
+            if (updatedGroups > 0) {
+                updateUserStoreVersion("createOrDeleteXGroupUserList(updatedGroups=" + updatedGroups + ")");
             }
         }
 
diff --git a/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java b/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java
index 61b0c95ee..96b7c1be1 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/XGroupUserService.java
@@ -84,7 +84,7 @@ public VXGroupUser createXGroupUserWithOutLogin(VXGroupUser vxGroupUser) {
         return vxGroupUser;
     }
 
-    public void createOrDeleteXGroupUsers(GroupUserInfo groupUserInfo, Map<String, Long> usersFromDB) {
+    public boolean createOrDeleteXGroupUsers(GroupUserInfo groupUserInfo, Map<String, Long> usersFromDB) {
         if (logger.isDebugEnabled()) {
             logger.debug("==>> createOrDeleteXGroupUsers for {}", groupUserInfo.getGroupName());
 
@@ -98,7 +98,7 @@ public void createOrDeleteXGroupUsers(GroupUserInfo groupUserInfo, Map<String, L
         if (CollectionUtils.isEmpty(groupUserInfo.getAddUsers()) && CollectionUtils.isEmpty(groupUserInfo.getDelUsers())) {
             logger.info("Group memberships for source are empty for {}", groupName);
 
-            return;
+            return false;
         }
 
         XXGroup xxGroup = daoManager.getXXGroup().findByGroupName(groupName);
@@ -106,7 +106,7 @@ public void createOrDeleteXGroupUsers(GroupUserInfo groupUserInfo, Map<String, L
         if (xxGroup == null) {
             logger.debug("createOrDeleteXGroupUsers(): groupName =  {} doesn't exist in database. Hence ignoring group membership updates", groupName);
 
-            return;
+            return false;
         }
 
         /* findUsersByGroupName returns all the entries from x_group_users table for a given group name and corresponding usernames from x_user table.
@@ -148,6 +148,8 @@ public void createOrDeleteXGroupUsers(GroupUserInfo groupUserInfo, Map<String, L
 
             logger.debug("<<== createOrDeleteXGroupUsers: Max memory = {} Free memory = {} Total memory = {}", Runtime.getRuntime().maxMemory() / mb, Runtime.getRuntime().freeMemory() / mb, Runtime.getRuntime().totalMemory() / mb);
         }
+
+        return true;
     }
 
     public VXGroupUser readResourceWithOutLogin(Long id) {
diff --git a/security-admin/src/test/java/org/apache/ranger/service/TestXGroupUserServiceGroupUserMappingUpdator.java b/security-admin/src/test/java/org/apache/ranger/service/TestXGroupUserServiceGroupUserMappingUpdator.java
index 108a43907..573871d5f 100644
--- a/security-admin/src/test/java/org/apache/ranger/service/TestXGroupUserServiceGroupUserMappingUpdator.java
+++ b/security-admin/src/test/java/org/apache/ranger/service/TestXGroupUserServiceGroupUserMappingUpdator.java
@@ -40,6 +40,8 @@
 import java.util.HashSet;
 import java.util.Map;
 
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.Mockito.doAnswer;
 import static org.mockito.Mockito.mock;
@@ -104,10 +106,51 @@ public void testCreateOrDeleteXGroupUsersSchedulesCreateAndDelete() {
             Map<String, Long> users = new HashMap<>();
             users.put("u1", 11L);
             users.put("u2", 22L);
-            svc.createOrDeleteXGroupUsers(info, users);
+
+            boolean result = svc.createOrDeleteXGroupUsers(info, users);
+
+            assertTrue(result);
             verify(entityDao).create(any(XXGroupUser.class));
         } finally {
             svc.entityDao = previousDao;
         }
     }
+
+    @Test
+    public void testCreateOrDeleteXGroupUsers_EmptyUsers() {
+        GroupUserInfo info = new GroupUserInfo();
+
+        info.setGroupName("group1");
+        info.setAddUsers(new HashSet<>());
+        info.setDelUsers(new HashSet<>());
+
+        Map<String, Long> users = new HashMap<>();
+
+        users.put("u1", 11L);
+
+        boolean result = svc.createOrDeleteXGroupUsers(info, users);
+
+        assertFalse(result);
+    }
+
+    @Test
+    public void testCreateOrDeleteXGroupUsers_GroupNotFound() {
+        GroupUserInfo info = new GroupUserInfo();
+
+        info.setGroupName("nonExistentGroup");
+        info.setAddUsers(new HashSet<>(Collections.singletonList("u1")));
+
+        XXGroupDao xGroupDao = mock(XXGroupDao.class);
+
+        when(daoMgr.getXXGroup()).thenReturn(xGroupDao);
+        when(xGroupDao.findByGroupName("nonExistentGroup")).thenReturn(null);
+
+        Map<String, Long> users = new HashMap<>();
+
+        users.put("u1", 11L);
+
+        boolean result = svc.createOrDeleteXGroupUsers(info, users);
+
+        assertFalse(result);
+    }
 }