Skip to content

Commit 2e2a62b

Browse files
author
Ramesh Mani
committed
RANGER-5577:API for update and delete of resources in DataShare
1 parent 21520b7 commit 2e2a62b

7 files changed

Lines changed: 112 additions & 0 deletions

File tree

agents-common/src/main/java/org/apache/ranger/plugin/store/AbstractGdsStore.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,10 @@ public RangerSharedResource updateSharedResource(RangerSharedResource resource)
132132
return null;
133133
}
134134

135+
@Override
136+
public void updateSharedResources(List<Long> sharedResourceIds) throws Exception {
137+
}
138+
135139
@Override
136140
public void removeSharedResources(List<Long> sharedResourceIds) throws Exception {
137141
}

agents-common/src/main/java/org/apache/ranger/plugin/store/GdsStore.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,8 @@ public interface GdsStore {
102102

103103
RangerSharedResource updateSharedResource(RangerSharedResource resource) throws Exception;
104104

105+
void updateSharedResources(List<Long> sharedResourceIds) throws Exception;
106+
105107
void removeSharedResources(List<Long> sharedResourceIds) throws Exception;
106108

107109
RangerSharedResource getSharedResource(Long sharedResourceId) throws Exception;

security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,6 +719,27 @@ public RangerSharedResource updateSharedResource(RangerSharedResource resource)
719719
return ret;
720720
}
721721

722+
@Override
723+
public void updateSharedResources(List<Long> sharedResourceIds) {
724+
LOG.debug("==> updateSharedResources({})", sharedResourceIds);
725+
726+
for (Long sharedResourceId : sharedResourceIds) {
727+
RangerSharedResource existing = null;
728+
729+
try {
730+
existing = sharedResourceService.read(sharedResourceId);
731+
} catch (Exception excp) {
732+
// ignore
733+
}
734+
735+
if (existing != null) {
736+
updateSharedResource(existing);
737+
}
738+
}
739+
740+
LOG.debug("<== updateSharedResources({})", sharedResourceIds);
741+
}
742+
722743
@Override
723744
public void removeSharedResources(List<Long> sharedResourceIds) {
724745
LOG.debug("==> removeSharedResources({})", sharedResourceIds);

security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1261,6 +1261,47 @@ public RangerSharedResource updateSharedResource(@PathParam("id") Long resourceI
12611261
return ret;
12621262
}
12631263

1264+
@PUT
1265+
@Path("/resources")
1266+
@Consumes("application/json")
1267+
@Produces("application/json")
1268+
@PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" + RangerAPIList.UPDATE_SHARED_RESOURCES + "\")")
1269+
public void updateSharedResources(@QueryParam("forceDelete") @DefaultValue("false") boolean forceDelete, List<Long> resourceIds) {
1270+
LOG.debug("==> GdsREST.updateSharedResources(resourceIds={}, forceDelete={})", resourceIds, forceDelete);
1271+
1272+
RangerPerfTracer perf = null;
1273+
1274+
try {
1275+
if (resourceIds == null) {
1276+
throw new Exception("resourceIds must not be null");
1277+
}
1278+
1279+
if (resourceIds.size() > SHARED_RESOURCES_MAX_BATCH_SIZE) {
1280+
throw new Exception("updateSharedResources batch size exceeded the configured limit: Maximum allowed is " + SHARED_RESOURCES_MAX_BATCH_SIZE);
1281+
}
1282+
1283+
if (RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
1284+
perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "GdsREST.updateSharedResources(" + resourceIds + ",forceDelete=" + forceDelete + ")");
1285+
}
1286+
1287+
if (forceDelete) {
1288+
gdsStore.removeSharedResources(resourceIds);
1289+
} else {
1290+
gdsStore.updateSharedResources(resourceIds);
1291+
}
1292+
} catch (WebApplicationException excp) {
1293+
throw excp;
1294+
} catch (Throwable excp) {
1295+
LOG.error("updateSharedResources(resourceIds={}, forceDelete={}) failed", resourceIds, forceDelete, excp);
1296+
1297+
throw restErrorUtil.createRESTException(excp.getMessage());
1298+
} finally {
1299+
RangerPerfTracer.log(perf);
1300+
}
1301+
1302+
LOG.debug("<== GdsREST.updateSharedResources(resourceIds={}, forceDelete={})", resourceIds, forceDelete);
1303+
}
1304+
12641305
@DELETE
12651306
@Path("/resource/{id}")
12661307
@Produces("application/json")

