This is an automated email from the ASF dual-hosted git repository.
madhan pushed a commit to branch RANGER-3923
in repository https://gitbox.apache.org/repos/asf/ranger.git
The following commit(s) were added to refs/heads/RANGER-3923 by this push:
new 3b9ec333e RANGER-4490: added API to fetch DataShareInDataset Summary
3b9ec333e is described below
commit 3b9ec333e6f1c20874e0b8b82da1ce073125af6b
Author: prashant <[email protected]>
AuthorDate: Fri Dec 29 17:45:08 2023 +0530
RANGER-4490: added API to fetch DataShareInDataset Summary
Signed-off-by: Madhan Neethiraj <[email protected]>
---
.../org/apache/ranger/plugin/model/RangerGds.java | 2 +-
.../apache/ranger/plugin/util/SearchFilter.java | 2 +
.../java/org/apache/ranger/biz/GdsDBStore.java | 105 ++++++++++++++++++++-
.../org/apache/ranger/common/RangerSearchUtil.java | 2 +
.../main/java/org/apache/ranger/rest/GdsREST.java | 30 ++++++
.../ranger/security/context/RangerAPIList.java | 1 +
.../RangerGdsDataShareInDatasetService.java | 7 +-
7 files changed, 143 insertions(+), 6 deletions(-)
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java
b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java
index e4943d740..3bf53968f 100644
--- a/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java
+++ b/agents-common/src/main/java/org/apache/ranger/plugin/model/RangerGds.java
@@ -796,7 +796,7 @@ public class RangerGds {
public void setApprover(String approver) { this.approver = approver; }
- @Override
+ @Override
public String toString() {return toString(new
StringBuilder()).toString(); }
public StringBuilder toString(StringBuilder sb) {
diff --git
a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
index fe06d1dbe..ad304f88f 100755
---
a/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
+++
b/agents-common/src/main/java/org/apache/ranger/plugin/util/SearchFilter.java
@@ -115,6 +115,8 @@ public class SearchFilter {
public static final String SHARED_RESOURCE_NAME_PARTIAL =
"sharedResourceNamePartial"; // search, sort
public static final String RESOURCE_CONTAINS =
"resourceContains"; // search
public static final String SHARED_RESOURCE_ID =
"sharedResourceId"; // search, sort
+ public static final String APPROVER = "approver";
// search, sort
+ public static final String SHARE_STATUS = "shareStatus";
// search, sort
public static final String PROFILE_NAME = "profileName";
// search
public static final String OWNER_NAME = "ownerName";
// search
public static final String OWNER_TYPE = "ownerType";
// search: valid-values(user, group, role)
diff --git a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
index e38d0d15c..0112c3427 100755
--- a/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
+++ b/security-admin/src/main/java/org/apache/ranger/biz/GdsDBStore.java
@@ -26,6 +26,7 @@ import org.apache.ranger.common.*;
import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
import org.apache.ranger.db.*;
import org.apache.ranger.entity.*;
+import org.apache.ranger.plugin.model.RangerGds;
import org.apache.ranger.plugin.model.RangerGds.*;
import org.apache.ranger.plugin.model.RangerPolicy;
import org.apache.ranger.plugin.model.RangerPolicy.RangerPolicyItem;
@@ -48,6 +49,8 @@ import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
import static
org.apache.ranger.db.XXGlobalStateDao.RANGER_GLOBAL_STATE_NAME_GDS;
import static
org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_GDS_NAME;
@@ -277,9 +280,7 @@ public class GdsDBStore extends AbstractGdsStore {
LOG.debug("==> searchDatasets({})", filter);
if (filter.getParam(SearchFilter.CREATED_BY) != null) {
- String userName =
filter.getParam(SearchFilter.CREATED_BY);
- Long userId =
daoMgr.getXXPortalUser().findByLoginId(userName).getId();
- filter.setParam(SearchFilter.CREATED_BY,
Long.toString(userId));
+ setUserId(filter, SearchFilter.CREATED_BY);
}
PList<RangerDataset> ret = getUnscrubbedDatasets(filter);
@@ -1230,10 +1231,78 @@ public class GdsDBStore extends AbstractGdsStore {
return ret;
}
+ public PList<DataShareInDatasetSummary> getDshInDsSummary(SearchFilter
filter) {
+ LOG.debug("==> getDshInDsSummary({})", filter);
+
+ int maxRows = filter.getMaxRows();
+ int startIndex = filter.getStartIndex();
+
+ filter.setParam(SearchFilter.GDS_PERMISSION,
GdsPermission.ADMIN.name());
+
+ if (filter.getParam(SearchFilter.CREATED_BY) != null) {
+ setUserId(filter, SearchFilter.CREATED_BY);
+ }
+
+ if(filter.getParam(SearchFilter.APPROVER)!= null) {
+ setUserId(filter, SearchFilter.APPROVER);
+ }
+
+ if (filter.getParam(SearchFilter.SHARE_STATUS) != null) {
+ String shareStatus =
filter.getParam(SearchFilter.SHARE_STATUS);
+ int status =
GdsShareStatus.valueOf(shareStatus).ordinal();
+
+ filter.setParam(SearchFilter.SHARE_STATUS,
Integer.toString(status));
+ }
+
+ List<RangerDataset> datasets =
getUnscrubbedDatasets(filter).getList();
+ List<RangerDataShare> dataShares =
getUnscrubbedDataShares(filter).getList();
+ RangerDataShareInDatasetList dshInDsList =
dataShareInDatasetService.searchDataShareInDatasets(filter);
+ List<DataShareInDatasetSummary> dshInDsSummary =
getDshInDsSummary(dataShares, datasets, dshInDsList);
+
+ PList<DataShareInDatasetSummary> ret = getPList(dshInDsSummary,
startIndex, maxRows, filter.getSortBy(), filter.getSortType());
+
+ LOG.debug("<== getDshInDsSummary({}): ret={}", filter, ret);
+
+ return ret;
+ }
+
+ private List<DataShareInDatasetSummary>
getDshInDsSummary(List<RangerDataShare> dataShares, List<RangerDataset>
datasets, RangerDataShareInDatasetList dshInDsList) {
+ Set<DataShareInDatasetSummary> ret = new
LinkedHashSet<>();
+ Map<Long, RangerDataset> datasetMap = toMap(datasets);
+ Map<Long, RangerDataShare> dataShareMap = toMap(dataShares);
+
+ for (RangerDataShareInDataset dshInDs : dshInDsList.getList()) {
+ RangerDataset dataset =
datasetMap.get(dshInDs.getDatasetId());
+ RangerDataShare dataShare =
dataShareMap.get(dshInDs.getDataShareId());
+
+ if (dataset != null || dataShare != null) {
+ if (dataset == null) {
+ dataset = datasetService.read(dshInDs.getDatasetId());
+ } else if (dataShare == null) {
+ dataShare =
dataShareService.read(dshInDs.getDataShareId());
+ }
+
+ ret.add(toDshInDsSummary(dataset, dataShare,
dshInDs));
+ }
+ }
+
+ return Collections.unmodifiableList(new ArrayList<>(ret));
+ }
+
+ private <T extends RangerGdsBaseModelObject> Map<Long, T> toMap(List<T>
gdsObjects) {
+ return
gdsObjects.stream().collect(Collectors.toMap(RangerGdsBaseModelObject::getId,
Function.identity()));
+ }
+
private void updateGdsVersion() {
transactionSynchronizationAdapter.executeOnTransactionCommit(new
GlobalVersionUpdater(daoMgr, RANGER_GLOBAL_STATE_NAME_GDS));
}
+ private void setUserId(SearchFilter filter, String filterParam) {
+ String userName = filter.getParam(filterParam);
+ Long userId =
daoMgr.getXXPortalUser().findByLoginId(userName).getId();
+ filter.setParam(filterParam, Long.toString(userId));
+ }
+
private static class GlobalVersionUpdater implements Runnable {
final RangerDaoManager daoManager;
final String stateName;
@@ -1808,6 +1877,36 @@ public class GdsDBStore extends AbstractGdsStore {
return summary;
}
+ private DataShareInDatasetSummary toDshInDsSummary(RangerDataset
dataset, RangerDataShare dataShare,
+ RangerDataShareInDataset dshInDs) {
+ Map<String, Long> zoneIds = new HashMap<>();
+ DataShareInDatasetSummary summary = new
DataShareInDatasetSummary();
+
+ summary.setId(dshInDs.getId());
+ summary.setGuid(dshInDs.getGuid());
+ summary.setCreatedBy(dshInDs.getCreatedBy());
+ summary.setCreateTime(dshInDs.getCreateTime());
+ summary.setUpdatedBy(dshInDs.getUpdatedBy());
+ summary.setUpdateTime(dshInDs.getUpdateTime());
+
+ summary.setApprover(dshInDs.getApprover());
+ summary.setShareStatus(dshInDs.getStatus());
+ summary.setDatasetId(dataset.getId());
+ summary.setDatasetName(dataset.getName());
+ summary.setDataShareId(dataShare.getId());
+ summary.setDataShareName(dataShare.getName());
+ if (dataShare.getZone() != null &&
!dataShare.getZone().isEmpty()) {
+ summary.setZoneName(dataShare.getZone());
+
summary.setZoneId(getZoneId(dataShare.getZone(),zoneIds));
+ }
+ summary.setServiceName(dataShare.getService());
+ summary.setServiceId(getServiceId(dataShare.getService()));
+ summary.setDataShareName(dataShare.getName());
+
summary.setResourceCount(sharedResourceService.getResourceCountForDataShare(dataShare.getId()));
+
+ return summary;
+ }
+
private Long getServiceId(String serviceName) {
XXService xService = daoMgr.getXXService().findByName(serviceName);
diff --git
a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
index c26993304..59b57370b 100755
---
a/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
+++
b/security-admin/src/main/java/org/apache/ranger/common/RangerSearchUtil.java
@@ -93,6 +93,8 @@ public class RangerSearchUtil extends SearchUtil {
ret.setParam(SearchFilter.SERVICE_NAME_PREFIX,
request.getParameter(SearchFilter.SERVICE_NAME_PREFIX));
ret.setParam(SearchFilter.ZONE_NAME_PREFIX,
request.getParameter(SearchFilter.ZONE_NAME_PREFIX));
ret.setParam(SearchFilter.CREATED_BY,
request.getParameter(SearchFilter.CREATED_BY));
+ ret.setParam(SearchFilter.APPROVER,
request.getParameter(SearchFilter.APPROVER));
+ ret.setParam(SearchFilter.SHARE_STATUS,
request.getParameter(SearchFilter.SHARE_STATUS));
for (Map.Entry<String, String[]> e :
request.getParameterMap().entrySet()) {
String name = e.getKey();
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
index 043d00b59..eadcf0707 100755
--- a/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/GdsREST.java
@@ -37,6 +37,7 @@ import org.apache.ranger.plugin.model.RangerPluginInfo;
import org.apache.ranger.plugin.model.RangerPolicy;
import org.apache.ranger.plugin.model.RangerGds.DatasetSummary;
import org.apache.ranger.plugin.model.RangerGds.DataShareSummary;
+import org.apache.ranger.plugin.model.RangerGds.DataShareInDatasetSummary;
import org.apache.ranger.plugin.store.PList;
import org.apache.ranger.plugin.util.RangerPerfTracer;
import org.apache.ranger.plugin.util.SearchFilter;
@@ -1337,6 +1338,35 @@ public class GdsREST {
return ret;
}
+ @GET
+ @Path("/datashare/dataset/summary")
+ @Produces({ "application/json" })
+ @PreAuthorize("@rangerPreAuthSecurityHandler.isAPIAccessible(\"" +
RangerAPIList.SEARCH_DATASHARE_IN_DATASET_SUMMARY + "\")")
+ public PList<DataShareInDatasetSummary> getDshInDsSummary(@Context
HttpServletRequest request) {
+ LOG.debug("==> GdsREST.searchDshInDsSummary()");
+
+ PList<DataShareInDatasetSummary> ret;
+ SearchFilter filter = null;
+ RangerPerfTracer perf =
RangerPerfTracer.getPerfTracer(PERF_LOG, "GdsREST.getDshInDsSummary()");
+
+ try {
+ filter = searchUtil.getSearchFilter(request,
dshidService.sortFields);
+
+ ret = gdsStore.getDshInDsSummary(filter);
+ } catch (WebApplicationException excp) {
+ throw excp;
+ } catch (Throwable excp) {
+ LOG.error("getDshInDsSummary({}) failed", filter, excp);
+
+ throw
restErrorUtil.createRESTException(excp.getMessage());
+ } finally {
+ RangerPerfTracer.log(perf);
+ }
+
+ LOG.debug("<== GdsREST.getDshInDsSummary({}): {}", filter, ret);
+
+ return ret;
+ }
@POST
@Path("/dataset/project")
diff --git
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
index f21d445c4..65e0f7848 100755
---
a/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
+++
b/security-admin/src/main/java/org/apache/ranger/security/context/RangerAPIList.java
@@ -251,6 +251,7 @@ public class RangerAPIList {
public static final String REMOVE_DATASHARE_IN_DATASET =
"GdsREST.removeDataShareInDataset";
public static final String GET_DATASHARE_IN_DATASET =
"GdsREST.getDataShareInDataset";
public static final String SEARCH_DATASHARE_IN_DATASET =
"GdsREST.searchDataShareInDataset";
+ public static final String SEARCH_DATASHARE_IN_DATASET_SUMMARY =
"GdsREST.getDshInDsSummary";
public static final String ADD_DATASET_IN_PROJECT =
"GdsREST.addDatasetInProject";
public static final String UPDATE_DATASET_IN_PROJECT =
"GdsREST.updateDatasetInProject";
diff --git
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
index 016711f6b..a76cb2a99 100644
---
a/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
+++
b/security-admin/src/main/java/org/apache/ranger/service/RangerGdsDataShareInDatasetService.java
@@ -72,11 +72,14 @@ public class RangerGdsDataShareInDatasetService extends
RangerGdsBaseModelServic
searchFields.add(new SearchField(SearchFilter.ZONE_NAME,
"z.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.FULL, "XXGdsDataShare dsh, XXSecurityZone z",
"obj.dataShareId = dsh.id and dsh.zoneId = z.id"));
searchFields.add(new SearchField(SearchFilter.ZONE_NAME_PARTIAL,
"z.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataShare dsh, XXSecurityZone z",
"obj.dataShareId = dsh.id and dsh.zoneId = z.id"));
searchFields.add(new SearchField(SearchFilter.DATASET_ID,
"obj.datasetId", SearchField.DATA_TYPE.INTEGER,
SearchField.SEARCH_TYPE.FULL));
- searchFields.add(new SearchField(SearchFilter.DATASET_NAME,
"d.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.FULL, "XXGdsDataset d",
"obj.datasetId = d.id"));
- searchFields.add(new SearchField(SearchFilter.DATASET_NAME_PARTIAL,
"d.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d",
"obj.datasetId = d.id"));
+ searchFields.add(new SearchField(SearchFilter.DATASET_NAME,
"d.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.FULL, "XXGdsDataset d", "obj.datasetId = d.id"));
+ searchFields.add(new SearchField(SearchFilter.DATASET_NAME_PARTIAL,
"d.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d", "obj.datasetId = d.id"));
searchFields.add(new SearchField(SearchFilter.PROJECT_ID,
"dip.projectId", SearchField.DATA_TYPE.INTEGER,
SearchField.SEARCH_TYPE.FULL, "XXGdsDataset d, XXGdsDatasetInProject dip",
"obj.datasetId = d.id and d.id = dip.datasetId"));
searchFields.add(new SearchField(SearchFilter.PROJECT_NAME,
"p.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.FULL, "XXGdsDataset d, XXGdsDatasetInProject dip,
XXGdsProject p", "obj.datasetId = d.id and d.id = dip.datasetId and
dip.projectId = p.id"));
searchFields.add(new SearchField(SearchFilter.PROJECT_NAME_PARTIAL,
"p.name", SearchField.DATA_TYPE.STRING,
SearchField.SEARCH_TYPE.PARTIAL, "XXGdsDataset d, XXGdsDatasetInProject dip,
XXGdsProject p", "obj.datasetId = d.id and d.id = dip.datasetId and
dip.projectId = p.id"));
+ searchFields.add(new SearchField(SearchFilter.APPROVER,
"obj.approverId", SearchField.DATA_TYPE.INTEGER,
SearchField.SEARCH_TYPE.FULL));
+ searchFields.add(new SearchField(SearchFilter.CREATED_BY,
"obj.addedByUserId",SearchField.DATA_TYPE.INTEGER,
SearchField.SEARCH_TYPE.FULL));
+ searchFields.add(new SearchField(SearchFilter.SHARE_STATUS,
"obj.status", SearchField.DATA_TYPE.INTEGER,
SearchField.SEARCH_TYPE.FULL));
sortFields.add(new SortField(SearchFilter.CREATE_TIME,
"obj.createTime"));
sortFields.add(new SortField(SearchFilter.UPDATE_TIME,
"obj.updateTime"));