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

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


The following commit(s) were added to refs/heads/master by this push:
     new 06944809ce HDDS-13354. Run multitenancy acceptance test with Ranger 
(#8722)
06944809ce is described below

commit 06944809cee1b9b74d013f637f6fc59210a00e2e
Author: Doroszlai, Attila <[email protected]>
AuthorDate: Thu Jul 10 03:09:52 2025 +0200

    HDDS-13354. Run multitenancy acceptance test with Ranger (#8722)
---
 .../ozone/admin/om/UpdateRangerSubcommand.java     |  2 +-
 .../src/main/compose/ozonesecure-ha/docker-config  |  2 +-
 .../src/main/compose/ozonesecure-ha/test-ranger.sh |  6 +-
 hadoop-ozone/dist/src/main/smoketest/kinit.robot   |  4 +-
 .../smoketest/security/ozone-secure-tenant.robot   | 79 ++++++++++++----------
 .../multitenant/MultiTenantAccessController.java   | 36 ++++++++++
 6 files changed, 87 insertions(+), 42 deletions(-)

diff --git 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
index 6e2ec14af8..22f59e64a6 100644
--- 
a/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
+++ 
b/hadoop-ozone/cli-admin/src/main/java/org/apache/hadoop/ozone/admin/om/UpdateRangerSubcommand.java
@@ -43,7 +43,7 @@ public class UpdateRangerSubcommand implements Callable<Void> 
{
   private OMAdmin parent;
 
   @CommandLine.Option(
-      names = {"-id", "--service-id"},
+      names = {"-id", "--service-id", "--om-service-id"},
       description = "Ozone Manager Service ID"
   )
   private String omServiceId;
diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config 
b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config
index e38952dc70..38db5ac1fa 100644
--- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config
+++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/docker-config
@@ -68,7 +68,7 @@ OZONE-SITE.XML_ozone.recon.address=recon:9891
 OZONE-SITE.XML_ozone.security.enabled=true
 OZONE-SITE.XML_ozone.acl.enabled=true
 
OZONE-SITE.XML_ozone.acl.authorizer.class=org.apache.hadoop.ozone.security.acl.OzoneNativeAuthorizer
-OZONE-SITE.XML_ozone.administrators="testuser,recon,om"
+OZONE-SITE.XML_ozone.administrators="testuser,recon,om,hdfs"
 OZONE-SITE.XML_ozone.s3.administrators="testuser,s3g"
 
 OZONE-SITE.XML_hdds.datanode.dir=/data/hdds
diff --git a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh 
b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh
index 8246f34a22..0b5ca66b77 100755
--- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh
+++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-ranger.sh
@@ -55,11 +55,13 @@ perl -wpl -i \
   -e 's@^CUSTOM_USER=ozone@CUSTOM_USER=hadoop@;' \
   "${RANGER_OZONE_PLUGIN_DIR}/install.properties"
 
+echo 'machine ranger login admin password rangerR0cks!' > ../../.netrc
+
 start_docker_env
 wait_for_port ranger 6080 120
 
-execute_robot_test s3g -v testuser:hdfs kinit.robot
+execute_robot_test s3g -v USER:hdfs kinit.robot
 execute_robot_test s3g freon/generate.robot
 execute_robot_test s3g freon/validate.robot
 
-# execute_robot_test scm security/ozone-secure-tenant.robot
+execute_robot_test s3g -v RANGER_ENDPOINT_URL:"http://ranger:6080"; -v 
USER:hdfs security/ozone-secure-tenant.robot
diff --git a/hadoop-ozone/dist/src/main/smoketest/kinit.robot 
b/hadoop-ozone/dist/src/main/smoketest/kinit.robot
index c9c1b75417..30e11c6ca8 100644
--- a/hadoop-ozone/dist/src/main/smoketest/kinit.robot
+++ b/hadoop-ozone/dist/src/main/smoketest/kinit.robot
@@ -21,8 +21,8 @@ Test Timeout        2 minute
 
 
 *** Variables ***
-${testuser}          testuser
+${USER}          testuser
 
 *** Test Cases ***
 Kinit
-   Kinit test user     ${testuser}     ${testuser}.keytab
+   Kinit test user     ${USER}     ${USER}.keytab
diff --git 
a/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-tenant.robot 
b/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-tenant.robot
index 47a1023895..e3a74bd3e3 100644
--- a/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-tenant.robot
+++ b/hadoop-ozone/dist/src/main/smoketest/security/ozone-secure-tenant.robot
@@ -23,18 +23,24 @@ Resource            ../s3/commonawslib.robot
 Test Timeout        5 minutes
 
 *** Variables ***
-${RANGER_ENDPOINT_URL}  http://ranger:6080
+${RANGER_ENDPOINT_URL}  ${EMPTY}
 ${S3G_ENDPOINT_URL}     http://s3g:9878
+${TENANT}               tenantone
+${USER}                 testuser
 
 *** Test Cases ***
+Create User in Ranger
+    Pass Execution If    '${RANGER_ENDPOINT_URL}' == ''    No Ranger
+    Execute    curl --fail --include --location --netrc --request POST 
--header "Content-Type: application/json" --header "accept: application/json" 
--data '{"loginId": "${TENANT}", "password": "testpassword", "firstName": 
"Test", "lastName": "User", "emailAddress": "[email protected]"}' 
'${RANGER_ENDPOINT_URL}/service/users'
+
 Create Tenant Success with Cluster Admin
-    Run Keyword         Kinit test user     testuser     testuser.keytab
-    ${output} =         Execute          ozone tenant --verbose create 
tenantone
-                        Should contain   ${output}         "tenantId" : 
"tenantone"
+    Kinit test user     ${USER}     ${USER}.keytab
+    ${output} =         Execute          ozone tenant --verbose create 
${TENANT}
+                        Should contain   ${output}         "tenantId" : 
"${TENANT}"
 
 Assign User Success with Cluster Admin
-    ${output} =         Execute          ozone tenant --verbose user assign 
testuser --tenant=tenantone
-                        Should contain   ${output}         Assigned 'testuser' 
to 'tenantone'
+    ${output} =         Execute          ozone tenant --verbose user assign 
${USER} --tenant=${TENANT}
+                        Should contain   ${output}         Assigned '${USER}' 
to '${TENANT}'
     ${accessId} =       Get Regexp Matches   ${output}     (?<=export 
AWS_ACCESS_KEY_ID=).*
     ${secretKey} =      Get Regexp Matches   ${output}     (?<=export 
AWS_SECRET_ACCESS_KEY=).*
     ${accessId} =       Set Variable         ${accessId[0]}
@@ -43,16 +49,16 @@ Assign User Success with Cluster Admin
                         Set Global Variable  ${SECRET_KEY}  ${secretKey}
 
 Assign User Failure to Non-existent Tenant
-    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user assign 
testuser --tenant=thistenantdoesnotexist
+    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user assign 
${USER} --tenant=thistenantdoesnotexist
                         Should contain   ${output}         Tenant 
'thistenantdoesnotexist' doesn't exist
 
 GetUserInfo Success
-    ${output} =         Execute          ozone tenant user info testuser
-                        Should contain   ${output}         Tenant 'tenantone' 
with accessId 'tenantone$testuser'
+    ${output} =         Execute          ozone tenant user info ${USER}
+                        Should contain   ${output}         Tenant '${TENANT}' 
with accessId '${TENANT}$${USER}'
 
 GetUserInfo as JSON Success
-    ${output} =         Execute          ozone tenant user info --json 
testuser | jq '.tenants | .[].accessId'
-                        Should contain   ${output}         "tenantone$testuser"
+    ${output} =         Execute          ozone tenant user info --json ${USER} 
| jq '.tenants | .[].accessId'
+                        Should contain   ${output}         "${TENANT}$${USER}"
 
 Create Bucket 1 Success via S3 API
                         Execute          aws configure set aws_access_key_id 
${ACCESS_ID}
@@ -63,35 +69,35 @@ Create Bucket 1 Success via S3 API
                         Should contain   ${output}         bucket-test1
 
 Verify Bucket 1 Owner
-    ${result} =         Execute          ozone sh bucket info 
/tenantone/bucket-test1 | jq -r '.owner'
-                        Should Be Equal  ${result}       testuser
+    ${result} =         Execute          ozone sh bucket info 
/${TENANT}/bucket-test1 | jq -r '.owner'
+                        Should Be Equal  ${result}       ${USER}
 
 Put a key in the tenant bucket
                         Execute                 echo "Randomtext" > 
/tmp/testfile
                         Execute and checkrc     aws s3api --endpoint-url 
${S3G_ENDPOINT_URL} put-object --bucket bucket-test1 --key mykey --body 
/tmp/testfile  0
 
 Verify Object Owner
-    ${result} =         Execute          ozone sh key info 
/tenantone/bucket-test1/mykey | jq -r '.owner'
-                        Should Be Equal  ${result}       testuser
+    ${result} =         Execute          ozone sh key info 
/${TENANT}/bucket-test1/mykey | jq -r '.owner'
+                        Should Be Equal  ${result}       ${USER}
 
 Get and delete a key in the tenant bucket
                         Execute and checkrc     aws s3api --endpoint-url 
${S3G_ENDPOINT_URL} head-object --bucket bucket-test1 --key mykey  0
                         Execute and checkrc     aws s3api --endpoint-url 
${S3G_ENDPOINT_URL} delete-object --bucket bucket-test1 --key mykey  0
 
 SetSecret Success with Cluster Admin
-    ${output} =         Execute          ozone tenant user setsecret 
'tenantone$testuser' --secret=somesecret1
+    ${output} =         Execute          ozone tenant user setsecret 
'${TENANT}$${USER}' --secret=somesecret1
                         Should contain   ${output}         export 
AWS_SECRET_ACCESS_KEY='somesecret1'
 
 SetSecret Failure For Invalid Secret 1
-    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user 
setsecret 'tenantone$testuser' --secret=''
+    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user 
setsecret '${TENANT}$${USER}' --secret=''
                         Should contain   ${output}         secretKey cannot be 
null or empty.
 
 SetSecret Failure For Invalid Secret 2
-    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user 
setsecret 'tenantone$testuser' --secret=short
+    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user 
setsecret '${TENANT}$${USER}' --secret=short
                         Should contain   ${output}         Secret key length 
should be at least 8 characters
 
 GetSecret Success
-    ${output} =         Execute          ozone tenant user getsecret 
'tenantone$testuser'
+    ${output} =         Execute          ozone tenant user getsecret 
'${TENANT}$${USER}'
                         Should contain   ${output}         export 
AWS_SECRET_ACCESS_KEY='somesecret1'
 
 Delete Bucket 1 Failure With Old SecretKey via S3 API
@@ -102,13 +108,14 @@ Delete Bucket 1 Success With Newly Set SecretKey via S3 
API
                         Execute          aws configure set 
aws_secret_access_key 'somesecret1'
     ${output} =         Execute          aws s3api --endpoint-url 
${S3G_ENDPOINT_URL} delete-bucket --bucket bucket-test1
 
-Delete Tenant Failure Tenant Not Empty
-    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant delete 
tenantone
-                        Should contain   ${output}         TENANT_NOT_EMPTY 
Tenant 'tenantone' is not empty. All accessIds associated to this tenant must 
be revoked before the tenant can be deleted. See `ozone tenant user revoke`
-
-Trigger and wait for background Sync to recover Policies and Roles in 
Authorizer
-    ${rc}  ${output} =  Run And Return Rc And Output  ozone admin om 
updateranger -host=om
-                        Should contain   ${output}         Operation completed 
successfully
+# see HDDS-13361
+#Delete Tenant Failure Tenant Not Empty
+#    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant delete 
${TENANT}
+#                        Should contain   ${output}         TENANT_NOT_EMPTY 
Tenant '${TENANT}' is not empty. All accessIds associated to this tenant must 
be revoked before the tenant can be deleted. See `ozone tenant user revoke`
+#
+#Trigger and wait for background Sync to recover Policies and Roles in 
Authorizer
+#    ${rc}  ${output} =  Run And Return Rc And Output  ozone admin om 
updateranger ${OM_HA_PARAM}
+#                        Should contain   ${output}         Operation 
completed successfully
 
 Create Tenant Failure with Regular User
     Run Keyword         Kinit test user     testuser2    testuser2.keytab
@@ -116,8 +123,8 @@ Create Tenant Failure with Regular User
                         Should contain   ${output}         PERMISSION_DENIED 
User 'testuser2' is not an Ozone admin
 
 SetSecret Failure with Regular User
-    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user 
set-secret 'tenantone$testuser' --secret=somesecret2
-                        Should contain   ${output}         USER_MISMATCH 
Requested accessId 'tenantone$testuser' doesn't belong to current user 
'testuser2', nor does current user have Ozone or tenant administrator privilege
+    ${rc}  ${output} =  Run And Return Rc And Output  ozone tenant user 
set-secret '${TENANT}$${USER}' --secret=somesecret2
+                        Should contain   ${output}         USER_MISMATCH 
Requested accessId '${TENANT}$${USER}' doesn't belong to current user 
'testuser2', nor does current user have Ozone or tenant administrator privilege
 
 Create Bucket 2 Success with somesecret1 via S3 API
     ${output} =         Execute          aws s3api --endpoint-url 
${S3G_ENDPOINT_URL} create-bucket --bucket bucket-test2
@@ -133,22 +140,22 @@ Delete Bucket 2 Success with somesecret1 via S3 API
     ${output} =         Execute          aws s3api --endpoint-url 
${S3G_ENDPOINT_URL} delete-bucket --bucket bucket-test2
 
 Revoke User AccessId Success with Cluster Admin
-    Run Keyword         Kinit test user     testuser     testuser.keytab
-    ${output} =         Execute          ozone tenant --verbose user revoke 
'tenantone$testuser'
-                        Should contain   ${output}         Revoked accessId 
'tenantone$testuser'.
+    Run Keyword         Kinit test user     ${USER}     ${USER}.keytab
+    ${output} =         Execute          ozone tenant --verbose user revoke 
'${TENANT}$${USER}'
+                        Should contain   ${output}         Revoked accessId 
'${TENANT}$${USER}'.
 
 Create Bucket 3 Failure with Revoked AccessId via S3 API
     ${rc}  ${output} =  Run And Return Rc And Output  aws s3api --endpoint-url 
${S3G_ENDPOINT_URL} create-bucket --bucket bucket-test3
                         Should Be True ${rc} > 0
 
 Delete Tenant Success with Cluster Admin
-    ${output} =         Execute          ozone tenant delete tenantone
-                        Should contain   ${output}         Deleted tenant 
'tenantone'.
+    ${output} =         Execute          ozone tenant delete ${TENANT}
+                        Should contain   ${output}         Deleted tenant 
'${TENANT}'.
 
 Delete Volume Success with Cluster Admin
-    ${output} =         Execute          ozone sh volume delete tenantone
-                        Should contain   ${output}         Volume tenantone is 
deleted
+    ${output} =         Execute          ozone sh volume delete ${TENANT}
+                        Should contain   ${output}         Volume ${TENANT} is 
deleted
 
 List Tenant Expect Empty Result
     ${output} =         Execute          ozone tenant list
-                        Should not contain   ${output}     tenantone
+                        Should not contain   ${output}     ${TENANT}
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/multitenant/MultiTenantAccessController.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/multitenant/MultiTenantAccessController.java
index a97f750081..2b53ea58d8 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/multitenant/MultiTenantAccessController.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/multitenant/MultiTenantAccessController.java
@@ -136,6 +136,14 @@ public boolean equals(Object other) {
       Acl otherAcl = (Acl) other;
       return isAllowed() == otherAcl.isAllowed() && acl == otherAcl.acl;
     }
+
+    @Override
+    public String toString() {
+      return "Acl{" +
+          "isAllowed=" + isAllowed +
+          ", acl=" + acl +
+          '}';
+    }
   }
 
   /**
@@ -205,6 +213,18 @@ public boolean equals(Object other) {
           roleIdsMatch;
     }
 
+    @Override
+    public String toString() {
+      return "Role{" +
+          "id=" + id +
+          ", name='" + name + '\'' +
+          ", usersMap=" + usersMap +
+          ", rolesMap=" + rolesMap +
+          ", description='" + description + '\'' +
+          ", createdByUser='" + createdByUser + '\'' +
+          '}';
+    }
+
     public String getCreatedByUser() {
       return createdByUser;
     }
@@ -402,6 +422,22 @@ public boolean equals(Object other) {
           Objects.equals(getLabels(), policy.getLabels());
     }
 
+    @Override
+    public String toString() {
+      return "Policy{" +
+          "id=" + id +
+          ", name='" + name + '\'' +
+          ", volumes=" + volumes +
+          ", buckets=" + buckets +
+          ", keys=" + keys +
+          ", description='" + description + '\'' +
+          ", userAcls=" + userAcls +
+          ", roleAcls=" + roleAcls +
+          ", labels=" + labels +
+          ", isEnabled=" + isEnabled +
+          '}';
+    }
+
     public boolean isEnabled() {
       return isEnabled;
     }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to