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 6126379d4 [KYUUBI #5457] [AUTHZ] Support RepairTable Commands for Hudi
6126379d4 is described below
commit 6126379d464322bc95994fe7e6f3a9426dc17ae7
Author: Angerszhuuuu <[email protected]>
AuthorDate: Wed Oct 18 21:16:08 2023 +0800
[KYUUBI #5457] [AUTHZ] Support RepairTable Commands for Hudi
### _Why are the changes needed?_
To close #5457. Kyuubi authz support hudi repair table commands
- RepairHoodieTableCommand:
https://github.com/apache/hudi/blob/master/hudi-spark-datasource/hudi-spark-common/src/main/scala/org/apache/spark/sql/hudi/command/RepairHoodieTableCommand.scala
### _How was this patch tested?_
- [x] Add some test cases that check the changes thoroughly including
negative and positive cases if possible
- [ ] Add screenshots for manual tests if appropriate
- [ ] [Run
test](https://kyuubi.readthedocs.io/en/master/contributing/code/testing.html#running-tests)
locally before make a pull request
### _Was this patch authored or co-authored using generative AI tooling?_
No
Closes #5458 from AngersZhuuuu/KYUUBI-5457.
Closes #5457
7dcb932ff [Angerszhuuuu] Merge branch 'master' into KYUUBI-5457
85c209fa9 [Angerszhuuuu] Update HudiCatalogRangerSparkExtensionSuite.scala
4319763df [Angerszhuuuu] [KYUUBI #5457] [AUTHZ] Support RepairTable
Commands for Hudi
Authored-by: Angerszhuuuu <[email protected]>
Signed-off-by: Cheng Pan <[email protected]>
---
.../src/main/resources/table_command_spec.json | 14 ++++++++
.../plugin/spark/authz/gen/HudiCommands.scala | 6 ++++
.../HudiCatalogRangerSparkExtensionSuite.scala | 37 +++++++++++++++++++---
3 files changed, 53 insertions(+), 4 deletions(-)
diff --git
a/extensions/spark/kyuubi-spark-authz/src/main/resources/table_command_spec.json
b/extensions/spark/kyuubi-spark-authz/src/main/resources/table_command_spec.json
index 21d647f5d..87831119e 100644
---
a/extensions/spark/kyuubi-spark-authz/src/main/resources/table_command_spec.json
+++
b/extensions/spark/kyuubi-spark-authz/src/main/resources/table_command_spec.json
@@ -1622,6 +1622,20 @@
} ],
"opType" : "DROPTABLE",
"queryDescs" : [ ]
+}, {
+ "classname" : "org.apache.spark.sql.hudi.command.RepairHoodieTableCommand",
+ "tableDescs" : [ {
+ "fieldName" : "tableName",
+ "fieldExtractor" : "TableIdentifierTableExtractor",
+ "columnDesc" : null,
+ "actionTypeDesc" : null,
+ "tableTypeDesc" : null,
+ "catalogDesc" : null,
+ "isInput" : false,
+ "setCurrentDatabaseIfMissing" : false
+ } ],
+ "opType" : "MSCK",
+ "queryDescs" : [ ]
}, {
"classname" : "org.apache.spark.sql.hudi.command.Spark31AlterTableCommand",
"tableDescs" : [ {
diff --git
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/gen/HudiCommands.scala
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/gen/HudiCommands.scala
index 72daa89e2..3abac4a88 100644
---
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/gen/HudiCommands.scala
+++
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/gen/HudiCommands.scala
@@ -116,6 +116,11 @@ object HudiCommands {
DROPTABLE)
}
+ val RepairHoodieTableCommand = {
+ val cmd = "org.apache.spark.sql.hudi.command.RepairHoodieTableCommand"
+ TableCommandSpec(cmd, Seq(TableDesc("tableName",
classOf[TableIdentifierTableExtractor])), MSCK)
+ }
+
val TruncateHoodieTableCommand = {
val cmd = "org.apache.spark.sql.hudi.command.TruncateHoodieTableCommand"
val columnDesc = ColumnDesc("partitionSpec",
classOf[PartitionOptionColumnExtractor])
@@ -151,6 +156,7 @@ object HudiCommands {
CompactionHoodieTableCommand,
CompactionShowHoodieTableCommand,
DropHoodieTableCommand,
+ RepairHoodieTableCommand,
TruncateHoodieTableCommand,
Spark31AlterTableCommand)
}
diff --git
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/HudiCatalogRangerSparkExtensionSuite.scala
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/HudiCatalogRangerSparkExtensionSuite.scala
index 48af6bf9f..7d15709f8 100644
---
a/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/HudiCatalogRangerSparkExtensionSuite.scala
+++
b/extensions/spark/kyuubi-spark-authz/src/test/scala/org/apache/kyuubi/plugin/spark/authz/ranger/HudiCatalogRangerSparkExtensionSuite.scala
@@ -123,10 +123,14 @@ class HudiCatalogRangerSparkExtensionSuite extends
RangerSparkExtensionSuite {
s" on [$namespace1/$table1]")
// AlterTableCommand && Spark31AlterTableCommand
- sql("set hoodie.schema.on.read.enable=true")
- interceptContains[AccessControlException](
- doAs(someone, sql(s"ALTER TABLE $namespace1.$table1 ADD COLUMNS(age
int)")))(
- s"does not have [alter] privilege on [$namespace1/$table1]")
+ try {
+ sql("set hoodie.schema.on.read.enable=true")
+ interceptContains[AccessControlException](
+ doAs(someone, sql(s"ALTER TABLE $namespace1.$table1 ADD COLUMNS(age
int)")))(
+ s"does not have [alter] privilege on [$namespace1/$table1]")
+ } finally {
+ sql("set hoodie.schema.on.read.enable=false")
+ }
}
}
@@ -240,6 +244,31 @@ class HudiCatalogRangerSparkExtensionSuite extends
RangerSparkExtensionSuite {
}
}
+ test("RepairHoodieTableCommand") {
+ withCleanTmpResources(Seq((s"$namespace1.$table1", "table"), (namespace1,
"database"))) {
+ doAs(admin, sql(s"CREATE DATABASE IF NOT EXISTS $namespace1"))
+ doAs(
+ admin,
+ sql(
+ s"""
+ |CREATE TABLE IF NOT EXISTS $namespace1.$table1(id int, name
string, city string)
+ |USING HUDI
+ |OPTIONS (
+ | type = 'cow',
+ | primaryKey = 'id',
+ | 'hoodie.datasource.hive_sync.enable' = 'false'
+ |)
+ |PARTITIONED BY(city)
+ |""".stripMargin))
+
+ val repairTableSql = s"MSCK REPAIR TABLE $namespace1.$table1"
+ interceptContains[AccessControlException] {
+ doAs(someone, sql(repairTableSql))
+ }(s"does not have [alter] privilege on [$namespace1/$table1]")
+ doAs(admin, sql(repairTableSql))
+ }
+ }
+
test("TruncateHoodieTableCommand") {
withCleanTmpResources(Seq((s"$namespace1.$table1", "table"), (namespace1,
"database"))) {
doAs(admin, sql(s"CREATE DATABASE IF NOT EXISTS $namespace1"))