You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ranger.apache.org by ra...@apache.org on 2026/08/27 13:36:38 UTC

(ranger) 01/01: RANGER-5720: Finalize patch 078 x_audit_config and add docker DB E2E tests.

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

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

commit 50e3b11b7251dbba2020f38bffcd637d34374d0c
Author: ramk <ra...@cloudera.com>
AuthorDate: Thu Aug 27 19:06:21 2026 +0530

    RANGER-5720: Finalize patch 078 x_audit_config and add docker DB E2E tests.
    
    Rename patch 078 to add-x_audit_config, store all audit runtime settings in
    x_audit_config (not x_ranger_global_state), fix Oracle upgrade SQL, drop a
    stale SQL Server FK CHECK from optimized schema, and add ranger-docker scripts
    to verify fresh install and 077→078 upgrade on all four docker DB backends.
    
    Co-authored-by: Cursor <cu...@cursor.com>
---
 .../scripts/db-test/test-patch-078-docker.sh       | 154 ++++++++++
 .../scripts/db-test/test-patch-078-e2e-docker.sh   | 334 +++++++++++++++++++++
 .../scripts/db-test/verify-patch-078.sh            | 204 +++++++++++++
 .../optimized/current/ranger_core_db_mysql.sql     |   3 +-
 ...global-state.sql => 078-add-x_audit_config.sql} |   8 +-
 .../optimized/current/ranger_core_db_oracle.sql    |   3 +-
 .../db/oracle/patches/078-add-x_audit_config.sql   |  92 ++++++
 .../078-audit-partition-plan-global-state.sql      | 109 -------
 .../optimized/current/ranger_core_db_postgres.sql  |   3 +-
 ...global-state.sql => 078-add-x_audit_config.sql} |   8 +-
 .../current/ranger_core_db_sqlanywhere.sql         |   4 +-
 ...global-state.sql => 078-add-x_audit_config.sql} |   8 +-
 .../optimized/current/ranger_core_db_sqlserver.sql |   3 +-
 ...global-state.sql => 078-add-x_audit_config.sql} |  10 +-
 14 files changed, 797 insertions(+), 146 deletions(-)

