You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by pr...@apache.org on 2021/12/22 12:25:29 UTC

[ranger] branch master updated: RANGER-3533 : Provide sorting on columns throughout the audits result set and policy listing page

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

pradeep 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 27b2840  RANGER-3533 : Provide sorting on columns throughout the audits result set and policy listing page
27b2840 is described below

commit 27b28408a162290c1a195fd89ed6db9e28ddcb0d
Author: mateenmansoori <ma...@gmail.com>
AuthorDate: Thu Dec 16 13:04:28 2021 +0530

    RANGER-3533 : Provide sorting on columns throughout the audits result set and policy listing page
    
    Signed-off-by: pradeep <pr...@apache.org>
---
 .../org/apache/ranger/AccessAuditsService.java     |  9 +++++
 .../java/org/apache/ranger/rest/ServiceREST.java   | 39 +++++++++++++++++++++-
 .../apache/ranger/service/XAccessAuditService.java | 11 +++++-
 .../main/webapp/scripts/controllers/Controller.js  |  3 --
 .../views/policies/NRangerPolicyTableLayout.js     | 22 ++++++++----
 .../views/policies/RangerPolicyTableLayout.js      | 30 +++++++++++------
 .../webapp/scripts/views/reports/AuditLayout.js    | 34 ++++++++++---------
 7 files changed, 111 insertions(+), 37 deletions(-)

diff --git a/security-admin/src/main/java/org/apache/ranger/AccessAuditsService.java b/security-admin/src/main/java/org/apache/ranger/AccessAuditsService.java
index e902e65..4d97f28 100644
--- a/security-admin/src/main/java/org/apache/ranger/AccessAuditsService.java
+++ b/security-admin/src/main/java/org/apache/ranger/AccessAuditsService.java
@@ -25,6 +25,7 @@ import org.apache.ranger.common.PropertiesUtil;
 import org.apache.ranger.common.RESTErrorUtil;
 import org.apache.ranger.common.SearchField;
 import org.apache.ranger.common.SortField;