security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,7 @@ public class RangerAPIList {
237237
public static final String ADD_SHARED_RESOURCE = "GdsREST.addSharedResource";
238238
public static final String ADD_SHARED_RESOURCES = "GdsREST.addSharedResources";
239239
public static final String UPDATE_SHARED_RESOURCE = "GdsREST.updateSharedResource";
240+
public static final String UPDATE_SHARED_RESOURCES = "GdsREST.updateSharedResources";
240241
public static final String REMOVE_SHARED_RESOURCE = "GdsREST.removeSharedResource";
241242
public static final String REMOVE_SHARED_RESOURCES = "GdsREST.removeSharedResources";
242243
public static final String GET_SHARED_RESOURCE = "GdsREST.getSharedResource";

security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIMapping.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -547,6 +547,7 @@ private void mapGDSWithAPIs() {
547547
apiAssociatedWithGDS.add(RangerAPIList.ADD_SHARED_RESOURCE);
548548
apiAssociatedWithGDS.add(RangerAPIList.ADD_SHARED_RESOURCES);
549549
apiAssociatedWithGDS.add(RangerAPIList.UPDATE_SHARED_RESOURCE);
550+
apiAssociatedWithGDS.add(RangerAPIList.UPDATE_SHARED_RESOURCES);
550551
apiAssociatedWithGDS.add(RangerAPIList.REMOVE_SHARED_RESOURCE);
551552
apiAssociatedWithGDS.add(RangerAPIList.REMOVE_SHARED_RESOURCES);
552553
apiAssociatedWithGDS.add(RangerAPIList.GET_SHARED_RESOURCE);

security-admin/src/test/java/org/apache/ranger/rest/TestGdsREST.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -924,6 +924,48 @@ public void testRemoveSharedResource() {
924924
verify(gdsStore).removeSharedResources(Arrays.asList(resourceId));
925925
}
926926

927+
@Test
928+
public void testUpdateSharedResources_updatesWhenNotForceDelete() throws Exception {
929+
List<Long> resourceIds = Arrays.asList(1L, 2L, 3L);
930+
931+
doNothing().when(gdsStore).updateSharedResources(resourceIds);
932+
933+
gdsREST.updateSharedResources(false, resourceIds);
934+
935+
verify(gdsStore).updateSharedResources(resourceIds);
936+
verify(gdsStore, Mockito.never()).removeSharedResources(Mockito.anyList());
937+
}
938+
939+
@Test
940+
public void testUpdateSharedResources_deletesWhenForceDelete() throws Exception {
941+
List<Long> resourceIds = Arrays.asList(1L, 2L, 3L);
942+
943+
doNothing().when(gdsStore).removeSharedResources(resourceIds);
944+
945+
gdsREST.updateSharedResources(true, resourceIds);
946+
947+
verify(gdsStore).removeSharedResources(resourceIds);
948+
verify(gdsStore, Mockito.never()).updateSharedResources(Mockito.anyList());
949+
}
950+
951+
@Test
952+
public void testUpdateSharedResourcesBatchSizeExceeded() {
953+
List<Long> resourceIds = new ArrayList<>();
954+
for (long i = 0; i < 101; i++) {
955+
resourceIds.add(i);
956+
}
957+
Mockito.when(restErrorUtil.createRESTException(Mockito.anyString())).thenReturn(new WebApplicationException());
958+
959+
assertThrows(WebApplicationException.class, () -> gdsREST.updateSharedResources(false, resourceIds));
960+
}
961+
962+
@Test
963+
public void testUpdateSharedResourcesNullResourceIds() {
964+
Mockito.when(restErrorUtil.createRESTException(Mockito.anyString())).thenReturn(new WebApplicationException());
965+
966+
assertThrows(WebApplicationException.class, () -> gdsREST.updateSharedResources(false, null));
967+
}
968+
927969
@Test
928970
public void testRemoveSharedResourceException() {
929971
Mockito.doThrow(new RuntimeException("err")).when(gdsStore).removeSharedResources(any(List.class));

0 commit comments

Comments
 (0)