diff --git a/dev-support/ranger-docker/scripts/db-test/test-patch-078-docker.sh b/dev-support/ranger-docker/scripts/db-test/test-patch-078-docker.sh
new file mode 100755
index 000000000..31ccb989e
--- /dev/null
+++ b/dev-support/ranger-docker/scripts/db-test/test-patch-078-docker.sh
@@ -0,0 +1,154 @@
+#!/bin/bash
+# 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.
+
+# End-to-end patch 078 test: build admin (if needed), start Ranger Admin per DB, verify.
+#
+# Usage (from dev-support/ranger-docker):
+#   ./scripts/db-test/test-patch-078-docker.sh              # all docker DBs
+#   ./scripts/db-test/test-patch-078-docker.sh postgres     # one DB
+#
+# Prerequisites:
+#   - Docker with >= 8 GB memory
+#   - JDBC jars in downloads/ (run ./download-archives.sh)
+#   - Ranger admin tarball in dist/ OR repo built via mvn
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+RANGER_DOCKER_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+REPO_ROOT="$(cd "${RANGER_DOCKER_DIR}/../.." && pwd)"
+
+# shellcheck disable=SC1091
+source "${RANGER_DOCKER_DIR}/.env"
+
+DB_TYPES=("$@")
+if [ "${#DB_TYPES[@]}" -eq 0 ]; then
+  DB_TYPES=(postgres mysql oracle sqlserver)
+fi
+
+ensure_admin_tarball() {
+  local tarball="${RANGER_DOCKER_DIR}/dist/ranger-${RANGER_VERSION}-admin.tar.gz"
+  if [ -f "${tarball}" ]; then
+    echo "[ok] Admin tarball present: ${tarball}"
+    return
+  fi
+  echo "[build] Packaging admin tarball from ${REPO_ROOT} (distro module)..."
+  (cd "${REPO_ROOT}" && mvn -pl distro -am package -DskipTests -q)
+  cp "${REPO_ROOT}"/target/ranger-"${RANGER_VERSION}"-admin.tar.gz "${tarball}"
+  echo "${RANGER_VERSION}" > "${RANGER_DOCKER_DIR}/dist/version"
+}
+
+teardown_stack() {
+  local db_type="$1"
+  echo "[teardown] ${db_type} stack..."
+  export RANGER_DB_TYPE="${db_type}"
+  docker compose -f "${RANGER_DOCKER_DIR}/docker-compose.ranger.yml" down -v --remove-orphans 2>/dev/null || true
+  docker rm -f ranger ranger-postgres ranger-mysql ranger-oracle ranger-sqlserver \
+    ranger-kdc ranger-zk ranger-solr 2>/dev/null || true
+  docker network rm rangernw 2>/dev/null || true
+  local i
+  for i in $(seq 1 12); do
+    if ! docker ps -a --format '{{.Names}}' | grep -qE '^ranger(-|$)'; then
+      return 0
+    fi
+    sleep 2
+  done
+  local leftover
+  leftover="$(docker ps -a --filter name=ranger --format '{{.Names}}' 2>/dev/null || true)"
+  if [ -n "${leftover}" ]; then
+    echo "${leftover}" | xargs docker rm -f 2>/dev/null || true
+  fi
+}
+
+wait_for_db_setup() {
+  local db_type="$1"
+  local max_wait=90
+  case "${db_type}" in
+    oracle|sqlserver) max_wait=120 ;;
+  esac
+  local i
+  echo "[3/4] Waiting for DB setup / patch 078 (up to $((max_wait * 10))s)..."
+  for i in $(seq 1 "${max_wait}"); do
+    if docker logs ranger 2>&1 | grep -qE "DB_PATCHES have already been applied|Ranger Admin Setup completed|Patch 078|DEFAULT_ALL_ADMIN"; then
+      sleep 5
+      if "${SCRIPT_DIR}/verify-patch-078.sh" >/dev/null 2>&1; then
+        "${SCRIPT_DIR}/verify-patch-078.sh"
+        echo "  DB verified after ~$((i * 10))s"
+        return 0
+      fi
+    fi
+    if "${SCRIPT_DIR}/verify-patch-078.sh" >/dev/null 2>&1; then
+      "${SCRIPT_DIR}/verify-patch-078.sh"
+      echo "  DB verified after ~$((i * 10))s"
+      return 0
+    fi
+    if [ "${i}" -eq "${max_wait}" ]; then
+      echo "[error] Patch 078 verification timed out; ranger logs:"
+      docker logs ranger 2>&1 | tail -40
+      return 1
+    fi
+    sleep 10
+  done
+}
+
+test_db() {
+  local db_type="$1"
+  echo ""
+  echo "=========================================="
+  echo "Testing patch 078 with RANGER_DB_TYPE=${db_type}"
+  echo "=========================================="
+
+  export RANGER_DB_TYPE="${db_type}"
+  export KERBEROS_ENABLED=false
+
+  teardown_stack "${db_type}"
+
+  echo "[1/4] Building DB + Admin images..."
+  docker compose -f "${RANGER_DOCKER_DIR}/docker-compose.ranger.yml" \
+    build ranger-db ranger ranger-kdc ranger-zk
+
+  echo "[2/4] Starting stack (DB + Admin + ZK; Kerberos off, no Solr)..."
+  if ! docker compose -f "${RANGER_DOCKER_DIR}/docker-compose.ranger.yml" \
+    up -d 2>&1 | tee /tmp/ranger-compose-up-${db_type}.log; then
+    echo "[error] docker compose up failed:"
+    tail -20 /tmp/ranger-compose-up-${db_type}.log
+    return 1
+  fi
+
+  if ! wait_for_db_setup "${db_type}"; then
+    return 1
+  fi
+
+  teardown_stack "${db_type}"
+}
+
+ensure_admin_tarball
+
+FAILED=()
+for db in "${DB_TYPES[@]}"; do
+  if ! test_db "${db}"; then
+    FAILED+=("${db}")
+  fi
+done
+
+echo ""
+echo "=========================================="
+if [ "${#FAILED[@]}" -eq 0 ]; then
+  echo "All tested DB types passed patch 078 verification."
+else
+  echo "Failed DB types: ${FAILED[*]}"
+  exit 1
+fi
diff --git a/dev-support/ranger-docker/scripts/db-test/test-patch-078-e2e-docker.sh b/dev-support/ranger-docker/scripts/db-test/test-patch-078-e2e-docker.sh
new file mode 100755
index 000000000..756a1a615
--- /dev/null
+++ b/dev-support/ranger-docker/scripts/db-test/test-patch-078-e2e-docker.sh
@@ -0,0 +1,334 @@
+#!/bin/bash
+# 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.
+
+# Fresh-install and 077->078 upgrade E2E for patch 078 (all docker DB backends).
+#
+# Usage (from dev-support/ranger-docker):
+#   ./scripts/db-test/test-patch-078-e2e-docker.sh
+#   ./scripts/db-test/test-patch-078-e2e-docker.sh postgres mysql
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+RANGER_DOCKER_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+REPO_ROOT="$(cd "${RANGER_DOCKER_DIR}/../.." && pwd)"
+
+# shellcheck disable=SC1091
+source "${RANGER_DOCKER_DIR}/.env"
+
+DB_TYPES=("$@")
+if [ "${#DB_TYPES[@]}" -eq 0 ]; then
+  DB_TYPES=(postgres mysql oracle sqlserver)
+fi
+
+DIST_TARBALL="${RANGER_DOCKER_DIR}/dist/ranger-${RANGER_VERSION}-admin.tar.gz"
+MASTER_TARBALL="${RANGER_DOCKER_DIR}/dist/ranger-${RANGER_VERSION}-admin-master.tar.gz"
+BRANCH_TARBALL="${RANGER_DOCKER_DIR}/dist/ranger-${RANGER_VERSION}-admin-branch.tar.gz"
+
+build_admin_tarball_with_db() {
+  local db_dir="$1"
+  local out_tarball="$2"
+  local base_tarball="${DIST_TARBALL}"
+
+  if [ ! -f "${base_tarball}" ]; then
+    echo "[error] Base admin tarball missing: ${base_tarball}" >&2
+    return 1
+  fi
+
+  local workdir
+  workdir="$(mktemp -d)"
+  tar -xzf "${base_tarball}" -C "${workdir}"
+  local admin_dir
+  admin_dir="$(find "${workdir}" -maxdepth 1 -type d -name 'ranger-*-admin' | head -1)"
+  chmod -R u+w "${admin_dir}"
+  rsync -a --delete --exclude='._*' --exclude='.DS_Store' "${db_dir}/" "${admin_dir}/db/"
+  cp "${REPO_ROOT}/security-admin/scripts/dba_script.py" "${admin_dir}/dba_script.py"
+  COPYFILE_DISABLE=1 tar -czf "${out_tarball}" -C "${workdir}" "$(basename "${admin_dir}")"
+  rm -rf "${workdir}"
+  echo "[ok] Built ${out_tarball}"
+}
+
+fix_master_sqlserver_schema() {
+  local master_db="$1"
+  local schema="${master_db}/sqlserver/optimized/current/ranger_core_db_sqlserver.sql"
+  # master @077: patch 077 dropped x_policy_ref_user audit FKs but left an orphaned
+  # CHECK CONSTRAINT line in optimized schema (fixed on branch in RANGER-5720).
+  if [ -f "${schema}" ]; then
+    sed -i '' '/x_policy_ref_user\] CHECK CONSTRAINT \[x_policy_ref_user_FK_upd_by\]/d' "${schema}" 2>/dev/null \
+      || sed -i '/x_policy_ref_user\] CHECK CONSTRAINT \[x_policy_ref_user_FK_upd_by\]/d' "${schema}"
+  fi
+}
+
+prepare_tarballs() {
+  echo "[prep] Building master (077) and branch (078) admin tarballs..."
+  local master_db="${RANGER_DOCKER_DIR}/.patch078-master-db"
+  local branch_db="${REPO_ROOT}/security-admin/db"
+  rm -rf "${master_db}"
+  mkdir -p "${master_db}"
+  git -C "${REPO_ROOT}" archive master:security-admin/db | tar -x -C "${master_db}"
+  fix_master_sqlserver_schema "${master_db}"
+  build_admin_tarball_with_db "${master_db}" "${MASTER_TARBALL}"
+  build_admin_tarball_with_db "${branch_db}" "${BRANCH_TARBALL}"
+  cp "${BRANCH_TARBALL}" "${DIST_TARBALL}"
+}
+
+use_tarball() {
+  cp "$1" "${DIST_TARBALL}"
+}
+
+teardown_stack() {
+  local db_type="$1"
+  echo "[teardown] ${db_type} stack..."
+  export RANGER_DB_TYPE="${db_type}"
+  docker compose -f "${RANGER_DOCKER_DIR}/docker-compose.ranger.yml" down -v --remove-orphans 2>/dev/null || true
+  docker rm -f ranger ranger-postgres ranger-mysql ranger-oracle ranger-sqlserver \
+    ranger-kdc ranger-zk ranger-solr ranger-db 2>/dev/null || true
+  docker network rm rangernw 2>/dev/null || true
+  sleep 2
+}
+
+wait_for_db_setup() {
+  local db_type="$1"
+  export RANGER_DB_TYPE="${db_type}"
+  local max_wait=90
+  case "${db_type}" in
+    oracle|sqlserver) max_wait=120 ;;
+  esac
+  local i
+  for i in $(seq 1 "${max_wait}"); do
+    if "${SCRIPT_DIR}/verify-patch-078.sh" >/dev/null 2>&1; then
+      if "${SCRIPT_DIR}/verify-patch-078.sh"; then
+        echo "  verified after ~$((i * 10))s"
+        return 0
+      fi
+    fi
+    if [ "${i}" -eq "${max_wait}" ]; then
+      echo "[error] verification timed out; last verify attempt:"
+      "${SCRIPT_DIR}/verify-patch-078.sh" || true
+      docker logs ranger 2>&1 | tail -20 || true
+      return 1
+    fi
+    sleep 10
+  done
+}
+
+wait_for_master_at_077() {
+  local db_type="$1"
+  export RANGER_DB_TYPE="${db_type}"
+  local max_wait=120
+  case "${db_type}" in
+    oracle|sqlserver) max_wait=150 ;;
+  esac
+  local i patch077=""
+  for i in $(seq 1 "${max_wait}"); do
+    patch077=""
+    case "${db_type}" in
+      postgres)
+        patch077="$(docker exec ranger-postgres psql -U rangeradmin -d ranger -t -A -c "SELECT COALESCE(active,'') FROM x_db_version_h WHERE version='077';" 2>/dev/null | tr -d '\r')"
+        ;;
+      mysql)
+        patch077="$(docker exec ranger-mysql mysql -urangeradmin -prangerR0cks! ranger -N -s -e "SELECT COALESCE(active,'') FROM x_db_version_h WHERE version='077';" 2>/dev/null || true)"
+        ;;
+      oracle)
+        patch077="$(docker exec ranger-oracle bash -lc "sqlplus -s rangeradmin/rangerR0cks!@//localhost:1521/FREEPDB1 <<'EOSQL'
+SET HEADING OFF FEEDBACK OFF PAGES 0
+SELECT NVL(active,' ') FROM x_db_version_h WHERE version='077';
+EXIT
+EOSQL" 2>/dev/null | grep -v '^$' | tail -1 | tr -d '\r\t' | xargs || true)"
+        ;;
+      sqlserver)
+        patch077="$(docker exec ranger-sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U rangeradmin -P rangerR0cks! -d ranger -C -h -1 -W -Q "SET NOCOUNT ON; SELECT ISNULL(active,'') FROM x_db_version_h WHERE version='077'" 2>/dev/null | tr -d '\r' | sed '/^$/d' | head -1)"
+        ;;
+    esac
+    if [ "${patch077}" = "Y" ]; then
+      echo "  master DB at patch 077 after ~$((i * 10))s"
+      return 0
+    fi
+    if [ "${i}" -eq "${max_wait}" ]; then
+      echo "[error] master install did not reach patch 077"
+      docker logs ranger 2>&1 | tail -30
+      return 1
+    fi
+    sleep 10
+  done
+}
+
+start_stack() {
+  local db_type="$1"
+  export RANGER_DB_TYPE="${db_type}"
+  export KERBEROS_ENABLED=false
+  teardown_stack "${db_type}"
+  docker compose -f "${RANGER_DOCKER_DIR}/docker-compose.ranger.yml" \
+    build ranger-db ranger ranger-kdc ranger-zk
+  docker compose -f "${RANGER_DOCKER_DIR}/docker-compose.ranger.yml" up -d
+}
+
+verify_patch_077_only() {
+  local db_type="$1"
+  export RANGER_DB_TYPE="${db_type}"
+  local patch078=""
+  case "${db_type}" in
+    postgres)
+      patch078="$(docker exec ranger-postgres psql -U rangeradmin -d ranger -t -A -c "SELECT COALESCE(active,'') FROM x_db_version_h WHERE version='078';" 2>/dev/null | tr -d '\r')"
+      ;;
+    mysql)
+      patch078="$(docker exec ranger-mysql mysql -urangeradmin -prangerR0cks! ranger -N -s -e "SELECT COALESCE(active,'') FROM x_db_version_h WHERE version='078';" 2>/dev/null || true)"
+      ;;
+    oracle)
+      patch078="$(docker exec ranger-oracle bash -lc "sqlplus -s rangeradmin/rangerR0cks!@//localhost:1521/FREEPDB1 <<'EOSQL'
+SET HEADING OFF FEEDBACK OFF PAGES 0
+SELECT NVL(active,' ') FROM x_db_version_h WHERE version='078';
+EXIT
+EOSQL" 2>/dev/null | grep -v '^$' | tail -1 | tr -d '\r\t' | xargs || true)"
+      ;;
+    sqlserver)
+      patch078="$(docker exec ranger-sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U rangeradmin -P rangerR0cks! -d ranger -C -h -1 -W -Q "SET NOCOUNT ON; SELECT ISNULL(active,'') FROM x_db_version_h WHERE version='078'" 2>/dev/null | tr -d '\r' | sed '/^$/d' | head -1)"
+      ;;
+  esac
+  if [ "${patch078}" = "Y" ]; then
+    echo "[error] patch 078 already applied before upgrade step" >&2
+    return 1
+  fi
+  echo "  [ok] patch 078 not yet applied (expected pre-upgrade)"
+}
+
+clear_patch_078_marker() {
+  local db_type="$1"
+  case "${db_type}" in
+    postgres)
+      docker exec ranger-postgres psql -U rangeradmin -d ranger -c "DELETE FROM x_db_version_h WHERE version='078';"
+      ;;
+    mysql)
+      docker exec ranger-mysql mysql -urangeradmin -prangerR0cks! ranger -e "DELETE FROM x_db_version_h WHERE version='078';"
+      ;;
+    oracle)
+      docker exec ranger-oracle bash -lc "sqlplus -s rangeradmin/rangerR0cks!@//localhost:1521/FREEPDB1 <<'EOSQL'
+DELETE FROM x_db_version_h WHERE version='078';
+COMMIT;
+EXIT
+EOSQL"
+      ;;
+    sqlserver)
+      docker exec ranger-sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U rangeradmin -P rangerR0cks! -d ranger -C -Q "DELETE FROM x_db_version_h WHERE version='078';"
+      ;;
+  esac
+}
+
+clear_db_patches_marker() {
+  local db_type="$1"
+  case "${db_type}" in
+    postgres)
+      docker exec ranger-postgres psql -U rangeradmin -d ranger -c "DELETE FROM x_db_version_h WHERE version='DB_PATCHES';"
+      ;;
+    mysql)
+      docker exec ranger-mysql mysql -urangeradmin -prangerR0cks! ranger -e "DELETE FROM x_db_version_h WHERE version='DB_PATCHES';"
+      ;;
+    oracle)
+      docker exec ranger-oracle bash -lc "sqlplus -s rangeradmin/rangerR0cks!@//localhost:1521/FREEPDB1 <<'EOSQL'
+DELETE FROM x_db_version_h WHERE version='DB_PATCHES';
+COMMIT;
+EXIT
+EOSQL"
+      ;;
+    sqlserver)
+      docker exec ranger-sqlserver /opt/mssql-tools18/bin/sqlcmd -S localhost -U rangeradmin -P rangerR0cks! -d ranger -C -Q "DELETE FROM x_db_version_h WHERE version='DB_PATCHES';"
+      ;;
+  esac
+}
+
+run_db_setup_in_container() {
+  docker exec ranger bash -lc '
+    set -e
+    ADMIN=$(find /opt/ranger -maxdepth 2 -type d -name "ranger-*-admin" | head -1)
+    cd "${ADMIN}"
+    python3 db_setup.py
+  '
+}
+
+apply_upgrade_in_container() {
+  local branch_db="$1"
+  local db_type="$2"
+  local admin_path patch_file="${branch_db}/${db_type}/patches/078-add-x_audit_config.sql"
+  admin_path="$(docker exec ranger bash -lc 'find /opt/ranger -maxdepth 2 -type d -name "ranger-*-admin" | head -1')"
+  if [ ! -f "${patch_file}" ]; then
+    echo "[error] missing patch file: ${patch_file}" >&2
+    return 1
+  fi
+  docker cp "${patch_file}" "ranger:${admin_path}/db/${db_type}/patches/078-add-x_audit_config.sql"
+  docker exec ranger bash -lc "rm -f ${admin_path}/db/${db_type}/patches/078-audit-partition-plan-global-state.sql ${admin_path}/db/${db_type}/patches/._078* 2>/dev/null || true"
+  clear_patch_078_marker "${db_type}"
+  clear_db_patches_marker "${db_type}"
+  run_db_setup_in_container
+}
+
+test_fresh_install() {
+  local db_type="$1"
+  echo ""
+  echo "======== Fresh install: ${db_type} ========"
+  use_tarball "${BRANCH_TARBALL}"
+  start_stack "${db_type}"
+  wait_for_db_setup "${db_type}"
+  teardown_stack "${db_type}"
+}
+
+test_upgrade() {
+  local db_type="$1"
+  echo ""
+  echo "======== Upgrade 077->078: ${db_type} ========"
+  use_tarball "${MASTER_TARBALL}"
+  start_stack "${db_type}"
+  wait_for_master_at_077 "${db_type}" || { teardown_stack "${db_type}"; return 1; }
+  verify_patch_077_only "${db_type}" || { teardown_stack "${db_type}"; return 1; }
+  apply_upgrade_in_container "${REPO_ROOT}/security-admin/db" "${db_type}" || { teardown_stack "${db_type}"; return 1; }
+  wait_for_db_setup "${db_type}" || { teardown_stack "${db_type}"; return 1; }
+  teardown_stack "${db_type}"
+}
+
+prepare_tarballs
+
+FRESH_FAILED=()
+UPGRADE_FAILED=()
+
+if [ "${SKIP_FRESH:-0}" != "1" ]; then
+  for db in "${DB_TYPES[@]}"; do
+    if ! test_fresh_install "${db}"; then
+      FRESH_FAILED+=("${db}")
+    fi
+  done
+else
+  echo "[skip] Fresh install tests skipped (SKIP_FRESH=1)"
+fi
+
+for db in "${DB_TYPES[@]}"; do
+  if ! test_upgrade "${db}"; then
+    UPGRADE_FAILED+=("${db}")
+  fi
+done
+
+echo ""
+echo "=========================================="
+if [ "${SKIP_FRESH:-0}" != "1" ]; then
+  echo "Fresh install: $([ ${#FRESH_FAILED[@]} -eq 0 ] && echo PASS || echo "FAIL (${FRESH_FAILED[*]})")"
+fi
+echo "Upgrade 077->078: $([ ${#UPGRADE_FAILED[@]} -eq 0 ] && echo PASS || echo "FAIL (${UPGRADE_FAILED[*]})")"
+echo "=========================================="
+
+if [ "${SKIP_FRESH:-0}" != "1" ] && [ "${#FRESH_FAILED[@]}" -ne 0 ]; then
+  exit 1
+fi
+if [ "${#UPGRADE_FAILED[@]}" -ne 0 ]; then
+  exit 1
+fi
diff --git a/dev-support/ranger-docker/scripts/db-test/verify-patch-078.sh b/dev-support/ranger-docker/scripts/db-test/verify-patch-078.sh
new file mode 100755
index 000000000..fa9f60f9c
--- /dev/null
+++ b/dev-support/ranger-docker/scripts/db-test/verify-patch-078.sh
@@ -0,0 +1,204 @@
+#!/bin/bash
+# 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.
+
+# Verify RANGER-5720 / patch 078 outcomes in a Ranger Admin database.
+#
+# Usage (from dev-support/ranger-docker):
+#   export RANGER_DB_TYPE=postgres   # postgres|mysql|oracle|sqlserver
+#   ./scripts/db-test/verify-patch-078.sh
+
+set -euo pipefail
+
+SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
+RANGER_DOCKER_DIR="$(cd "${SCRIPT_DIR}/../.." && pwd)"
+DB_TYPE="${RANGER_DB_TYPE:-postgres}"
+
+PASS=0
+FAIL=0
+
+pass() { echo "  [PASS] $*"; PASS=$((PASS + 1)); }
+fail() { echo "  [FAIL] $*"; FAIL=$((FAIL + 1)); }
+
+check_eq() {
+  local label="$1" expected="$2" actual="$3"
+  if [ "${actual}" = "${expected}" ]; then
+    pass "${label} (${actual})"
+  else
+    fail "${label} expected '${expected}', got '${actual}'"
+  fi
+}
+
+check_contains() {
+  local label="$1" needle="$2" haystack="$3"
+  if echo "${haystack}" | grep -q "${needle}"; then
+    pass "${label}"
+  else
+    fail "${label} (missing '${needle}' in '${haystack}')"
+  fi
+}
+
+verify_audit_config_common() {
+  check_eq "ingestor.url" "https://ranger-audit-ingestor:8765" "${INGESTOR_URL}"
+  check_eq "service.hive.allowed.users" "hive" "${HIVE_USERS}"
+  check_contains "audit.partition.plan JSON" "ranger_audits" "${PLAN_JSON}"
+  check_contains "audit.partition.plan buffer" "buffer" "${PLAN_JSON}"
+  if [ -n "${GLOBAL_PLAN}" ]; then
+    fail "x_ranger_global_state partition plan row should be absent (got '${GLOBAL_PLAN}')"
+  else
+    pass "no x_ranger_global_state partition plan row"
+  fi
+}
+
+echo "=== Patch 078 verification (${DB_TYPE}) ==="
+
+case "${DB_TYPE}" in
+  postgres)
+    DB_CONTAINER="${DB_CONTAINER:-ranger-postgres}"
+    run_sql() {
+      docker exec "${DB_CONTAINER}" psql -U rangeradmin -d ranger -t -A -c "$1" 2>/dev/null | tr -d '\r'
+    }
+    STATUS="$(run_sql "SELECT status FROM x_portal_user WHERE login_id='rangerauditserver';")"
+    PASSWORD="$(run_sql "SELECT COALESCE(password,'') FROM x_portal_user WHERE login_id='rangerauditserver';")"
+    ROLE="$(run_sql "SELECT user_role FROM x_portal_user_role WHERE user_id=(SELECT id FROM x_portal_user WHERE login_id='rangerauditserver');")"
+    INGESTOR_URL="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='ingestor.url';")"
+    HIVE_USERS="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='service.hive.allowed.users';")"
+    PLAN_JSON="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='audit.partition.plan';")"
+    GLOBAL_PLAN="$(run_sql "SELECT state_name FROM x_ranger_global_state WHERE state_name='RangerAuditPartitionPlan';")"
+    PATCH078="$(run_sql "SELECT active FROM x_db_version_h WHERE version='078';")"
+    COLTYPE="$(run_sql "SELECT data_type FROM information_schema.columns WHERE table_name='x_ranger_global_state' AND column_name='app_data';")"
+    check_eq "rangerauditserver status" "0" "${STATUS}"
+    check_eq "rangerauditserver password" "" "${PASSWORD}"
+    check_eq "rangerauditserver role" "ROLE_ADMIN_AUDITOR" "${ROLE}"
+    verify_audit_config_common
+    check_eq "patch 078 applied" "Y" "${PATCH078}"
+    if [ "${COLTYPE}" = "character varying" ]; then
+      pass "x_ranger_global_state.app_data type (${COLTYPE})"
+    else
+      fail "x_ranger_global_state.app_data type expected character varying, got '${COLTYPE}'"
+    fi
+    ;;
+
+  mysql)
+    DB_CONTAINER="${DB_CONTAINER:-ranger-mysql}"
+    run_sql() {
+      docker exec "${DB_CONTAINER}" mysql -urangeradmin -prangerR0cks! ranger -N -s -e "$1" 2>/dev/null
+    }
+    STATUS="$(run_sql "SELECT status FROM x_portal_user WHERE login_id='rangerauditserver';")"
+    PASSWORD="$(run_sql "SELECT IFNULL(password,'') FROM x_portal_user WHERE login_id='rangerauditserver';")"
+    ROLE="$(run_sql "SELECT user_role FROM x_portal_user_role WHERE user_id=(SELECT id FROM x_portal_user WHERE login_id='rangerauditserver');")"
+    INGESTOR_URL="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='ingestor.url';")"
+    HIVE_USERS="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='service.hive.allowed.users';")"
+    PLAN_JSON="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='audit.partition.plan';")"
+    GLOBAL_PLAN="$(run_sql "SELECT state_name FROM x_ranger_global_state WHERE state_name='RangerAuditPartitionPlan';")"
+    PATCH078="$(run_sql "SELECT active FROM x_db_version_h WHERE version='078';")"
+    COLTYPE="$(run_sql "SELECT data_type FROM information_schema.columns WHERE table_schema=DATABASE() AND table_name='x_ranger_global_state' AND column_name='app_data';")"
+    check_eq "rangerauditserver status" "0" "${STATUS}"
+    check_eq "rangerauditserver password" "" "${PASSWORD}"
+    check_eq "rangerauditserver role" "ROLE_ADMIN_AUDITOR" "${ROLE}"
+    verify_audit_config_common
+    check_eq "patch 078 applied" "Y" "${PATCH078}"
+    if [ "${COLTYPE}" = "varchar" ]; then
+      pass "x_ranger_global_state.app_data type (${COLTYPE})"
+    else
+      fail "x_ranger_global_state.app_data type expected varchar, got '${COLTYPE}'"
+    fi
+    ;;
+
+  oracle)
+    DB_CONTAINER="${DB_CONTAINER:-ranger-oracle}"
+    if ! docker ps --format '{{.Names}}' | grep -qx "${DB_CONTAINER}"; then
+      fail "Oracle DB container ${DB_CONTAINER} is not running"
+    else
+    run_sql() {
+      docker exec "${DB_CONTAINER}" bash -lc "sqlplus -s rangeradmin/rangerR0cks!@//localhost:1521/FREEPDB1 <<'EOSQL'
+SET HEADING OFF FEEDBACK OFF PAGES 0 VERIFY OFF
+WHENEVER SQLERROR EXIT SQL.SQLCODE
+$1
+EXIT
+EOSQL" 2>/dev/null | grep -viE 'SP2-0157|ORA-[0-9]+|ERROR|Help:' | grep -v '^$' | tail -1 | tr -d '\r\t' | xargs || true
+    }
+    run_sql_clob() {
+      docker exec "${DB_CONTAINER}" bash -lc "sqlplus -s rangeradmin/rangerR0cks!@//localhost:1521/FREEPDB1 <<'EOSQL'
+SET HEADING OFF FEEDBACK OFF PAGES 0 LONG 4000 LONGCHUNKSIZE 4000 LINESIZE 32767 TRIMOUT ON
+$1
+EXIT
+EOSQL" 2>/dev/null | grep -v '^$' | tr -d '\r\n' | sed 's/^[[:space:]]*//;s/[[:space:]]*$//' || true
+    }
+    STATUS="$(run_sql "SELECT status FROM x_portal_user WHERE login_id='rangerauditserver';")"
+    PASSWORD="$(run_sql "SELECT NVL(password,' ') FROM x_portal_user WHERE login_id='rangerauditserver';")"
+    PASSWORD="$(echo "${PASSWORD}" | xargs)"
+    [ -z "${PASSWORD}" ] || [ "${PASSWORD}" = " " ] && PASSWORD=""
+    ROLE="$(run_sql "SELECT user_role FROM x_portal_user_role WHERE user_id=(SELECT id FROM x_portal_user WHERE login_id='rangerauditserver');")"
+    INGESTOR_URL="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='ingestor.url';")"
+    HIVE_USERS="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='service.hive.allowed.users';")"
+    PLAN_JSON="$(run_sql_clob "SELECT DBMS_LOB.SUBSTR(cfg_value, 4000, 1) FROM x_audit_config WHERE cfg_name='audit.partition.plan';")"
+    GLOBAL_PLAN="$(run_sql "SELECT state_name FROM x_ranger_global_state WHERE state_name='RangerAuditPartitionPlan';")"
+    PATCH078="$(run_sql "SELECT active FROM x_db_version_h WHERE version='078';")"
+    COLTYPE="$(run_sql "SELECT data_type FROM user_tab_columns WHERE table_name='X_RANGER_GLOBAL_STATE' AND column_name='APP_DATA';")"
+    check_eq "rangerauditserver status" "0" "${STATUS}"
+    check_eq "rangerauditserver password" "" "${PASSWORD}"
+    check_eq "rangerauditserver role" "ROLE_ADMIN_AUDITOR" "${ROLE}"
+    verify_audit_config_common
+    check_eq "patch 078 applied" "Y" "${PATCH078}"
+    if [ "${COLTYPE}" = "VARCHAR2" ]; then
+      pass "x_ranger_global_state.app_data type (${COLTYPE})"
+    else
+      fail "x_ranger_global_state.app_data type expected VARCHAR2, got '${COLTYPE}'"
+    fi
+    fi
+    ;;
+
+  sqlserver)
+    DB_CONTAINER="${DB_CONTAINER:-ranger-sqlserver}"
+    run_sql() {
+      docker exec "${DB_CONTAINER}" /opt/mssql-tools18/bin/sqlcmd -S localhost -U rangeradmin -P rangerR0cks! -d ranger -C -h -1 -W -Q "SET NOCOUNT ON; $1" 2>/dev/null | tr -d '\r' | sed '/^$/d' | head -1
+    }
+    STATUS="$(run_sql "SELECT status FROM x_portal_user WHERE login_id='rangerauditserver'")"
+    PASSWORD="$(run_sql "SELECT ISNULL(password,'') FROM x_portal_user WHERE login_id='rangerauditserver'")"
+    ROLE="$(run_sql "SELECT user_role FROM x_portal_user_role WHERE user_id=(SELECT id FROM x_portal_user WHERE login_id='rangerauditserver')")"
+    INGESTOR_URL="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='ingestor.url'")"
+    HIVE_USERS="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='service.hive.allowed.users'")"
+    PLAN_JSON="$(run_sql "SELECT cfg_value FROM x_audit_config WHERE cfg_name='audit.partition.plan'")"
+    GLOBAL_PLAN="$(run_sql "SELECT state_name FROM x_ranger_global_state WHERE state_name='RangerAuditPartitionPlan'")"
+    PATCH078="$(run_sql "SELECT active FROM x_db_version_h WHERE version='078'")"
+    COLTYPE="$(run_sql "SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='x_ranger_global_state' AND COLUMN_NAME='app_data'")"
+    check_eq "rangerauditserver status" "0" "${STATUS}"
+    check_eq "rangerauditserver password" "" "${PASSWORD}"
+    check_eq "rangerauditserver role" "ROLE_ADMIN_AUDITOR" "${ROLE}"
+    verify_audit_config_common
+    check_eq "patch 078 applied" "Y" "${PATCH078}"
+    if [ "${COLTYPE}" = "varchar" ]; then
+      pass "x_ranger_global_state.app_data type (${COLTYPE})"
+    else
+      fail "x_ranger_global_state.app_data type expected varchar, got '${COLTYPE}'"
+    fi
+    ;;
+
+  sqlanywhere)
+    echo "SQL Anywhere is not supported in ranger-docker (no DB container)."
+    echo "Apply patch 078 manually with db_setup/jisql on a SQL Anywhere host."
+    exit 2
+    ;;
+
+  *)
+    echo "Unknown RANGER_DB_TYPE: ${DB_TYPE}" >&2
+    exit 1
+    ;;
+esac
+
+echo ""
+echo "=== Results: ${PASS} passed, ${FAIL} failed ==="
+[ "${FAIL}" -eq 0 ]
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 6d1070cc0..186b6c723 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
@@ -1898,8 +1898,7 @@ INSERT INTO x_ranger_global_state (create_time,update_time,added_by_id,upd_by_id
 
 INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (UTC_TIMESTAMP(),UTC_TIMESTAMP(),'ingestor.url','https://ranger-audit-ingestor:8765',1);
 INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (UTC_TIMESTAMP(),UTC_TIMESTAMP(),'service.hive.allowed.users','hive',1);
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (UTC_TIMESTAMP(),UTC_TIMESTAMP(),'topic','ranger_audits',1);
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (UTC_TIMESTAMP(),UTC_TIMESTAMP(),'RangerAuditPartitionPlan','{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
+INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (UTC_TIMESTAMP(),UTC_TIMESTAMP(),'audit.partition.plan','{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
 
 END $$
 DELIMITER ;
diff --git a/security-admin/db/mysql/patches/078-audit-partition-plan-global-state.sql b/security-admin/db/mysql/patches/078-add-x_audit_config.sql
similarity index 90%
rename from security-admin/db/mysql/patches/078-audit-partition-plan-global-state.sql
rename to security-admin/db/mysql/patches/078-add-x_audit_config.sql
index 45113b62c..851575420 100644
--- a/security-admin/db/mysql/patches/078-audit-partition-plan-global-state.sql
+++ b/security-admin/db/mysql/patches/078-add-x_audit_config.sql
@@ -75,13 +75,9 @@ BEGIN
         INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
         VALUES (UTC_TIMESTAMP(), UTC_TIMESTAMP(), 'service.hive.allowed.users', 'hive', 1);
     END IF;
-    IF NOT EXISTS (SELECT 1 FROM x_audit_config WHERE cfg_name = 'topic') THEN
+    IF NOT EXISTS (SELECT 1 FROM x_audit_config WHERE cfg_name = 'audit.partition.plan') THEN
         INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
-        VALUES (UTC_TIMESTAMP(), UTC_TIMESTAMP(), 'topic', 'ranger_audits', 1);
-    END IF;
-    IF NOT EXISTS (SELECT 1 FROM x_audit_config WHERE cfg_name = 'RangerAuditPartitionPlan') THEN
-        INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
-        VALUES (UTC_TIMESTAMP(), UTC_TIMESTAMP(), 'RangerAuditPartitionPlan', '{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
+        VALUES (UTC_TIMESTAMP(), UTC_TIMESTAMP(), 'audit.partition.plan', '{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
     END IF;
 END;;
 
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 1265f7a95..2cdefbb60 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
@@ -2199,8 +2199,7 @@ INSERT INTO x_ranger_global_state (id,create_time,update_time,added_by_id,upd_by
 
 INSERT INTO x_audit_config (id,create_time,update_time,cfg_name,cfg_value,version) VALUES (X_AUDIT_CONFIG_SEQ.nextval,sys_extract_utc(systimestamp),sys_extract_utc(systimestamp),'ingestor.url','https://ranger-audit-ingestor:8765',1);
 INSERT INTO x_audit_config (id,create_time,update_time,cfg_name,cfg_value,version) VALUES (X_AUDIT_CONFIG_SEQ.nextval,sys_extract_utc(systimestamp),sys_extract_utc(systimestamp),'service.hive.allowed.users','hive',1);
-INSERT INTO x_audit_config (id,create_time,update_time,cfg_name,cfg_value,version) VALUES (X_AUDIT_CONFIG_SEQ.nextval,sys_extract_utc(systimestamp),sys_extract_utc(systimestamp),'topic','ranger_audits',1);
-INSERT INTO x_audit_config (id,create_time,update_time,cfg_name,cfg_value,version) VALUES (X_AUDIT_CONFIG_SEQ.nextval,sys_extract_utc(systimestamp),sys_extract_utc(systimestamp),'RangerAuditPartitionPlan','{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
+INSERT INTO x_audit_config (id,create_time,update_time,cfg_name,cfg_value,version) VALUES (X_AUDIT_CONFIG_SEQ.nextval,sys_extract_utc(systimestamp),sys_extract_utc(systimestamp),'audit.partition.plan','{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
 
 INSERT INTO x_db_version_h (id,version,inst_at,inst_by,updated_at,updated_by,active) VALUES (X_DB_VERSION_H_SEQ.nextval,'J10001',sys_extract_utc(systimestamp),'Ranger 1.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,'J10002',sys_extract_utc(systimestamp),'Ranger 1.0.0',sys_extract_utc(systimestamp),'localhost','Y');
diff --git a/security-admin/db/oracle/patches/078-add-x_audit_config.sql b/security-admin/db/oracle/patches/078-add-x_audit_config.sql
new file mode 100644
index 000000000..03078031f
--- /dev/null
+++ b/security-admin/db/oracle/patches/078-add-x_audit_config.sql
@@ -0,0 +1,92 @@
+-- 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.
+
+DECLARE
+    v_table_count NUMBER := 0;
+    v_seq_count NUMBER := 0;
+    v_portal_user_count NUMBER := 0;
+    v_user_count NUMBER := 0;
+    v_role_count NUMBER := 0;
+    v_xuser_count NUMBER := 0;
+    v_cfg_count NUMBER := 0;
+    v_audit_user_id NUMBER := 0;
+    sql_stmt VARCHAR2(4000);
+BEGIN
+    SELECT count(*) INTO v_table_count FROM user_tables WHERE table_name = 'X_AUDIT_CONFIG';
+    IF (v_table_count = 0) THEN
+        EXECUTE IMMEDIATE '
+            CREATE TABLE x_audit_config (
+                id NUMBER(20) NOT NULL,
+                create_time DATE DEFAULT NULL NULL,
+                update_time DATE DEFAULT NULL NULL,
+                cfg_name varchar(255) NOT NULL,
+                cfg_value CLOB DEFAULT NULL NULL,
+                version NUMBER(20) DEFAULT NULL NULL,
+                PRIMARY KEY (id),
+                CONSTRAINT x_audit_config_UK_cfg_name UNIQUE (cfg_name)
+            )';
+        SELECT count(*) INTO v_seq_count FROM user_sequences WHERE sequence_name = 'X_AUDIT_CONFIG_SEQ';
+        IF (v_seq_count = 0) THEN
+            EXECUTE IMMEDIATE 'CREATE SEQUENCE X_AUDIT_CONFIG_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
+        END IF;
+    END IF;
+
+    SELECT count(*) INTO v_portal_user_count FROM user_tables WHERE table_name = 'X_PORTAL_USER';
+    IF (v_portal_user_count > 0) THEN
+        SELECT count(*) INTO v_user_count FROM x_portal_user WHERE login_id = 'rangerauditserver';
+        IF (v_user_count = 0) THEN
+            INSERT INTO x_portal_user (id, create_time, update_time, first_name, last_name, pub_scr_name, login_id, password, email, status, user_src)
+            VALUES (X_PORTAL_USER_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), 'rangerauditserver', NULL, 'rangerauditserver', 'rangerauditserver', ' ', 'rangerauditserver', 0, 0);
+        END IF;
+
+        UPDATE x_portal_user SET status = 0, password = ' ' WHERE login_id = 'rangerauditserver';
+
+        v_audit_user_id := getXportalUIdByLoginId('rangerauditserver');
+
+        IF (v_audit_user_id IS NOT NULL AND v_audit_user_id > 0) THEN
+            SELECT count(*) INTO v_role_count FROM x_portal_user_role WHERE user_id = v_audit_user_id AND user_role = 'ROLE_ADMIN_AUDITOR';
+            IF (v_role_count = 0) THEN
+                INSERT INTO x_portal_user_role (id, create_time, update_time, user_id, user_role, status)
+                VALUES (X_PORTAL_USER_ROLE_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), v_audit_user_id, 'ROLE_ADMIN_AUDITOR', 1);
+            END IF;
+
+            SELECT count(*) INTO v_xuser_count FROM x_user WHERE user_name = 'rangerauditserver';
+            IF (v_xuser_count = 0) THEN
+                INSERT INTO x_user (id, create_time, update_time, user_name, status, descr)
+                VALUES (X_USER_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), 'rangerauditserver', 0, 'Ranger audit server machine user');
+            END IF;
+        END IF;
+    END IF;
+
+    EXECUTE IMMEDIATE 'SELECT count(*) FROM x_audit_config WHERE cfg_name = :1' INTO v_cfg_count USING 'ingestor.url';
+    IF (v_cfg_count = 0) THEN
+        sql_stmt := 'INSERT INTO x_audit_config (id, create_time, update_time, cfg_name, cfg_value, version) VALUES (X_AUDIT_CONFIG_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
+        EXECUTE IMMEDIATE sql_stmt USING 'ingestor.url', 'https://ranger-audit-ingestor:8765';
+    END IF;
+
+    EXECUTE IMMEDIATE 'SELECT count(*) FROM x_audit_config WHERE cfg_name = :1' INTO v_cfg_count USING 'service.hive.allowed.users';
+    IF (v_cfg_count = 0) THEN
+        sql_stmt := 'INSERT INTO x_audit_config (id, create_time, update_time, cfg_name, cfg_value, version) VALUES (X_AUDIT_CONFIG_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
+        EXECUTE IMMEDIATE sql_stmt USING 'service.hive.allowed.users', 'hive';
+    END IF;
+
+    EXECUTE IMMEDIATE 'SELECT count(*) FROM x_audit_config WHERE cfg_name = :1' INTO v_cfg_count USING 'audit.partition.plan';
+    IF (v_cfg_count = 0) THEN
+        sql_stmt := 'INSERT INTO x_audit_config (id, create_time, update_time, cfg_name, cfg_value, version) VALUES (X_AUDIT_CONFIG_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
+        EXECUTE IMMEDIATE sql_stmt USING 'audit.partition.plan', '{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}';
+    END IF;
+
+    COMMIT;
+END;/
diff --git a/security-admin/db/oracle/patches/078-audit-partition-plan-global-state.sql b/security-admin/db/oracle/patches/078-audit-partition-plan-global-state.sql
deleted file mode 100644
index 0318556d9..000000000
--- a/security-admin/db/oracle/patches/078-audit-partition-plan-global-state.sql
+++ /dev/null
@@ -1,109 +0,0 @@
--- 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.
-
-CREATE OR REPLACE FUNCTION getXportalUIdByLoginId(input_val IN VARCHAR2)
-RETURN NUMBER IS
-BEGIN
-DECLARE
-    myid Number := 0;
-BEGIN
-    SELECT x_portal_user.id INTO myid FROM x_portal_user WHERE x_portal_user.login_id = input_val;
-    RETURN myid;
-END;
-END;
-/
-
-DECLARE
-    t_count number := 0;
-    v_audit_user_id number;
-    v_user_count number := 0;
-    v_role_count number := 0;
-    v_xuser_count number := 0;
-    v_audit_config_count number := 0;
-    v_cfg_count number := 0;
-    v_plan_json CLOB := '{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}';
-    sql_stmt VARCHAR2(4000);
-BEGIN
-    SELECT count(*) INTO v_audit_config_count FROM user_tables WHERE table_name = 'X_AUDIT_CONFIG';
-    IF (v_audit_config_count = 0) THEN
-        EXECUTE IMMEDIATE 'CREATE TABLE x_audit_config (id NUMBER(20) NOT NULL, create_time DATE DEFAULT NULL NULL, update_time DATE DEFAULT NULL NULL, cfg_name varchar(255) NOT NULL, cfg_value CLOB DEFAULT NULL NULL, version NUMBER(20) DEFAULT NULL NULL, primary key (id), CONSTRAINT x_audit_config_UK_cfg_name UNIQUE(cfg_name))';
-        BEGIN
-            EXECUTE IMMEDIATE 'CREATE SEQUENCE X_AUDIT_CONFIG_SEQ START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE';
-        EXCEPTION
-            WHEN OTHERS THEN
-                IF SQLCODE != -955 THEN
-                    RAISE;
-                END IF;
-        END;
-        COMMIT;
-    END IF;
-
-    SELECT count(*) INTO t_count FROM user_tables WHERE table_name = 'X_PORTAL_USER';
-    IF (t_count > 0) THEN
-        SELECT count(*) INTO v_user_count FROM x_portal_user WHERE login_id = 'rangerauditserver';
-        IF (v_user_count = 0) THEN
-            sql_stmt := 'INSERT INTO x_portal_user (id, create_time, update_time, first_name, last_name, pub_scr_name, login_id, password, email, status, user_src) VALUES (X_PORTAL_USER_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, NULL, :2, :3, :4, :5, 0, 0)';
-            EXECUTE IMMEDIATE sql_stmt USING 'rangerauditserver', 'rangerauditserver', 'rangerauditserver', ' ', 'rangerauditserver';
-            COMMIT;
-        END IF;
-
-        UPDATE x_portal_user SET status = 0, password = ' ' WHERE login_id = 'rangerauditserver';
-        COMMIT;
-
-        v_audit_user_id := getXportalUIdByLoginId('rangerauditserver');
-
-        IF (v_audit_user_id IS NOT NULL AND v_audit_user_id > 0) THEN
-            SELECT count(*) INTO v_role_count FROM x_portal_user_role WHERE user_id = v_audit_user_id AND user_role = 'ROLE_ADMIN_AUDITOR';
-            IF (v_role_count = 0) THEN
-                sql_stmt := 'INSERT INTO x_portal_user_role (id, create_time, update_time, user_id, user_role, status) VALUES (X_PORTAL_USER_ROLE_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
-                EXECUTE IMMEDIATE sql_stmt USING v_audit_user_id, 'ROLE_ADMIN_AUDITOR';
-                COMMIT;
-            END IF;
-
-            SELECT count(*) INTO v_xuser_count FROM x_user WHERE user_name = 'rangerauditserver';
-            IF (v_xuser_count = 0) THEN
-                sql_stmt := 'INSERT INTO x_user (id, create_time, update_time, user_name, status, descr) VALUES (X_USER_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, 0, :2)';
-                EXECUTE IMMEDIATE sql_stmt USING 'rangerauditserver', 'Ranger audit server machine user';
-                COMMIT;
-            END IF;
-        END IF;
-    END IF;
-
-    SELECT count(*) INTO v_cfg_count FROM x_audit_config WHERE cfg_name = 'ingestor.url';
-    IF (v_cfg_count = 0) THEN
-        sql_stmt := 'INSERT INTO x_audit_config (id, create_time, update_time, cfg_name, cfg_value, version) VALUES (X_AUDIT_CONFIG_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
-        EXECUTE IMMEDIATE sql_stmt USING 'ingestor.url', 'https://ranger-audit-ingestor:8765';
-        COMMIT;
-    END IF;
-    SELECT count(*) INTO v_cfg_count FROM x_audit_config WHERE cfg_name = 'service.hive.allowed.users';
-    IF (v_cfg_count = 0) THEN
-        sql_stmt := 'INSERT INTO x_audit_config (id, create_time, update_time, cfg_name, cfg_value, version) VALUES (X_AUDIT_CONFIG_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
-        EXECUTE IMMEDIATE sql_stmt USING 'service.hive.allowed.users', 'hive';
-        COMMIT;
-    END IF;
-    SELECT count(*) INTO v_cfg_count FROM x_audit_config WHERE cfg_name = 'topic';
-    IF (v_cfg_count = 0) THEN
-        sql_stmt := 'INSERT INTO x_audit_config (id, create_time, update_time, cfg_name, cfg_value, version) VALUES (X_AUDIT_CONFIG_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
-        EXECUTE IMMEDIATE sql_stmt USING 'topic', 'ranger_audits';
-        COMMIT;
-    END IF;
-    SELECT count(*) INTO v_cfg_count FROM x_audit_config WHERE cfg_name = 'RangerAuditPartitionPlan';
-    IF (v_cfg_count = 0) THEN
-        sql_stmt := 'INSERT INTO x_audit_config (id, create_time, update_time, cfg_name, cfg_value, version) VALUES (X_AUDIT_CONFIG_SEQ.nextval, sys_extract_utc(systimestamp), sys_extract_utc(systimestamp), :1, :2, 1)';
-        EXECUTE IMMEDIATE sql_stmt USING 'RangerAuditPartitionPlan', v_plan_json;
-        COMMIT;
-    END IF;
-END;
-/
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 4d33ad77f..f937f1bde 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
@@ -2132,8 +2132,7 @@ INSERT INTO x_ranger_global_state (create_time,update_time,added_by_id,upd_by_id
 
 INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (current_timestamp,current_timestamp,'ingestor.url','https://ranger-audit-ingestor:8765',1);
 INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (current_timestamp,current_timestamp,'service.hive.allowed.users','hive',1);
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (current_timestamp,current_timestamp,'topic','ranger_audits',1);
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (current_timestamp,current_timestamp,'RangerAuditPartitionPlan','{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
+INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (current_timestamp,current_timestamp,'audit.partition.plan','{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
 
 INSERT INTO x_db_version_h (version,inst_at,inst_by,updated_at,updated_by,active) VALUES ('J10001',current_timestamp,'Ranger 1.0.0',current_timestamp,'localhost','Y');
 INSERT INTO x_db_version_h (version,inst_at,inst_by,updated_at,updated_by,active) VALUES ('J10002',current_timestamp,'Ranger 1.0.0',current_timestamp,'localhost','Y');
diff --git a/security-admin/db/postgres/patches/078-audit-partition-plan-global-state.sql b/security-admin/db/postgres/patches/078-add-x_audit_config.sql
similarity index 89%
rename from security-admin/db/postgres/patches/078-audit-partition-plan-global-state.sql
rename to security-admin/db/postgres/patches/078-add-x_audit_config.sql
index 743630133..da5344d96 100644
--- a/security-admin/db/postgres/patches/078-audit-partition-plan-global-state.sql
+++ b/security-admin/db/postgres/patches/078-add-x_audit_config.sql
@@ -64,13 +64,9 @@ BEGIN
         INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
         VALUES (current_timestamp, current_timestamp, 'service.hive.allowed.users', 'hive', 1);
     END IF;
-    IF NOT EXISTS (SELECT 1 FROM x_audit_config WHERE cfg_name = 'topic') THEN
+    IF NOT EXISTS (SELECT 1 FROM x_audit_config WHERE cfg_name = 'audit.partition.plan') THEN
         INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
-        VALUES (current_timestamp, current_timestamp, 'topic', 'ranger_audits', 1);
-    END IF;
-    IF NOT EXISTS (SELECT 1 FROM x_audit_config WHERE cfg_name = 'RangerAuditPartitionPlan') THEN
-        INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
-        VALUES (current_timestamp, current_timestamp, 'RangerAuditPartitionPlan', '{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
+        VALUES (current_timestamp, current_timestamp, 'audit.partition.plan', '{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
     END IF;
 END;
 $$ LANGUAGE plpgsql;
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 fe968c4da..2ffacc47a 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
@@ -2315,9 +2315,7 @@ INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version)
 GO
 INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'service.hive.allowed.users','hive',1);
 GO
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'topic','ranger_audits',1);
-GO
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'RangerAuditPartitionPlan','{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
+INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'audit.partition.plan','{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
 GO
 INSERT INTO x_db_version_h (version,inst_at,inst_by,updated_at,updated_by,active) VALUES ('J10001',CURRENT_TIMESTAMP,'Ranger 1.0.0',CURRENT_TIMESTAMP,'localhost','Y');
 GO
diff --git a/security-admin/db/sqlanywhere/patches/078-audit-partition-plan-global-state.sql b/security-admin/db/sqlanywhere/patches/078-add-x_audit_config.sql
similarity index 89%
rename from security-admin/db/sqlanywhere/patches/078-audit-partition-plan-global-state.sql
rename to security-admin/db/sqlanywhere/patches/078-add-x_audit_config.sql
index dc37c9aa7..c497b79e9 100644
--- a/security-admin/db/sqlanywhere/patches/078-audit-partition-plan-global-state.sql
+++ b/security-admin/db/sqlanywhere/patches/078-add-x_audit_config.sql
@@ -63,13 +63,9 @@ BEGIN
         INSERT INTO x_audit_config(create_time, update_time, cfg_name, cfg_value, version)
         VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'service.hive.allowed.users', 'hive', 1);
     END IF;
-    IF NOT EXISTS(SELECT * FROM x_audit_config WHERE cfg_name = 'topic') THEN
+    IF NOT EXISTS(SELECT * FROM x_audit_config WHERE cfg_name = 'audit.partition.plan') THEN
         INSERT INTO x_audit_config(create_time, update_time, cfg_name, cfg_value, version)
-        VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'topic', 'ranger_audits', 1);
-    END IF;
-    IF NOT EXISTS(SELECT * FROM x_audit_config WHERE cfg_name = 'RangerAuditPartitionPlan') THEN
-        INSERT INTO x_audit_config(create_time, update_time, cfg_name, cfg_value, version)
-        VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'RangerAuditPartitionPlan', '{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
+        VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'audit.partition.plan', '{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
     END IF;
 END
 GO
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 f590573b2..bbc9a4956 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
@@ -4572,8 +4572,7 @@ INSERT INTO x_ranger_global_state (create_time,update_time,added_by_id,upd_by_id
 
 INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'ingestor.url',N'https://ranger-audit-ingestor:8765',1);
 INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'service.hive.allowed.users',N'hive',1);
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'topic',N'ranger_audits',1);
-INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'RangerAuditPartitionPlan',N'{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
+INSERT INTO x_audit_config (create_time,update_time,cfg_name,cfg_value,version) VALUES (CURRENT_TIMESTAMP,CURRENT_TIMESTAMP,'audit.partition.plan',N'{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}',1);
 
 INSERT INTO x_db_version_h (version,inst_at,inst_by,updated_at,updated_by,active) VALUES ('J10001',CURRENT_TIMESTAMP,'Ranger 1.0.0',CURRENT_TIMESTAMP,'localhost','Y');
 INSERT INTO x_db_version_h (version,inst_at,inst_by,updated_at,updated_by,active) VALUES ('J10002',CURRENT_TIMESTAMP,'Ranger 1.0.0',CURRENT_TIMESTAMP,'localhost','Y');
diff --git a/security-admin/db/sqlserver/patches/078-audit-partition-plan-global-state.sql b/security-admin/db/sqlserver/patches/078-add-x_audit_config.sql
similarity index 89%
rename from security-admin/db/sqlserver/patches/078-audit-partition-plan-global-state.sql
rename to security-admin/db/sqlserver/patches/078-add-x_audit_config.sql
index 834d6e07d..2d5b978d5 100644
--- a/security-admin/db/sqlserver/patches/078-audit-partition-plan-global-state.sql
+++ b/security-admin/db/sqlserver/patches/078-add-x_audit_config.sql
@@ -83,16 +83,10 @@ BEGIN
     VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'service.hive.allowed.users', N'hive', 1);
 END;
 GO
-IF NOT EXISTS(SELECT * FROM x_audit_config WHERE cfg_name = 'topic')
+IF NOT EXISTS(SELECT * FROM x_audit_config WHERE cfg_name = 'audit.partition.plan')
 BEGIN
     INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
-    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'topic', N'ranger_audits', 1);
-END;
-GO
-IF NOT EXISTS(SELECT * FROM x_audit_config WHERE cfg_name = 'RangerAuditPartitionPlan')
-BEGIN
-    INSERT INTO x_audit_config (create_time, update_time, cfg_name, cfg_value, version)
-    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'RangerAuditPartitionPlan', N'{"plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
+    VALUES (CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, 'audit.partition.plan', N'{"topic":"ranger_audits","plugins":{},"buffer":{"partitions":[1,2,3,4,5,6,7,8,9]}}', 1);
 END;
 GO
 EXIT