+import org.apache.ranger.common.SortField.SORT_ORDER;
 import org.apache.ranger.db.RangerDaoManager;
 import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -102,6 +103,14 @@ public class AccessAuditsService {
 
         sortFields.add(new SortField("eventTime", "evtTime", true,
                 SortField.SORT_ORDER.DESC));
+        sortFields.add(new SortField("policyId", "policy", false, SORT_ORDER.ASC));
+        sortFields.add(new SortField("requestUser", "reqUser", false, SORT_ORDER.ASC));
+        sortFields.add(new SortField("resourceType", "resType", false, SORT_ORDER.ASC));
+        sortFields.add(new SortField("accessType", "access", false, SORT_ORDER.ASC));
+        sortFields.add(new SortField("action", "action", false, SORT_ORDER.ASC));
+        sortFields.add(new SortField("aclEnforcer", "enforcer", false, SORT_ORDER.ASC));
+        sortFields.add(new SortField("zoneName", "zoneName", false, SORT_ORDER.ASC));
+        sortFields.add(new SortField("clientIP", "cliIP", false, SORT_ORDER.ASC));
     }
 
     protected void updateUserExclusion(Map<String, Object> paramList) {
diff --git a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
index 2f5fda2..8d9d6f8 100644
--- a/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
+++ b/security-admin/src/main/java/org/apache/ranger/rest/ServiceREST.java
@@ -24,6 +24,7 @@ import java.io.InputStream;
 import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -84,6 +85,7 @@ import org.apache.ranger.common.RangerConstants;
 import org.apache.ranger.common.RangerSearchUtil;
 import org.apache.ranger.common.RangerValidatorFactory;
 import org.apache.ranger.common.ServiceUtil;
+import org.apache.ranger.common.SortField.SORT_ORDER;
 import org.apache.ranger.common.UserSessionBase;
 import org.apache.ranger.common.db.RangerTransactionSynchronizationAdapter;
 import org.apache.ranger.db.RangerDaoManager;
@@ -2881,7 +2883,6 @@ public class ServiceREST {
 		RangerPerfTracer perf = null;
 
 		SearchFilter filter = searchUtil.getSearchFilter(request, policyService.sortFields);
-
 		try {
 			if(RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
 				perf = RangerPerfTracer.getPerfTracer(PERF_LOG, "ServiceREST.getServicePolicies(serviceId=" + serviceId + ")");
@@ -3858,6 +3859,25 @@ public class ServiceREST {
 			String sortType   = filter.getSortType();
 			String sortBy     = filter.getSortBy();
 
+			if (StringUtils.isNotEmpty(sortBy) && StringUtils.isNotEmpty(sortType)) {
+				// By default policyList is sorted by policyId in asc order, So handling only desc case.
+				if (SearchFilter.POLICY_ID.equalsIgnoreCase(sortBy)) {
+					if (SORT_ORDER.DESC.name().equalsIgnoreCase(sortType)) {
+						policyList.sort(this.getPolicyComparator(sortBy, sortType));
+					}
+				} else if (SearchFilter.POLICY_NAME.equalsIgnoreCase(sortBy)) {
+					if (SORT_ORDER.ASC.name().equalsIgnoreCase(sortType)) {
+						policyList.sort(this.getPolicyComparator(sortBy, sortType));
+					} else if (SORT_ORDER.DESC.name().equalsIgnoreCase(sortType)) {
+						policyList.sort(this.getPolicyComparator(sortBy, sortType));
+					} else {
+						LOG.info("Invalid or Unsupported sortType : " + sortType);
+					}
+				} else {
+					LOG.info("Invalid or Unsupported sortBy property : " + sortBy);
+				}
+			}
+
 			List<RangerPolicy> retList = new ArrayList<RangerPolicy>();
 			for(int i = startIndex; i < toIndex; i++) {
 				retList.add(policyList.get(i));
@@ -3875,6 +3895,23 @@ public class ServiceREST {
 		return ret;
 	}
 
+	private Comparator<RangerPolicy> getPolicyComparator(String sortBy, String sortType) {
+		Comparator<RangerPolicy> rangerPolComparator = (RangerPolicy me, RangerPolicy other) -> {
+			int ret = 0;
+			if (SearchFilter.POLICY_ID.equalsIgnoreCase(sortBy)) {
+				ret = Long.compare(other.getId(), me.getId());
+			} else if (SearchFilter.POLICY_NAME.equalsIgnoreCase(sortBy)) {
+				if (SORT_ORDER.ASC.name().equalsIgnoreCase(sortType)) {
+					ret = me.getName().compareTo(other.getName());
+				} else if (SORT_ORDER.DESC.name().equalsIgnoreCase(sortType)) {
+					ret = other.getName().compareTo(me.getName());
+				}
+			}
+			return ret;
+		};
+		return rangerPolComparator;
+	}
+
 	private void validateGrantRevokeRequest(GrantRevokeRequest request, final boolean hasAdminPrivilege, final String loggedInUser) {
 		if (request != null) {
 			validateUsersGroupsAndRoles(request.getUsers(),request.getGroups(), request.getRoles());
diff --git a/security-admin/src/main/java/org/apache/ranger/service/XAccessAuditService.java b/security-admin/src/main/java/org/apache/ranger/service/XAccessAuditService.java
index cc23d39..4d96df6 100644
--- a/security-admin/src/main/java/org/apache/ranger/service/XAccessAuditService.java
+++ b/security-admin/src/main/java/org/apache/ranger/service/XAccessAuditService.java
@@ -95,7 +95,16 @@ public class XAccessAuditService extends XAccessAuditServiceBase<XXAccessAudit,
 				SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.FULL));
 		searchFields.add(new SearchField("agentHost", "obj.agentHost",
 				SearchField.DATA_TYPE.STRING, SearchField.SEARCH_TYPE.PARTIAL));
-		sortFields.add(new SortField("eventTime", "obj.eventTime", true, SORT_ORDER.DESC));
+
+		sortFields.add(new SortField("eventTime", "obj.evtTime", true, SORT_ORDER.DESC));
+		sortFields.add(new SortField("policyId", "obj.policy", false, SORT_ORDER.ASC));
+		sortFields.add(new SortField("requestUser", "obj.reqUser", false, SORT_ORDER.ASC));
+		sortFields.add(new SortField("resourceType", "obj.resType", false, SORT_ORDER.ASC));
+		sortFields.add(new SortField("accessType", "obj.access", false, SORT_ORDER.ASC));
+		sortFields.add(new SortField("action", "obj.action", false, SORT_ORDER.ASC));
+		sortFields.add(new SortField("aclEnforcer", "obj.enforcer", false, SORT_ORDER.ASC));
+		sortFields.add(new SortField("zoneName", "obj.zoneName", false, SORT_ORDER.ASC));
+		sortFields.add(new SortField("clientIP", "obj.cliIP", false, SORT_ORDER.ASC));
 }
 
 	protected XXAccessAudit mapViewToEntityBean(VXAccessAudit vObj, XXAccessAudit mObj, int OPERATION_CONTEXT) {
diff --git a/security-admin/src/main/webapp/scripts/controllers/Controller.js b/security-admin/src/main/webapp/scripts/controllers/Controller.js
index 7bfce42..d984bac 100755
--- a/security-admin/src/main/webapp/scripts/controllers/Controller.js
+++ b/security-admin/src/main/webapp/scripts/controllers/Controller.js
@@ -98,9 +98,6 @@ define(function(require) {
             var accessAuditList = new VXAccessAuditList();
             var XAUtil = require('utils/XAUtils');
             var localization = require('utils/XALangSupport');
-            _.extend(accessAuditList.queryParams, {
-                'sortBy': 'eventTime'
-            });
             App.rContent.show(new view({
                 accessAuditList: accessAuditList,
                 tab: tab
diff --git a/security-admin/src/main/webapp/scripts/views/policies/NRangerPolicyTableLayout.js b/security-admin/src/main/webapp/scripts/views/policies/NRangerPolicyTableLayout.js
index 18664f7..2e32ef7 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/NRangerPolicyTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/NRangerPolicyTableLayout.js
@@ -286,7 +286,7 @@ define(function(require) {
             getColumns: function() {
                 var that = this;
                 var cols = {
-                    id: {
+                    policyId : {
                         cell: 'html',
                         label: localization.tt("lbl.policyId"),
                         formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
@@ -317,13 +317,23 @@ define(function(require) {
                             }
                         }),
                         editable: false,
-                        sortable: false
+                        sortable: true,
+                        direction: "ascending",
                     },
-                    name: {
-                        cell: 'string',
-                        label: localization.tt("lbl.policyName"),
+                    policyName : {
+                        cell : 'string',
+                        label : localization.tt("lbl.policyName"),
                         editable: false,
-                        sortable: false
+                        sortable:true,
+                        formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                            fromRaw: function (rawValue, model) {
+                                if(model) {
+                                    return model.get('name');
+                                } else {
+                                    return '--';
+                                }
+                            }
+                        })
                     },
                     policyLabels: {
                         cell: Backgrid.HtmlCell.extend({
diff --git a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js
index c20bcb9..35952d4 100644
--- a/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/policies/RangerPolicyTableLayout.js
@@ -251,9 +251,9 @@ define(function(require){
 		getColumns : function(){
 			var that = this;
 			var cols = {
-				id : {
+				policyId : {
                     cell : 'html',
-					label	: localization.tt("lbl.policyId"),
+                    label : localization.tt("lbl.policyId"),
                     formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                         fromRaw: function (rawValue, model) {
                             if(XAUtil.isAuditorOrKMSAuditor(SessionMgr)){
@@ -281,14 +281,24 @@ define(function(require){
                             }
                         }
                     }),
-					editable: false,
-					sortable : false
-				},
-				name : {
-					cell : 'string',
-					label	: localization.tt("lbl.policyName"),
-					editable: false,
-					sortable : false
+                    editable: false,
+                    sortable : true,
+                    direction: "ascending",
+                },
+                policyName : {
+                    cell : 'string',
+                    label : localization.tt("lbl.policyName"),
+                    editable: false,
+                    sortable:true,
+                    formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
+                        fromRaw: function (rawValue, model) {
+                            if(model) {
+                                return model.get('name');
+                            } else {
+                                return '--';
+                            }
+                        }
+                    })
                 },
                 policyLabels: {
                     cell	: Backgrid.HtmlCell.extend({className: 'cellWidth-1'}),
diff --git a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
index 972e785..1420e90 100644
--- a/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
+++ b/security-admin/src/main/webapp/scripts/views/reports/AuditLayout.js
@@ -1266,7 +1266,8 @@ define(function(require) {
 						}),
 						label	: localization.tt("lbl.policyId"),
 						editable: false,
-						sortable : false
+						sortable : true,
+						sortType: 'toggle',
 					},
                     policyVersion: {
                         label : localization.tt("lbl.policyVersion"),
@@ -1289,9 +1290,9 @@ define(function(require) {
 					eventTime : {
 						label : 'Event Time',
 						cell: "String",
-						click : false,
-						drag : false,
 						editable:false,
+						sortable : true,
+						direction: "descending",
                         sortType: 'toggle',
                         formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 							fromRaw: function (rawValue, model) {
@@ -1313,7 +1314,8 @@ define(function(require) {
 						click : false,
 						drag : false,
                                                 editable:false,
-                        sortable : false,
+                        sortable : true,
+                        sortType: 'toggle',
 					},
 					repoName : {
 						label : 'Service (Name / Type)',
@@ -1332,31 +1334,31 @@ define(function(require) {
 					resourceType: {
 						label : 'Resource (Name / Type)',
 						cell: "html",
-						click: false,
 						formatter: _.extend({},Backgrid.CellFormatter.prototype,{
 							 fromRaw: function(rawValue,model) {
 							     return XAViewUtils.resourceTypeFormatter(rawValue, model);
 							 }
 						}),
 						drag: false,
-						sortable: false,
+						sortable: true,
+						sortType: 'toggle',
 						editable: false,
 					},
 					accessType : {
 						label : localization.tt("lbl.accessType"),
 						cell: "String",
-						click : false,
 						drag : false,
-						sortable:false,
+						sortable:true,
+						sortType: 'toggle',
 						editable:false
 					},
 					action : {
 						label : localization.tt("lbl.permission"),
 						cell: "html",
-						click : false,
 						drag : false,
 						editable:false,
-						sortable : false,
+						sortable : true,
+						sortType: 'toggle',
 						formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
 							fromRaw : function (rawValue, model) {
 								rawValue = _.escape(rawValue);
@@ -1395,9 +1397,9 @@ define(function(require) {
 					aclEnforcer : {
 						label :localization.tt("lbl.aclEnforcer"),
 						cell: "String",
-						click : false,
 						drag : false,
-						sortable:false,
+						sortable:true,
+						sortType: 'toggle',
 						editable:false
 					},
 					agentHost : {
@@ -1419,9 +1421,9 @@ define(function(require) {
 					clientIP : {
 						label : 'Client IP',
 						cell: "string",
-						click : false,
 						drag : false,
-						sortable:false,
+						sortable:true,
+						sortType: 'toggle',
 						editable:false
 					},
                     clusterName : {
@@ -1445,7 +1447,6 @@ define(function(require) {
                     zoneName: {
 						label : localization.tt("lbl.zoneName"),
 						cell: "html",
-						click: false,
 						formatter: _.extend({}, Backgrid.CellFormatter.prototype, {
                             fromRaw: function (rawValue, model) {
                                 rawValue = _.escape(rawValue);
@@ -1457,7 +1458,8 @@ define(function(require) {
                             }
                         }),
 						drag: false,
-						sortable: false,
+						sortable: true,
+						sortType: 'toggle',
 						editable: false,
 					},