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

ramackri pushed a commit to branch RANGER-5712
in repository https://gitbox.apache.org/repos/asf/ranger.git

commit e27068de3a6446dd8d5db5872a20a0e12b4d1243
Author: ramk <[email protected]>
AuthorDate: Thu Jul 30 15:19:45 2026 +0530

    RANGER-5712: Ozone 2.1.1 docker pin and plugin Jersey classpath fix
    
    Pin OZONE_VERSION=2.1.1 in docker .env to match pom.xml. Exclude bundled
    Jersey/HK2 from the ozone plugin tarball to avoid PolicyRefresher
    ClassCastException on Ozone 2.1.x. Extend verify-ozone-pr1116-e2e.sh to
    recreate Solr and Solr dispatcher in Kerberos mode for audit pipeline tests.
---
 dev-support/ranger-docker/.env                     |  4 +-
 .../scripts/ozone/verify-ozone-pr1116-e2e.sh       | 56 +++++++++++++++++-----
 distro/src/main/assembly/plugin-ozone.xml          | 25 +++++-----
 3 files changed, 59 insertions(+), 26 deletions(-)

diff --git a/dev-support/ranger-docker/.env b/dev-support/ranger-docker/.env
index c6439db0e..9ec9bdf7c 100644
--- a/dev-support/ranger-docker/.env
+++ b/dev-support/ranger-docker/.env
@@ -75,8 +75,8 @@ ORACLE_VERSION=23.6
 SQLSERVER_VERSION=2022-latest
 
 # Ozone Configuration
-# Align runtime with Ranger plugin compile target (pom.xml ozone.version=2.1.0)
-OZONE_VERSION=2.1.0
+# Align runtime with Ranger plugin compile target (pom.xml ozone.version=2.1.1)
+OZONE_VERSION=2.1.1
 OZONE_PLUGIN_VERSION=3.0.0-SNAPSHOT
 OZONE_RUNNER_IMAGE=apache/ozone-runner
 # Ozone 2.0+ requires jdk21 runner (jdk11/jdk17 tags are for Ozone 1.x). 
