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"))

Reply via email to