This is an automated email from the ASF dual-hosted git repository.
kumaab 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 f74d36dda RANGER-5759: Add Atlas notification-topic and
post-notification privi… (#1219)
f74d36dda is described below
commit f74d36dda0078dd12440f8372d4dc7289aceb797
Author: eoinmcdonnell113 <[email protected]>
AuthorDate: Wed Oct 7 15:28:41 2026 -0400
RANGER-5759: Add Atlas notification-topic and post-notification privi…
(#1219)
---
.../service-defs/ranger-servicedef-atlas.json | 21 +-
dev-support/checkstyle-suppressions.xml | 1 +
.../atlas/authorizer/RangerAtlasAuthorizer.java | 35 +++
.../ranger/services/atlas/RangerServiceAtlas.java | 9 +
.../authorizer/TestRangerAtlasAuthorizer.java | 50 ++++
.../src/test/resources/atlas-policies.json | 32 ++-
.../atlas/authorizer/RangerAtlasAuthorizer.java | 8 +
.../optimized/current/ranger_core_db_mysql.sql | 1 +
.../optimized/current/ranger_core_db_oracle.sql | 1 +
.../optimized/current/ranger_core_db_postgres.sql | 1 +
.../current/ranger_core_db_sqlanywhere.sql | 2 +
.../optimized/current/ranger_core_db_sqlserver.sql | 1 +
.../PatchForAtlasNotificationTopic_J10067.java | 167 +++++++++++++
.../TestPatchForAtlasNotificationTopic_J10067.java | 266 +++++++++++++++++++++
14 files changed, 591 insertions(+), 4 deletions(-)
diff --git
a/agents-common/src/main/resources/service-defs/ranger-servicedef-atlas.json
b/agents-common/src/main/resources/service-defs/ranger-servicedef-atlas.json
index 5c52487df..4f622c6e8 100644
--- a/agents-common/src/main/resources/service-defs/ranger-servicedef-atlas.json
+++ b/agents-common/src/main/resources/service-defs/ranger-servicedef-atlas.json
@@ -258,6 +258,24 @@
"accessTypeRestrictions": [
"entity-add-classification", "entity-update-classification",
"entity-remove-classification"
]
+ },
+ {
+ "itemId": 17,
+ "name": "notification-topic",
+ "parent": "",
+ "level": 10,
+ "type": "string",
+ "mandatory": true,
+ "isValidLeaf": true,
+ "lookupSupported": true,
+ "excludesSupported": true,
+ "matcher":
"org.apache.ranger.plugin.resourcematcher.RangerDefaultResourceMatcher",
+ "matcherOptions": { "wildCard": "true", "ignoreCase": "false" },
+ "label": "Notification Topic",
+ "description": "Notification Topic",
+ "accessTypeRestrictions": [
+ "post-notification"
+ ]
}
],
"accessTypes": [
@@ -281,7 +299,8 @@
{ "itemId": 18, "name": "entity-remove-label", "label":
"Remove Label", "category": "UPDATE" },
{ "itemId": 19, "name": "entity-update-business-metadata", "label":
"Update Business Metadata", "category": "UPDATE" },
{ "itemId": 20, "name": "type-read", "label": "Read
Type", "category": "READ" },
- { "itemId": 21, "name": "admin-audits", "label": "Admin
Audits", "category": "MANAGE" }
+ { "itemId": 21, "name": "admin-audits", "label": "Admin
Audits", "category": "MANAGE" },
+ { "itemId": 22, "name": "post-notification", "label": "Post
Notification", "category": "UPDATE" }
],
"configs": [
{ "itemId": 1, "name": "username", "type": "string",
"mandatory": true, "label": "Username" },
diff --git a/dev-support/checkstyle-suppressions.xml
b/dev-support/checkstyle-suppressions.xml
index f20f609e9..5788457b2 100644
--- a/dev-support/checkstyle-suppressions.xml
+++ b/dev-support/checkstyle-suppressions.xml
@@ -91,6 +91,7 @@
<suppress files="PatchSetAccessTypeCategory_J10061" checks="TypeName"/>
<suppress files="PatchTagModulePermission_J10005" checks="TypeName"/>
<suppress files="PatchForAtlasPolicyUpdateForEntityRead_J10064"
checks="TypeName"/>
+ <suppress files="PatchForAtlasNotificationTopic_J10067" checks="TypeName"/>
<suppress files="PatchForOzoneServiceDefPolicyConditionUpdate_J10066"
checks="TypeName"/>
<suppress files="PatchForOzoneServiceDefAssumeRoleUpdate_J10065"
checks="TypeName"/>
</suppressions>
diff --git
a/plugin-atlas/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
b/plugin-atlas/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
index 839d2a801..0defeba3e 100644
---
a/plugin-atlas/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
+++
b/plugin-atlas/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
@@ -23,6 +23,7 @@
import org.apache.atlas.authorize.AtlasAdminAccessRequest;
import org.apache.atlas.authorize.AtlasAuthorizer;
import org.apache.atlas.authorize.AtlasEntityAccessRequest;
+import org.apache.atlas.authorize.AtlasNotificationRequest;
import org.apache.atlas.authorize.AtlasPrivilege;
import org.apache.atlas.authorize.AtlasRelationshipAccessRequest;
import org.apache.atlas.authorize.AtlasSearchResultScrubRequest;
@@ -70,6 +71,7 @@
import static
org.apache.ranger.services.atlas.RangerServiceAtlas.RESOURCE_ENTITY_LABEL;
import static
org.apache.ranger.services.atlas.RangerServiceAtlas.RESOURCE_ENTITY_OWNER;
import static
org.apache.ranger.services.atlas.RangerServiceAtlas.RESOURCE_ENTITY_TYPE;
+import static
org.apache.ranger.services.atlas.RangerServiceAtlas.RESOURCE_NOTIFICATION_TOPIC;
import static
org.apache.ranger.services.atlas.RangerServiceAtlas.RESOURCE_RELATIONSHIP_TYPE;
import static
org.apache.ranger.services.atlas.RangerServiceAtlas.RESOURCE_SERVICE;
import static
org.apache.ranger.services.atlas.RangerServiceAtlas.RESOURCE_TYPE_CATEGORY;
@@ -145,6 +147,39 @@ public boolean isAccessAllowed(AtlasAdminAccessRequest
request) {
return ret;
}
+ @Override
+ public boolean isAccessAllowed(AtlasNotificationRequest request) {
+ LOG.debug("==> isAccessAllowed({})", request);
+
+ final boolean ret;
+ RangerPerfTracer perf = null;
+
+ try {
+ if (RangerPerfTracer.isPerfTraceEnabled(PERF_LOG)) {
+ perf = RangerPerfTracer.getPerfTracer(PERF_LOG,
"RangerAtlasAuthorizer.isAccessAllowed(" + request + ")");
+ }
+
+ String action = request.getAction() !=
null ? request.getAction().getType() : null;
+ String topicName =
StringUtils.isNotBlank(request.getTopicName()) ? request.getTopicName() : "*";
+ RangerAccessResourceImpl rangerResource = new
RangerAccessResourceImpl(Collections.singletonMap(RESOURCE_NOTIFICATION_TOPIC,
topicName));
+ RangerAccessRequestImpl rangerRequest = new
RangerAccessRequestImpl(rangerResource, action, request.getUser(),
request.getUserGroups(), null);
+
+ rangerRequest.setClientIPAddress(request.getClientIPAddress());
+ rangerRequest.setAccessTime(request.getAccessTime());
+ rangerRequest.setAction(action);
+
rangerRequest.setForwardedAddresses(request.getForwardedAddresses());
+ rangerRequest.setRemoteIPAddress(request.getRemoteIPAddress());
+
+ ret = checkAccess(rangerRequest);
+ } finally {
+ RangerPerfTracer.log(perf);
+ }
+
+ LOG.debug("<== isAccessAllowed({}): {}", request, ret);
+
+ return ret;
+ }
+
@Override
public boolean isAccessAllowed(AtlasEntityAccessRequest request) {
LOG.debug("==> isAccessAllowed({})", request);
diff --git
a/plugin-atlas/src/main/java/org/apache/ranger/services/atlas/RangerServiceAtlas.java
b/plugin-atlas/src/main/java/org/apache/ranger/services/atlas/RangerServiceAtlas.java
index 6c9e92bb1..64e34e2a3 100644
---
a/plugin-atlas/src/main/java/org/apache/ranger/services/atlas/RangerServiceAtlas.java
+++
b/plugin-atlas/src/main/java/org/apache/ranger/services/atlas/RangerServiceAtlas.java
@@ -79,12 +79,14 @@ public class RangerServiceAtlas extends RangerBaseService {
public static final String RESOURCE_END_TWO_ENTITY_TYPE =
"end-two-entity-type";
public static final String RESOURCE_END_TWO_ENTITY_CLASSIFICATION =
"end-two-entity-classification";
public static final String RESOURCE_END_TWO_ENTITY_ID =
"end-two-entity";
+ public static final String RESOURCE_NOTIFICATION_TOPIC =
"notification-topic";
public static final String SEARCH_FEATURE_POLICY_NAME = "Allow
users to manage favorite searches";
public static final String ACCESS_TYPE_ENTITY_READ =
"entity-read";
public static final String ACCESS_TYPE_TYPE_READ =
"type-read";
public static final String ACCESS_TYPE_ENTITY_CREATE =
"entity-create";
public static final String ACCESS_TYPE_ENTITY_UPDATE =
"entity-update";
public static final String ACCESS_TYPE_ENTITY_DELETE =
"entity-delete";
+ public static final String ACCESS_TYPE_POST_NOTIFICATION =
"post-notification";
public static final String ADMIN_USERNAME_DEFAULT =
"admin";
public static final String TAGSYNC_USERNAME_DEFAULT =
"rangertagsync";
public static final String ENTITY_TYPE_USER_PROFILE =
"__AtlasUserProfile";
@@ -265,6 +267,7 @@ private Map<String, RangerPolicyResource>
getSearchFeaturePolicyResource() {
private static class AtlasServiceClient extends BaseClient {
private static final String[] TYPE_CATEGORIES = new String[]
{"classification", "enum", "entity", "relationship", "struct",
"business_metadata"};
+ private static final String[] NOTIFICATION_TOPICS = new String[]
{"ATLAS_HOOK", "ATLAS_ENTITIES"};
private Map<String, List<String>> typesDef = new HashMap<>();
@@ -387,6 +390,12 @@ public List<String> lookupResource(ResourceLookupContext
lookupContext) {
}
break;
+ case RESOURCE_NOTIFICATION_TOPIC:
+ for (String topic : NOTIFICATION_TOPICS) {
+ addIfStartsWithAndNotExcluded(ret, topic, userInput,
currentValues);
+ }
+ break;
+
default: {
ret.add(lookupContext.getResourceName());
}
diff --git
a/plugin-atlas/src/test/java/org/apache/ranger/authorization/atlas/authorizer/TestRangerAtlasAuthorizer.java
b/plugin-atlas/src/test/java/org/apache/ranger/authorization/atlas/authorizer/TestRangerAtlasAuthorizer.java
index 502dd93ab..5c6f0fbb9 100644
---
a/plugin-atlas/src/test/java/org/apache/ranger/authorization/atlas/authorizer/TestRangerAtlasAuthorizer.java
+++
b/plugin-atlas/src/test/java/org/apache/ranger/authorization/atlas/authorizer/TestRangerAtlasAuthorizer.java
@@ -19,6 +19,7 @@
import org.apache.atlas.authorize.AtlasAdminAccessRequest;
import org.apache.atlas.authorize.AtlasEntityAccessRequest;
+import org.apache.atlas.authorize.AtlasNotificationRequest;
import org.apache.atlas.authorize.AtlasPrivilege;
import org.apache.atlas.authorize.AtlasRelationshipAccessRequest;
import org.apache.atlas.authorize.AtlasTypeAccessRequest;
@@ -45,6 +46,10 @@ public class TestRangerAtlasAuthorizer {
private static final Set<String> USER_STEWARD1_GROUPS =
Collections.singleton("stewards");
private static final String USER_FINANCE_STEWARD1 =
"finance-data-steward1";
private static final Set<String> USER_FINANCE_STEWARD1_GROUPS = new
HashSet<>(Arrays.asList("finance-stewards", "stewards"));
+ private static final String USER_HOOK1 = "hook1";
+ private static final Set<String> USER_HOOK1_GROUPS =
Collections.singleton("hook-users");
+ private static final String TOPIC_ATLAS_HOOK =
"ATLAS_HOOK";
+ private static final String TOPIC_OTHER =
"OTHER_TOPIC";
private static final AtlasEntityDef ENTITY_DEF_HIVE_TABLE
= new AtlasEntityDef("hive_table");
private static final AtlasClassificationDef CLASSIFICATION_DEF_FINANCE
= new AtlasClassificationDef("FINANCE");
@@ -471,6 +476,51 @@ public void testAudits() {
.isTrue();
}
+ @Test
+ public void testPostNotification() {
+ AtlasNotificationRequest request = new
AtlasNotificationRequest(AtlasPrivilege.POST_NOTIFICATION, TOPIC_ATLAS_HOOK);
+
+ request.setUser(USER_USER1, USER_USER1_GROUPS);
+
+ assertThat(authorizer.isAccessAllowed(request))
+ .as("%s should be denied to post notification",
request.getUser())
+ .isFalse();
+
+ request.setUser(USER_STEWARD1, USER_STEWARD1_GROUPS);
+
+ assertThat(authorizer.isAccessAllowed(request))
+ .as("%s should be denied to post notification",
request.getUser())
+ .isFalse();
+
+ request.setUser(USER_ADMIN1, USER_ADMIN1_GROUPS);
+
+ assertThat(authorizer.isAccessAllowed(request))
+ .as("%s should be allowed to post notification",
request.getUser())
+ .isTrue();
+ }
+
+ @Test
+ public void testPostNotificationOnAllowedTopic() {
+ AtlasNotificationRequest request = new
AtlasNotificationRequest(AtlasPrivilege.POST_NOTIFICATION, TOPIC_ATLAS_HOOK);
+
+ request.setUser(USER_HOOK1, USER_HOOK1_GROUPS);
+
+ assertThat(authorizer.isAccessAllowed(request))
+ .as("%s should be allowed to post notification to %s",
request.getUser(), TOPIC_ATLAS_HOOK)
+ .isTrue();
+ }
+
+ @Test
+ public void testPostNotificationOnDeniedTopic() {
+ AtlasNotificationRequest request = new
AtlasNotificationRequest(AtlasPrivilege.POST_NOTIFICATION, TOPIC_OTHER);
+
+ request.setUser(USER_HOOK1, USER_HOOK1_GROUPS);
+
+ assertThat(authorizer.isAccessAllowed(request))
+ .as("%s should be denied to post notification to %s",
request.getUser(), TOPIC_OTHER)
+ .isFalse();
+ }
+
@Test
public void testAddRelationship() {
AtlasRelationshipAccessRequest request = new
AtlasRelationshipAccessRequest(typeRegistry, AtlasPrivilege.RELATIONSHIP_ADD,
RELATIONSHIP_TYPE_CLONE_OF, ENTITY_HIVE_TABLE_DB1_TBL1,
ENTITY_HIVE_TABLE_DB1_TBL2);
diff --git a/plugin-atlas/src/test/resources/atlas-policies.json
b/plugin-atlas/src/test/resources/atlas-policies.json
index 1020dd8f6..70eab66d5 100644
--- a/plugin-atlas/src/test/resources/atlas-policies.json
+++ b/plugin-atlas/src/test/resources/atlas-policies.json
@@ -1,5 +1,5 @@
{
- "serviceName": "dev_atlas", "serviceId": 8, "policyVersion": 19,
+ "serviceName": "dev_atlas", "serviceId": 8, "policyVersion": 21,
"policies": [
{
"id": 1, "name": "Default: all type-category, type",
@@ -111,6 +111,30 @@
}
]
},
+ {
+ "id": 9, "name": "Default: all notification-topic",
+ "resources": {
+ "notification-topic": { "values": [ "*" ] }
+ },
+ "policyItems": [
+ {
+ "accesses": [ { "type": "post-notification" } ],
+ "groups": [ "admins" ]
+ }
+ ]
+ },
+ {
+ "id": 10, "name": "Allow hook users to post to ATLAS_HOOK",
+ "resources": {
+ "notification-topic": { "values": [ "ATLAS_HOOK" ] }
+ },
+ "policyItems": [
+ {
+ "accesses": [ { "type": "post-notification" } ],
+ "groups": [ "hook-users" ]
+ }
+ ]
+ },
{
"id": 8, "name": "Entities having FINANCE classification",
"isDenyAllElse": true,
"resources": {
@@ -145,7 +169,8 @@
{ "itemId": 13, "name": "end-one-entity", "level": 40,
"parent": "end-one-entity-classification", "accessTypeRestrictions": [
"add-relationship", "update-relationship", "remove-relationship" ] },
{ "itemId": 14, "name": "end-two-entity-type", "level": 50,
"parent": "end-one-entity" },
{ "itemId": 15, "name": "end-two-entity-classification", "level": 60,
"parent": "end-two-entity-type" },
- { "itemId": 16, "name": "end-two-entity", "level": 70,
"parent": "end-two-entity-classification", "accessTypeRestrictions": [
"add-relationship", "update-relationship", "remove-relationship" ] }
+ { "itemId": 16, "name": "end-two-entity", "level": 70,
"parent": "end-two-entity-classification", "accessTypeRestrictions": [
"add-relationship", "update-relationship", "remove-relationship" ] },
+ { "itemId": 17, "name": "notification-topic", "level": 10,
"accessTypeRestrictions": [ "post-notification" ] }
],
"accessTypes": [
{ "itemId": 1, "name": "type-read", "category":
"READ", "label": "Read Type" },
@@ -168,7 +193,8 @@
{ "itemId": 18, "name": "admin-export", "category":
"MANAGE", "label": "Export" },
{ "itemId": 19, "name": "admin-import", "category":
"MANAGE", "label": "Import" },
{ "itemId": 20, "name": "admin-purge", "category":
"MANAGE", "label": "Purge" },
- { "itemId": 21, "name": "admin-audits", "category":
"MANAGE", "label": "Admin Audits" }
+ { "itemId": 21, "name": "admin-audits", "category":
"MANAGE", "label": "Admin Audits" },
+ { "itemId": 22, "name": "post-notification", "category":
"UPDATE", "label": "Post Notification" }
],
"configs": [
{ "itemId": 1, "name": "username", "type": "string",
"mandatory": true },
diff --git
a/ranger-atlas-plugin-shim/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
b/ranger-atlas-plugin-shim/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
index 8c308c81e..1167b14ff 100644
---
a/ranger-atlas-plugin-shim/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
+++
b/ranger-atlas-plugin-shim/src/main/java/org/apache/ranger/authorization/atlas/authorizer/RangerAtlasAuthorizer.java
@@ -23,6 +23,7 @@
import org.apache.atlas.authorize.AtlasAuthorizationException;
import org.apache.atlas.authorize.AtlasAuthorizer;
import org.apache.atlas.authorize.AtlasEntityAccessRequest;
+import org.apache.atlas.authorize.AtlasNotificationRequest;
import org.apache.atlas.authorize.AtlasRelationshipAccessRequest;
import org.apache.atlas.authorize.AtlasSearchResultScrubRequest;
import org.apache.atlas.authorize.AtlasTypeAccessRequest;
@@ -91,6 +92,13 @@ public boolean
isAccessAllowed(AtlasRelationshipAccessRequest request) throws At
}
}
+ @Override
+ public boolean isAccessAllowed(AtlasNotificationRequest request) throws
AtlasAuthorizationException {
+ try (PluginClassLoaderActivator ignored = new
PluginClassLoaderActivator(pluginClassLoader,
"isAccessAllowed:notificationAccess")) {
+ return rangerAtlasAuthorizerImpl.isAccessAllowed(request);
+ }
+ }
+
@Override
public void scrubSearchResults(AtlasSearchResultScrubRequest request)
throws AtlasAuthorizationException {
try (PluginClassLoaderActivator ignored = new
PluginClassLoaderActivator(pluginClassLoader, "scrubSearchResults")) {
diff --git a/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
b/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
index 8ecc59f4a..3fa29fa2c 100644
--- a/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
+++ b/security-admin/db/mysql/optimized/current/ranger_core_db_mysql.sql
@@ -2029,4 +2029,5 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10064',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10065',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10066',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10067',UTC_TIMESTAMP(),'Ranger 3.0.0',UTC_TIMESTAMP(),'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',UTC_TIMESTAMP(),'Ranger 1.0.0',UTC_TIMESTAMP(),'localhost','Y');
diff --git
a/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
b/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
index ddca10bb5..315c13a3b 100644
--- a/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
+++ b/security-admin/db/oracle/optimized/current/ranger_core_db_oracle.sql
@@ -2253,5 +2253,6 @@ INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,act
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10064',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10065',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10066',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
+INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'J10067',sys_extract_utc(systimestamp),'Ranger
3.0.0',sys_extract_utc(systimestamp),'localhost','Y');
INSERT INTO x_db_version_h
(id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES
(X_DB_VERSION_H_SEQ.nextval,'JAVA_PATCHES',sys_extract_utc(systimestamp),'Ranger
1.0.0',sys_extract_utc(systimestamp),'localhost','Y');
commit;
diff --git
a/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
b/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
index 654d19aa7..f59166bbe 100644
--- a/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
+++ b/security-admin/db/postgres/optimized/current/ranger_core_db_postgres.sql
@@ -2186,6 +2186,7 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10064',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10065',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10066',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10067',current_timestamp,'Ranger 3.0.0',current_timestamp,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',current_timestamp,'Ranger
1.0.0',current_timestamp,'localhost','Y');
DROP VIEW IF EXISTS vx_principal;
diff --git
a/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
b/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
index 678fe343b..91b5ccd4f 100644
---
a/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
+++
b/security-admin/db/sqlanywhere/optimized/current/ranger_core_db_sqlanywhere.sql
@@ -2421,6 +2421,8 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
GO
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10066',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
GO
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10067',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
+GO
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',CURRENT_TIMESTAMP,'Ranger
1.0.0',CURRENT_TIMESTAMP,'localhost','Y');
GO
exit
diff --git
a/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
b/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
index 68c864e74..66b124527 100644
--- a/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
+++ b/security-admin/db/sqlserver/optimized/current/ranger_core_db_sqlserver.sql
@@ -4626,5 +4626,6 @@ INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10064',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10065',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10066',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
+INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('J10067',CURRENT_TIMESTAMP,'Ranger 3.0.0',CURRENT_TIMESTAMP,'localhost','Y');
INSERT INTO x_db_version_h
(version,inst_at,inst_by,updated_at,updated_by,active) VALUES
('JAVA_PATCHES',CURRENT_TIMESTAMP,'Ranger
1.0.0',CURRENT_TIMESTAMP,'localhost','Y');
GO
diff --git
a/security-admin/src/main/java/org/apache/ranger/patch/PatchForAtlasNotificationTopic_J10067.java
b/security-admin/src/main/java/org/apache/ranger/patch/PatchForAtlasNotificationTopic_J10067.java
new file mode 100644
index 000000000..85d693150
--- /dev/null
+++
b/security-admin/src/main/java/org/apache/ranger/patch/PatchForAtlasNotificationTopic_J10067.java
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch;
+
+import org.apache.ranger.biz.ServiceDBStore;
+import org.apache.ranger.common.RangerValidatorFactory;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.entity.XXServiceDef;
+import org.apache.ranger.plugin.model.RangerServiceDef;
+import org.apache.ranger.plugin.model.RangerServiceDef.RangerAccessTypeDef;
+import org.apache.ranger.plugin.model.validation.RangerServiceDefValidator;
+import org.apache.ranger.plugin.model.validation.RangerValidator.Action;
+import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
+import org.apache.ranger.util.CLIUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@Component
+public class PatchForAtlasNotificationTopic_J10067 extends BaseLoader {
+ private static final Logger logger =
LoggerFactory.getLogger(PatchForAtlasNotificationTopic_J10067.class);
+
+ private static final List<String> ATLAS_RESOURCES = new
ArrayList<>(Collections.singletonList("notification-topic"));
+ private static final List<String> ATLAS_ACCESS_TYPES = new
ArrayList<>(Collections.singletonList("post-notification"));
+
+ @Autowired
+ RangerDaoManager daoMgr;
+
+ @Autowired
+ ServiceDBStore svcDBStore;
+
+ @Autowired
+ RangerValidatorFactory validatorFactory;
+
+ @Autowired
+ ServiceDBStore svcStore;
+
+ public static void main(String[] args) {
+ logger.info("main()");
+
+ try {
+ PatchForAtlasNotificationTopic_J10067 loader =
(PatchForAtlasNotificationTopic_J10067)
CLIUtil.getBean(PatchForAtlasNotificationTopic_J10067.class);
+
+ loader.init();
+
+ while (loader.isMoreToProcess()) {
+ loader.load();
+ }
+
+ logger.info("Load complete. Exiting!!!");
+
+ System.exit(0);
+ } catch (Exception e) {
+ logger.error("Error loading", e);
+
+ System.exit(1);
+ }
+ }
+
+ @Override
+ public void init() throws Exception {
+ // Do Nothing
+ }
+
+ @Override
+ public void printStats() {
+ logger.info("PatchForAtlasNotificationTopic_J10067 Logs");
+ }
+
+ @Override
+ public void execLoad() {
+ logger.info("==> PatchForAtlasNotificationTopic_J10067.execLoad()");
+
+ try {
+ addNotificationTopicPermissionInServiceDef();
+ } catch (Exception e) {
+ throw new RuntimeException("Error while updating " +
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME + " service-def");
+ }
+
+ logger.info("<== PatchForAtlasNotificationTopic_J10067.execLoad()");
+ }
+
+ private void addNotificationTopicPermissionInServiceDef() throws Exception
{
+ RangerServiceDef embeddedAtlasServiceDef =
EmbeddedServiceDefsUtil.instance().getEmbeddedServiceDef(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME);
+
+ if (embeddedAtlasServiceDef != null) {
+ XXServiceDef xXServiceDefObj =
daoMgr.getXXServiceDef().findByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME);
+
+ if (xXServiceDefObj == null) {
+ logger.info("{}: service-def not found. No patching is
needed", EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME);
+
+ return;
+ }
+
+ RangerServiceDef dbAtlasServiceDef =
svcDBStore.getServiceDefByName(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME);
+
+ List<RangerServiceDef.RangerResourceDef>
embeddedAtlasResourceDefs = embeddedAtlasServiceDef.getResources();
+ List<RangerServiceDef.RangerAccessTypeDef>
embeddedAtlasAccessTypes = embeddedAtlasServiceDef.getAccessTypes();
+
+ if (checkResourcePresent(embeddedAtlasResourceDefs)) {
+ dbAtlasServiceDef.setResources(embeddedAtlasResourceDefs);
+
+ if (checkAccessPresent(embeddedAtlasAccessTypes)) {
+ dbAtlasServiceDef.setAccessTypes(embeddedAtlasAccessTypes);
+ }
+ }
+
+ RangerServiceDefValidator validator =
validatorFactory.getServiceDefValidator(svcStore);
+
+ validator.validate(dbAtlasServiceDef, Action.UPDATE);
+
+ RangerServiceDef ret =
svcStore.updateServiceDef(dbAtlasServiceDef);
+
+ if (ret == null) {
+ logger.error("Error while updating {} service-def",
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME);
+
+ throw new RuntimeException("Error while updating " +
EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME + " service-def");
+ }
+ }
+ }
+
+ private boolean
checkResourcePresent(List<RangerServiceDef.RangerResourceDef> resourceDefs) {
+ boolean ret = false;
+
+ for (RangerServiceDef.RangerResourceDef resourceDef : resourceDefs) {
+ if (ATLAS_RESOURCES.contains(resourceDef.getName())) {
+ ret = true;
+ break;
+ }
+ }
+
+ return ret;
+ }
+
+ private boolean checkAccessPresent(List<RangerAccessTypeDef>
embeddedAtlasAccessTypes) {
+ boolean ret = false;
+
+ for (RangerServiceDef.RangerAccessTypeDef accessDef :
embeddedAtlasAccessTypes) {
+ if (ATLAS_ACCESS_TYPES.contains(accessDef.getName())) {
+ ret = true;
+ break;
+ }
+ }
+
+ return ret;
+ }
+}
diff --git
a/security-admin/src/test/java/org/apache/ranger/patch/TestPatchForAtlasNotificationTopic_J10067.java
b/security-admin/src/test/java/org/apache/ranger/patch/TestPatchForAtlasNotificationTopic_J10067.java
new file mode 100644
index 000000000..85849d6ee
--- /dev/null
+++
b/security-admin/src/test/java/org/apache/ranger/patch/TestPatchForAtlasNotificationTopic_J10067.java
@@ -0,0 +1,266 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ranger.patch;
+
+import org.apache.ranger.biz.ServiceDBStore;
+import org.apache.ranger.common.RangerValidatorFactory;
+import org.apache.ranger.db.RangerDaoManager;
+import org.apache.ranger.db.XXServiceDefDao;
+import org.apache.ranger.entity.XXServiceDef;
+import org.apache.ranger.plugin.model.RangerServiceDef;
+import org.apache.ranger.plugin.model.validation.RangerServiceDefValidator;
+import org.apache.ranger.plugin.store.EmbeddedServiceDefsUtil;
+import org.apache.ranger.util.CLIUtil;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.MethodOrderer;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.TestMethodOrder;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.MockedStatic;
+import org.mockito.Mockito;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.Method;
+import java.security.Permission;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+@ExtendWith(MockitoExtension.class)
+@TestMethodOrder(MethodOrderer.MethodName.class)
+public class TestPatchForAtlasNotificationTopic_J10067 {
+ private static void setIfPresent(Object target, String fieldName, Object
value) {
+ try {
+ Field f = target.getClass().getDeclaredField(fieldName);
+ f.setAccessible(true);
+ f.set(target, value);
+ } catch (NoSuchFieldException ignored) {
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Test
+ public void testExecLoadAndPrintStats() throws Exception {
+ try (MockedStatic<EmbeddedServiceDefsUtil> utilMock =
Mockito.mockStatic(EmbeddedServiceDefsUtil.class)) {
+ EmbeddedServiceDefsUtil util =
Mockito.mock(EmbeddedServiceDefsUtil.class);
+ utilMock.when(EmbeddedServiceDefsUtil::instance).thenReturn(util);
+
+ RangerServiceDef embeddedAtlas = new RangerServiceDef();
+ embeddedAtlas.setResources(Collections.emptyList());
+ embeddedAtlas.setAccessTypes(Collections.emptyList());
+ utilMock.when(() -> EmbeddedServiceDefsUtil.instance()
+
.getEmbeddedServiceDef(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME))
+ .thenReturn(embeddedAtlas);
+
+ PatchForAtlasNotificationTopic_J10067 patch = new
PatchForAtlasNotificationTopic_J10067();
+ RangerDaoManager daoMgr = Mockito.mock(RangerDaoManager.class);
+ ServiceDBStore svcDBStore = Mockito.mock(ServiceDBStore.class);
+ RangerValidatorFactory validatorFactory =
Mockito.mock(RangerValidatorFactory.class);
+ RangerServiceDefValidator validator =
Mockito.mock(RangerServiceDefValidator.class);
+
+ XXServiceDefDao xxServiceDefDao =
Mockito.mock(XXServiceDefDao.class);
+ Mockito.when(daoMgr.getXXServiceDef()).thenReturn(xxServiceDefDao);
+
Mockito.when(xxServiceDefDao.findByName(Mockito.anyString())).thenReturn(new
XXServiceDef());
+
+ RangerServiceDef dbAtlas = new RangerServiceDef();
+ Mockito.when(
+
svcDBStore.getServiceDefByName(Mockito.eq(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME)))
+ .thenReturn(dbAtlas);
+
Mockito.when(validatorFactory.getServiceDefValidator(Mockito.any(ServiceDBStore.class)))
+ .thenReturn(validator);
+
Mockito.when(svcDBStore.updateServiceDef(Mockito.any(RangerServiceDef.class)))
+ .thenAnswer(inv -> inv.getArgument(0));
+
+ setIfPresent(patch, "daoMgr", daoMgr);
+ setIfPresent(patch, "svcDBStore", svcDBStore);
+ setIfPresent(patch, "validatorFactory", validatorFactory);
+ setIfPresent(patch, "svcStore", svcDBStore);
+
+ patch.execLoad();
+ patch.printStats();
+ }
+ }
+
+ @Test
+ public void testInit_DoesNothing() throws Exception {
+ PatchForAtlasNotificationTopic_J10067 patch = new
PatchForAtlasNotificationTopic_J10067();
+ Assertions.assertDoesNotThrow(() -> patch.init());
+ }
+
+ @Test
+ public void testMain_Success_ExitZero() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try (MockedStatic<CLIUtil> cliMock =
Mockito.mockStatic(CLIUtil.class)) {
+ PatchForAtlasNotificationTopic_J10067 patch = new
PatchForAtlasNotificationTopic_J10067();
+ patch.setMoreToProcess(false);
+ cliMock.when(() ->
CLIUtil.getBean(PatchForAtlasNotificationTopic_J10067.class)).thenReturn(patch);
+ CLIUtil cli = Mockito.mock(CLIUtil.class);
+ cliMock.when(() -> CLIUtil.getBean(CLIUtil.class)).thenReturn(cli);
+
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException(String.valueOf(status));
+ }
+
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+ });
+
+ try {
+ PatchForAtlasNotificationTopic_J10067.main(new String[] {});
+ } catch (SecurityException se) {
+ Assertions.assertNotNull(se.getMessage());
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void testMain_Failure_ExitOne() {
+ SecurityManager originalSm = System.getSecurityManager();
+ try (MockedStatic<CLIUtil> cliMock =
Mockito.mockStatic(CLIUtil.class)) {
+ cliMock.when(() ->
CLIUtil.getBean(PatchForAtlasNotificationTopic_J10067.class)).thenThrow(new
RuntimeException("boom"));
+
+ System.setSecurityManager(new SecurityManager() {
+ @Override
+ public void checkExit(int status) {
+ throw new SecurityException(String.valueOf(status));
+ }
+
+ @Override
+ public void checkPermission(Permission perm) {
+ }
+ });
+
+ try {
+ PatchForAtlasNotificationTopic_J10067.main(new String[] {});
+ } catch (SecurityException se) {
+ Assertions.assertEquals("1", se.getMessage());
+ }
+ } finally {
+ System.setSecurityManager(originalSm);
+ }
+ }
+
+ @Test
+ public void
testAddNotificationTopicPermissionInServiceDef_ServiceDefNotFound_ReturnsEarly()
throws Exception {
+ try (MockedStatic<EmbeddedServiceDefsUtil> utilMock =
Mockito.mockStatic(EmbeddedServiceDefsUtil.class)) {
+ EmbeddedServiceDefsUtil util =
Mockito.mock(EmbeddedServiceDefsUtil.class);
+ utilMock.when(EmbeddedServiceDefsUtil::instance).thenReturn(util);
+
+ RangerServiceDef embeddedAtlas = new RangerServiceDef();
+ embeddedAtlas.setResources(new ArrayList<>());
+ embeddedAtlas.setAccessTypes(new ArrayList<>());
+
Mockito.when(util.getEmbeddedServiceDef(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME)).thenReturn(embeddedAtlas);
+
+ RangerDaoManager daoMgr = Mockito.mock(RangerDaoManager.class);
+ XXServiceDefDao xxServiceDefDao =
Mockito.mock(XXServiceDefDao.class);
+ Mockito.when(daoMgr.getXXServiceDef()).thenReturn(xxServiceDefDao);
+
Mockito.when(xxServiceDefDao.findByName(Mockito.anyString())).thenReturn(null);
+
+ PatchForAtlasNotificationTopic_J10067 patch = new
PatchForAtlasNotificationTopic_J10067();
+ setIfPresent(patch, "daoMgr", daoMgr);
+ setIfPresent(patch, "svcDBStore",
Mockito.mock(ServiceDBStore.class));
+ setIfPresent(patch, "validatorFactory",
Mockito.mock(RangerValidatorFactory.class));
+ setIfPresent(patch, "svcStore",
Mockito.mock(ServiceDBStore.class));
+
+ Assertions.assertDoesNotThrow(() -> patch.execLoad());
+ }
+ }
+
+ @Test
+ public void testExecLoad_UpdateReturnsNull_ThrowsRuntime() throws
Exception {
+ try (MockedStatic<EmbeddedServiceDefsUtil> utilMock =
Mockito.mockStatic(EmbeddedServiceDefsUtil.class)) {
+ EmbeddedServiceDefsUtil util =
Mockito.mock(EmbeddedServiceDefsUtil.class);
+ utilMock.when(EmbeddedServiceDefsUtil::instance).thenReturn(util);
+
+ RangerServiceDef embeddedAtlas = new RangerServiceDef();
+ RangerServiceDef.RangerResourceDef res = new
RangerServiceDef.RangerResourceDef();
+ res.setName("notification-topic");
+ embeddedAtlas.setResources(new
ArrayList<>(Collections.singletonList(res)));
+ embeddedAtlas.setAccessTypes(new
ArrayList<>(Collections.singletonList(new
RangerServiceDef.RangerAccessTypeDef("post-notification"))));
+ utilMock.when(() ->
EmbeddedServiceDefsUtil.instance().getEmbeddedServiceDef(EmbeddedServiceDefsUtil.EMBEDDED_SERVICEDEF_ATLAS_NAME)).thenReturn(embeddedAtlas);
+
+ PatchForAtlasNotificationTopic_J10067 patch = new
PatchForAtlasNotificationTopic_J10067();
+ RangerDaoManager daoMgr = Mockito.mock(RangerDaoManager.class);
+ XXServiceDefDao xxServiceDefDao =
Mockito.mock(XXServiceDefDao.class);
+ Mockito.when(daoMgr.getXXServiceDef()).thenReturn(xxServiceDefDao);
+
Mockito.when(xxServiceDefDao.findByName(Mockito.anyString())).thenReturn(new
XXServiceDef());
+ setIfPresent(patch, "daoMgr", daoMgr);
+
+ ServiceDBStore svcDBStore = Mockito.mock(ServiceDBStore.class);
+ RangerServiceDef dbAtlas = new RangerServiceDef();
+
Mockito.when(svcDBStore.getServiceDefByName(Mockito.anyString())).thenReturn(dbAtlas);
+
Mockito.when(svcDBStore.updateServiceDef(Mockito.any())).thenReturn(null);
+ setIfPresent(patch, "svcDBStore", svcDBStore);
+ setIfPresent(patch, "svcStore", svcDBStore);
+
+ RangerValidatorFactory validatorFactory =
Mockito.mock(RangerValidatorFactory.class);
+ RangerServiceDefValidator validator =
Mockito.mock(RangerServiceDefValidator.class);
+
Mockito.when(validatorFactory.getServiceDefValidator(Mockito.any(ServiceDBStore.class))).thenReturn(validator);
+ setIfPresent(patch, "validatorFactory", validatorFactory);
+
+ Assertions.assertThrows(RuntimeException.class, patch::execLoad);
+ }
+ }
+
+ @Test
+ public void testPrivate_Checkers() throws Exception {
+ PatchForAtlasNotificationTopic_J10067 patch = new
PatchForAtlasNotificationTopic_J10067();
+ Method cr =
PatchForAtlasNotificationTopic_J10067.class.getDeclaredMethod("checkResourcePresent",
List.class);
+ Method ca =
PatchForAtlasNotificationTopic_J10067.class.getDeclaredMethod("checkAccessPresent",
List.class);
+ cr.setAccessible(true);
+ ca.setAccessible(true);
+
+ RangerServiceDef.RangerResourceDef r = new
RangerServiceDef.RangerResourceDef();
+ r.setName("notification-topic");
+ List<RangerServiceDef.RangerResourceDef> rList = new ArrayList<>();
+ rList.add(r);
+ Assertions.assertTrue((Boolean) cr.invoke(patch, rList));
+
+ RangerServiceDef.RangerAccessTypeDef a = new
RangerServiceDef.RangerAccessTypeDef("post-notification");
+ List<RangerServiceDef.RangerAccessTypeDef> aList = new ArrayList<>();
+ aList.add(a);
+ Assertions.assertTrue((Boolean) ca.invoke(patch, aList));
+ }
+
+ @Test
+ public void testPrivate_Checkers_FalseBranches() throws Exception {
+ PatchForAtlasNotificationTopic_J10067 patch = new
PatchForAtlasNotificationTopic_J10067();
+ Method cr =
PatchForAtlasNotificationTopic_J10067.class.getDeclaredMethod("checkResourcePresent",
List.class);
+ Method ca =
PatchForAtlasNotificationTopic_J10067.class.getDeclaredMethod("checkAccessPresent",
List.class);
+ cr.setAccessible(true);
+ ca.setAccessible(true);
+
+ RangerServiceDef.RangerResourceDef r = new
RangerServiceDef.RangerResourceDef();
+ r.setName("not-notification-topic");
+ List<RangerServiceDef.RangerResourceDef> rList = new ArrayList<>();
+ rList.add(r);
+ Assertions.assertFalse((Boolean) cr.invoke(patch, rList));
+
+ RangerServiceDef.RangerAccessTypeDef a = new
RangerServiceDef.RangerAccessTypeDef("not-post-notification");
+ List<RangerServiceDef.RangerAccessTypeDef> aList = new ArrayList<>();
+ aList.add(a);
+ Assertions.assertFalse((Boolean) ca.invoke(patch, aList));
+ }
+}