This is an automated email from the ASF dual-hosted git repository.
chengpan pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kyuubi.git
The following commit(s) were added to refs/heads/master by this push:
new 1b3de28b2c [KYUUBI #6958] Test INSERT TABLE
1b3de28b2c is described below
commit 1b3de28b2cccb0b25643f2bee7aead36601e8bf8
Author: davidyuan <[email protected]>
AuthorDate: Thu Mar 6 22:35:48 2025 +0800
[KYUUBI #6958] Test INSERT TABLE
### Why are the changes needed?
Currently , ranger check missing paimon insert table command, add test cases
#6958
### How was this patch tested?
1. Test INSERT INTO:
1.1 table1OnlyUserForNs could select table1, try to insert table1
1.2 someone has no any permission, try to insert table1
2. Test INSERT OVERWRITE:
2.1 table1OnlyUserForNs could select table1, try to insert table2
2.2 someone has no any permiession, try select table1 then insert table2
### Was this patch authored or co-authored using generative AI tooling?
No
Closes #6959 from davidyuan1223/test_insert.
Closes #6958
d1f41ba81 [davidyuan] Merge branch 'master' into test_insert
b56e701d4 [davidyuan] Test Insert Table
8306210ee [davidyuan] update
Authored-by: davidyuan <[email protected]>
Signed-off-by: Cheng Pan <[email protected]>
---
.../spark/authz/gen/PolicyJsonFileGenerator.scala | 13 +++++
.../src/test/resources/sparkSql_hive_jenkins.json | 66 +++++++++++++++++-----
.../plugin/spark/authz/RangerTestResources.scala | 1 +
.../PaimonCatalogRangerSparkExtensionSuite.scala | 57 +++++++++++++++++++
4 files changed, 122 insertions(+), 15 deletions(-)
diff --git
a/extensions/spark/kyuubi-spark-authz/src/test/gen/scala/org/apache/kyuubi/plugin/spark/authz/gen/PolicyJsonFileGenerator.scala
b/extensions/spark/kyuubi-spark-authz/src/test/gen/scala/org/apache/kyuubi/plugin/spark/authz/gen/PolicyJsonFileGenerator.scala
index 079def2b9f..edff7d8a07 100644
---
a/extensions/spark/kyuubi-spark-authz/src/test/gen/scala/org/apache/kyuubi/plugin/spark/authz/gen/PolicyJsonFileGenerator.scala
+++
b/extensions/spark/kyuubi-spark-authz/src/test/gen/scala/org/apache/kyuubi/plugin/spark/authz/gen/PolicyJsonFileGenerator.scala
@@ -109,6 +109,7 @@ class PolicyJsonFileGenerator extends AnyFunSuite {
policyAccessForDefaultBobSelect,
policyAccessForPermViewAccessOnly,
policyAccessForTable2AccessOnly,
+ policyAccessForPaimonNsTable1SelectOnly,
// row filter
policyFilterForSrcTableKeyLessThan20,
policyFilterForPermViewKeyLessThan20,
@@ -358,4 +359,16 @@ class PolicyJsonFileGenerator extends AnyFunSuite {
users = List(table2OnlyUser),
accesses = allowTypes(select),
delegateAdmin = true)))
+
+ private val policyAccessForPaimonNsTable1SelectOnly = KRangerPolicy(
+ name = "someone_access_table1_in_ns",
+ resources = Map(
+ databaseRes(icebergNamespace, hudiNamespace, paimonNamespace,
deltaNamespace),
+ tableRes("table1"),
+ allColumnRes),
+ policyItems = List(
+ KRangerPolicyItem(
+ users = List(table1OnlyUserForNs),
+ accesses = allowTypes(select),
+ delegateAdmin = true)))
}
diff --git
a/extensions/spark/kyuubi-spark-authz/src/test/resources/sparkSql_hive_jenkins.json
b/extensions/spark/kyuubi-spark-authz/src/test/resources/sparkSql_hive_jenkins.json
index 07ceb55805..16bdd5087a 100644
---
a/extensions/spark/kyuubi-spark-authz/src/test/resources/sparkSql_hive_jenkins.json
+++
b/extensions/spark/kyuubi-spark-authz/src/test/resources/sparkSql_hive_jenkins.json
@@ -474,6 +474,42 @@
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
+ "name" : "someone_access_table1_in_ns",
+ "policyType" : 0,
+ "policyPriority" : 0,
+ "isAuditEnabled" : true,
+ "resources" : {
+ "column" : {
+ "values" : [ "*" ],
+ "isExcludes" : false,
+ "isRecursive" : false
+ },
+ "database" : {
+ "values" : [ "iceberg_ns", "hudi_ns", "paimon_ns", "delta_ns" ],
+ "isExcludes" : false,
+ "isRecursive" : false
+ },
+ "table" : {
+ "values" : [ "table1" ],
+ "isExcludes" : false,
+ "isRecursive" : false
+ }
+ },
+ "policyItems" : [ {
+ "accesses" : [ {
+ "type" : "select",
+ "isAllowed" : true
+ } ],
+ "users" : [ "user_table1_only_for_ns" ],
+ "delegateAdmin" : true
+ } ],
+ "isDenyAllElse" : false
+ }, {
+ "id" : 10,
+ "guid" : "d3d94468-02a4-3259-b55d-38e6d163e820",
+ "isEnabled" : true,
+ "version" : 1,
+ "service" : "hive_jenkins",
"name" : "src_key_less_than_20",
"policyType" : 2,
"policyPriority" : 0,
@@ -503,8 +539,8 @@
} ],
"isDenyAllElse" : false
}, {
- "id" : 10,
- "guid" : "d3d94468-02a4-3259-b55d-38e6d163e820",
+ "id" : 11,
+ "guid" : "6512bd43-d9ca-36e0-ac99-0b0a82652dca",
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
@@ -537,8 +573,8 @@
} ],
"isDenyAllElse" : false
}, {
- "id" : 11,
- "guid" : "6512bd43-d9ca-36e0-ac99-0b0a82652dca",
+ "id" : 12,
+ "guid" : "c20ad4d7-6fe9-3759-aa27-a0c99bff6710",
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
@@ -576,8 +612,8 @@
} ],
"isDenyAllElse" : false
}, {
- "id" : 12,
- "guid" : "c20ad4d7-6fe9-3759-aa27-a0c99bff6710",
+ "id" : 13,
+ "guid" : "c51ce410-c124-310e-8db5-e4b97fc2af39",
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
@@ -615,8 +651,8 @@
} ],
"isDenyAllElse" : false
}, {
- "id" : 13,
- "guid" : "c51ce410-c124-310e-8db5-e4b97fc2af39",
+ "id" : 14,
+ "guid" : "aab32389-22bc-325a-af60-6eb525ffdc56",
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
@@ -654,8 +690,8 @@
} ],
"isDenyAllElse" : false
}, {
- "id" : 14,
- "guid" : "aab32389-22bc-325a-af60-6eb525ffdc56",
+ "id" : 15,
+ "guid" : "9bf31c7f-f062-336a-96d3-c8bd1f8f2ff3",
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
@@ -693,8 +729,8 @@
} ],
"isDenyAllElse" : false
}, {
- "id" : 15,
- "guid" : "9bf31c7f-f062-336a-96d3-c8bd1f8f2ff3",
+ "id" : 16,
+ "guid" : "c74d97b0-1eae-357e-84aa-9d5bade97baf",
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
@@ -732,8 +768,8 @@
} ],
"isDenyAllElse" : false
}, {
- "id" : 16,
- "guid" : "c74d97b0-1eae-357e-84aa-9d5bade97baf",
+ "id" : 17,
+ "guid" : "70efdf2e-c9b0-3607-9795-c442636b55fb",
"isEnabled" : true,
"version" : 1,
"service" : "hive_jenkins",
@@ -1176,4 +1212,4 @@
"version" : 1
},
"auditMode" : "audit-default"
-}
+}
\ No newline at end of file
diff --git
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/RangerTestResources.scala
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/RangerTestResources.scala
index c2ed9aa0bc..895aa923f5 100644
---
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/RangerTestResources.scala
+++
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/RangerTestResources.scala
@@ -29,6 +29,7 @@ object RangerTestUsers {
val defaultTableOwner = "default_table_owner"
val permViewOnlyUser = "user_perm_view_only"
val table2OnlyUser = "user_table2_only"
+ val table1OnlyUserForNs = "user_table1_only_for_ns"
// non-authorized users
val invisibleUser = "i_am_invisible"
diff --git
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/PaimonCatalogRangerSparkExtensionSuite.scala
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/PaimonCatalogRangerSparkExtensionSuite.scala
index dab3d33db9..4f8da3bc22 100644
---
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/PaimonCatalogRangerSparkExtensionSuite.scala
+++
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/PaimonCatalogRangerSparkExtensionSuite.scala
@@ -299,6 +299,63 @@ class PaimonCatalogRangerSparkExtensionSuite extends
RangerSparkExtensionSuite {
}
}
+ test("INSERT INTO") {
+ withCleanTmpResources(Seq(
+ (s"$catalogV2.$namespace1.$table1", "table"))) {
+ val createTable = createTableSql(namespace1, table1)
+ doAs(admin, sql(createTable))
+ val insertSql =
+ s"""
+ |INSERT INTO $catalogV2.$namespace1.$table1 VALUES
+ |(1, "a"), (2, "b");
+ |""".stripMargin
+ // Test user have select permission to insert
+ doAs(table1OnlyUserForNs, sql(s"SELECT * FROM
$catalogV2.$namespace1.$table1"))
+ interceptEndsWith[AccessControlException] {
+ doAs(table1OnlyUserForNs, sql(insertSql))
+ }(s"does not have [update] privilege on [$namespace1/$table1]")
+
+ // Test user have not any permission to insert
+ interceptEndsWith[AccessControlException] {
+ doAs(someone, sql(insertSql))
+ }(s"does not have [update] privilege on [$namespace1/$table1]")
+
+ doAs(admin, sql(insertSql))
+ }
+ }
+
+ test("INSERT OVERWRITE") {
+ val table2 = "table2"
+ withCleanTmpResources(Seq(
+ (s"$catalogV2.$namespace1.$table1", "table"),
+ (s"$catalogV2.$namespace1.$table2", "table"))) {
+ val createTable1 = createTableSql(namespace1, table1)
+ val createTable2 = createTableSql(namespace1, table2)
+ doAs(admin, sql(createTable1))
+ doAs(admin, sql(createTable2))
+
+ doAs(admin, sql(s"INSERT INTO $catalogV2.$namespace1.$table1 VALUES (1,
'a'), (2, 'b')"))
+
+ val insertOverwriteSql =
+ s"""
+ |INSERT OVERWRITE $catalogV2.$namespace1.$table2
+ |SELECT * FROM $catalogV2.$namespace1.$table1
+ |""".stripMargin
+ // Test user has select table1 permission to insert
+ doAs(table1OnlyUserForNs, sql(s"SELECT * FROM
$catalogV2.$namespace1.$table1"))
+ interceptEndsWith[AccessControlException] {
+ doAs(table1OnlyUserForNs, sql(insertOverwriteSql))
+ }(s"does not have [update] privilege on [$namespace1/$table2]")
+
+ // Test user has not any permission to insert
+ interceptEndsWith[AccessControlException] {
+ doAs(someone, sql(insertOverwriteSql))
+ }(s"does not have [select] privilege on [$namespace1/$table1/id]")
+
+ doAs(admin, sql(insertOverwriteSql))
+ }
+ }
+
def createTableSql(namespace: String, table: String): String =
s"""
|CREATE TABLE IF NOT EXISTS $catalogV2.$namespace.$table