Multi-arch arm64+amd64.
diff --git a/dev-support/ranger-docker/scripts/ozone/verify-ozone-pr1116-e2e.sh 
b/dev-support/ranger-docker/scripts/ozone/verify-ozone-pr1116-e2e.sh
index 177387313..fab827283 100755
--- a/dev-support/ranger-docker/scripts/ozone/verify-ozone-pr1116-e2e.sh
+++ b/dev-support/ranger-docker/scripts/ozone/verify-ozone-pr1116-e2e.sh
@@ -57,8 +57,9 @@ AUDIT_COMPOSE=(
 
 TEST_POLICY_NAME="${TEST_POLICY_NAME:-pr1116-test-policy}"
 TEST_ROLE_NAME="${TEST_ROLE_NAME:-pr1116_test_role}"
-TEST_VOLUME="${TEST_VOLUME:-testvol-pr1116}"
-AUDIT_BUCKET="${AUDIT_BUCKET:-audit-bucket}"
+TEST_VOLUME="${TEST_VOLUME:-s3Vol}"
+OZONE_CLI_VOLUME="${OZONE_CLI_VOLUME:-s3v}"
+AUDIT_BUCKET="${AUDIT_BUCKET:-audit-bucket-pr1116}"
 AUDIT_MARKER="${AUDIT_MARKER:-pr1116-audit-marker}"
 
 PR_GIT_REF="${PR_GIT_REF:-RANGER-5712}"
@@ -93,7 +94,7 @@ Usage: $(basename "$0") 
<apply|verify|audit-e2e|revert-ingestor|revert|run>
 
   apply           Apply PR #1116 ozone docker files, recreate om/scm/datanode
   verify          Kerberos + PolicyRefresher policy/role download
-  audit-e2e       Ingestor static+Kerberos, ozone audit -> kafka -> solr
+  audit-e2e       Static ingestor + Kerberos Solr/dispatcher, ozone audit 
pipeline
   revert-ingestor Restore ingestor dynamic+SPIFFE (if audit phase interrupted)
   revert          Restore backed-up ozone docker files
   run             apply + verify + audit-e2e
@@ -232,18 +233,26 @@ ingestor_env_snapshot() {
     > "${INGESTOR_ENV_BACKUP}" 2>/dev/null || true
 }
 
-restart_ingestor_static_kerberos() {
+restart_audit_pipeline_kerberos_mode() {
   local stack="${RANGER_DOCKER_STACK}"
   cd "${stack}"
   # shellcheck source=/dev/null
   source .env
   ingestor_env_snapshot
-  echo "== Switching audit-ingestor to static partition + Kerberos inbound =="
+  echo "== Audit pipeline Kerberos mode (static ingestor + Kerberos 
Solr/dispatcher) =="
+  echo "   ingestor: partition.plan.admin.enabled=false, inbound Kerberos (not 
SPIFFE)"
+  echo "   solr + solr-dispatcher: KERBEROS_ENABLED=true"
   RANGER_AUDIT_PARTITION_PLAN_ADMIN_ENABLED=false \
   RANGER_AUDIT_INGESTOR_SPIFFE_ENABLED=false \
   KERBEROS_ENABLED=true \
-    docker compose "${AUDIT_COMPOSE[@]}" up -d --no-deps --force-recreate 
ranger-audit-ingestor
-  sleep 25
+    docker compose "${AUDIT_COMPOSE[@]}" up -d --no-deps --force-recreate \
+      ranger-solr ranger-audit-ingestor ranger-audit-dispatcher-solr
+  sleep 45
+  verify_audit_kerberos_stack
+}
+
+verify_audit_kerberos_stack() {
+  echo "== Verify audit pipeline Kerberos/static config =="
   docker exec ranger-audit-ingestor python3 -c "
 import xml.etree.ElementTree as ET
 
r=ET.parse('/opt/ranger/audit-ingestor/conf/ranger-audit-ingestor-site.xml').getroot()
@@ -252,6 +261,27 @@ for n in 
['ranger.audit.ingestor.partition.plan.admin.enabled','ranger.audit.ing
     if p.find('name') is not None and p.find('name').text==n:
       print(n,'=',p.find('value').text)
 "
+  local solr_auth
+  if docker exec ranger-solr ps aux 2>/dev/null | grep -q 
'solr.kerberos.principal'; then
+    echo "PASS: ranger-solr running with Kerberos (solr.kerberos.* JVM opts)"
+  elif docker exec ranger-solr grep -q KerberosPlugin 
/var/solr/data/security.json 2>/dev/null; then
+    echo "PASS: ranger-solr security.json uses KerberosPlugin"
+  else
+    echo "FAIL: ranger-solr Kerberos not detected (check 
KERBEROS_ENABLED=true)"
+    return 1
+  fi
+  docker exec ranger-audit-dispatcher-solr python3 -c "
+import xml.etree.ElementTree as ET
+r=ET.parse('/opt/ranger/audit-dispatcher/conf/ranger-audit-dispatcher-solr-site.xml').getroot()
+for n in 
['ranger.audit.dispatcher.hadoop.security.authentication','xasecure.audit.jaas.Client.option.keyTab','xasecure.audit.jaas.Client.option.principal']:
+  for p in r.findall('property'):
+    if p.find('name') is not None and p.find('name').text==n:
+      print(n,'=',p.find('value').text)
+" || echo "WARN: could not read solr dispatcher site XML"
+}
+
+restart_ingestor_static_kerberos() {
+  restart_audit_pipeline_kerberos_mode
 }
 
 restart_ingestor_dynamic_spiffe() {
@@ -306,7 +336,12 @@ EOF
   policy_id=$(docker exec ranger curl -s -u admin:rangerR0cks! \
     -H 'Content-Type: application/json' -X POST \
     'http://localhost:6080/service/public/v2/api/policy' \
-    -d "${policy_json}" | python3 -c "import sys,json; 
print(json.load(sys.stdin).get('id',''))")
+    -d "${policy_json}" | python3 -c "import sys,json; r=json.load(sys.stdin); 
print(r.get('id') or r.get('msg',''))")
+  if [ -z "${policy_id}" ] || ! [[ "${policy_id}" =~ ^[0-9]+$ ]]; then
+    policy_id=$(docker exec ranger curl -s -u admin:rangerR0cks! \
+      
"http://localhost:6080/service/public/v2/api/policy?serviceName=dev_ozone&policyName=${TEST_POLICY_NAME}";
 \
+      | python3 -c "import sys,json; ps=json.load(sys.stdin); 
print(ps[0]['id'] if ps else '')")
+  fi
   
role_json="{\"name\":\"${TEST_ROLE_NAME}\",\"isEnabled\":true,\"users\":[],\"groups\":[],\"roles\":[]}"
   role_id=$(docker exec ranger curl -s -u admin:rangerR0cks! \
     -H 'Content-Type: application/json' -X POST \
@@ -381,14 +416,13 @@ wait_for_om_kerberos() {
 
 trigger_ozone_audit() {
   echo "== Trigger policy-enforced Ozone audit (hdfs -> OM -> ingestor) =="
-  local audit_vol="${TEST_VOLUME}" audit_bucket="${AUDIT_BUCKET:-audit-bucket}"
+  local audit_vol="${OZONE_CLI_VOLUME}" audit_bucket="${AUDIT_BUCKET}"
   docker exec ozone-om bash -c "
     set -e
     export KRB5_CONFIG=/etc/krb5.conf
     kinit -kt /etc/keytabs/om.keytab om/[email protected]
-    /opt/hadoop/bin/ozone sh volume create ${audit_vol} 2>/dev/null || true
     /opt/hadoop/bin/ozone sh bucket create ${audit_vol}/${audit_bucket} 
2>/dev/null || true
-  " || echo "WARN: om setup for audit volume failed"
+  " || echo "WARN: om setup for audit bucket failed"
 
   docker cp ranger-hadoop:/etc/keytabs/hdfs.keytab /tmp/ozone-audit-hdfs.keytab
   docker cp /tmp/ozone-audit-hdfs.keytab ozone-om:/tmp/hdfs.keytab
diff --git a/distro/src/main/assembly/plugin-ozone.xml 
b/distro/src/main/assembly/plugin-ozone.xml
index 7d14d2ab5..c8fb54a84 100644
--- a/distro/src/main/assembly/plugin-ozone.xml
+++ b/distro/src/main/assembly/plugin-ozone.xml
@@ -110,20 +110,7 @@
                     
<include>io.airlift:aircompressor:jar:${aircompressor.version}</include>
                     
<include>javax.annotation:javax.annotation-api:jar:${javax.annotation-api.version}</include>
                     <include>javax.inject:javax.inject</include>
-                    <include>javax.ws.rs:javax.ws.rs-api</include>
                     
<include>org.apache.hadoop.thirdparty:hadoop-shaded-guava:jar:${hadoop-shaded-guava.version}</include>
-                    <include>org.glassfish.hk2:hk2-api</include>
-                    <include>org.glassfish.hk2:hk2-locator</include>
-                    <include>org.glassfish.hk2:hk2-utils</include>
-                    
<include>org.glassfish.hk2.external:aopalliance-repackaged</include>
-                    
<include>org.glassfish.hk2.external:jakarta.inject</include>
-                    <include>org.glassfish.hk2.external:javax.inject</include>
-                    <include>org.glassfish:osgi-resource-locator</include>
-                    <include>org.glassfish.jersey.core:jersey-client</include>
-                    <include>org.glassfish.jersey.core:jersey-common</include>
-                    
<include>org.glassfish.jersey.ext:jersey-entity-filtering:jar:${jersey-client.version}</include>
-                    <include>org.glassfish.jersey.inject:jersey-hk2</include>
-                    
<include>org.glassfish.jersey.media:jersey-media-json-jackson:jar:${jersey-client.version}</include>
                     
<include>com.fasterxml.jackson.module:jackson-module-jaxb-annotations:jar:${fasterxml.jackson.version}</include>
                     <!-- GraalJS 25.x runtime (js is now a POM, not a JAR) -->
                     
<include>org.graalvm.js:js-language:jar:${graalvm.version}</include>
@@ -141,6 +128,18 @@
                     
<include>org.graalvm.shadowed:xz:jar:${graalvm.version}</include>
 
                 </includes>
+                <!-- Use Ozone 2.1.x host Jersey/HK2 (share/ozone/lib) via 
RangerPluginClassLoader fallback;
+                     bundling our own copies causes WadlAutoDiscoverable 
ClassCastException on OM. -->
+                <excludes>
+                    <exclude>org.glassfish.jersey.core:*</exclude>
+                    <exclude>org.glassfish.jersey.ext:*</exclude>
+                    <exclude>org.glassfish.jersey.inject:*</exclude>
+                    <exclude>org.glassfish.jersey.media:*</exclude>
+                    <exclude>org.glassfish.hk2:*</exclude>
+                    <exclude>org.glassfish:osgi-resource-locator</exclude>
+                    <exclude>javax.ws.rs:javax.ws.rs-api</exclude>
+                    <exclude>jakarta.ws.rs:jakarta.ws.rs-api</exclude>
+                </excludes>
             </binaries>
         </moduleSet>
     </moduleSets>

Reply via email to