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

jmclean pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/gravitino.git


The following commit(s) were added to refs/heads/main by this push:
     new eb3b6db63 [#5477] improvement(cli): display audit information on 
Catalog, Schema, Table (#5509)
eb3b6db63 is described below

commit eb3b6db63ae548e4b8ffeba5e6e7edb868f27b72
Author: JUN <oren....@gmail.com>
AuthorDate: Fri Nov 8 13:47:27 2024 +0800

    [#5477] improvement(cli): display audit information on Catalog, Schema, 
Table (#5509)
    
    ### What changes were proposed in this pull request?
    
    Add the `--audit` option to display audit information on Catalog,
    Schema, Table
    
    ### Why are the changes needed?
    
    This change allows users to retrieve additional audit information on
    Catalog/Schema/Table, providing more insights.
    
    Close: #5477
    
    ### Does this PR introduce _any_ user-facing change?
    
    Yes, it adds the `--audit` option to
    `CommandEntities.CATALOG/SCHEMA/TABLE`.
    
    ### How was this patch tested?
    
    1. Follow the instructions in the [cli
    README](https://github.com/apache/gravitino/tree/main/clients/cli) to
    build the CLI sub-project.
    2. Start the Gravitino Playground.
    
    To test, use a command like the following:
    
    ```
    gcli metalake details --metalake metalake_demo --audit
    gcli catalog details --metalake metalake_demo --name catalog_postgres 
--audit
    gcli schema details --metalake metalake_demo --name catalog_postgres.hr 
--audit
    gcli table details --metalake metalake_demo --name 
catalog_postgres.hr.departments --audit
    ```
    
    Check that the output matches the expected audit information.
    
    ![2024-11-08
    
002032](https://github.com/user-attachments/assets/636e9abf-fdf3-46f0-9e03-d3b485a06de9)
---
 .../apache/gravitino/cli/GravitinoCommandLine.java | 25 ++++++++--
 .../{MetalakeAuditInfo.java => AuditCommand.java}  | 36 ++++----------
 .../{MetalakeAuditInfo.java => CatalogAudit.java}  | 39 +++++++--------
 .../{MetalakeAuditInfo.java => MetalakeAudit.java} | 17 ++-----
 .../{TableCommand.java => SchemaAudit.java}        | 41 +++++++--------
 .../{MetalakeAuditInfo.java => TableAudit.java}    | 58 +++++++++++-----------
 .../gravitino/cli/commands/TableCommand.java       |  2 +-
 docs/cli.md                                        | 25 ++++++++++
 8 files changed, 128 insertions(+), 115 deletions(-)

diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
index 566ff88e9..d14ec4755 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java
@@ -23,6 +23,7 @@ import java.util.Map;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Options;
+import org.apache.gravitino.cli.commands.CatalogAudit;
 import org.apache.gravitino.cli.commands.CatalogDetails;
 import org.apache.gravitino.cli.commands.ClientVersion;
 import org.apache.gravitino.cli.commands.CreateCatalog;
@@ -47,16 +48,18 @@ import org.apache.gravitino.cli.commands.ListSchema;
 import org.apache.gravitino.cli.commands.ListSchemaProperties;
 import org.apache.gravitino.cli.commands.ListTables;
 import org.apache.gravitino.cli.commands.ListUsers;
-import org.apache.gravitino.cli.commands.MetalakeAuditInfo;
+import org.apache.gravitino.cli.commands.MetalakeAudit;
 import org.apache.gravitino.cli.commands.MetalakeDetails;
 import org.apache.gravitino.cli.commands.RemoveCatalogProperty;
 import org.apache.gravitino.cli.commands.RemoveMetalakeProperty;
 import org.apache.gravitino.cli.commands.RemoveSchemaProperty;
+import org.apache.gravitino.cli.commands.SchemaAudit;
 import org.apache.gravitino.cli.commands.SchemaDetails;
 import org.apache.gravitino.cli.commands.ServerVersion;
 import org.apache.gravitino.cli.commands.SetCatalogProperty;
 import org.apache.gravitino.cli.commands.SetMetalakeProperty;
 import org.apache.gravitino.cli.commands.SetSchemaProperty;
+import org.apache.gravitino.cli.commands.TableAudit;
 import org.apache.gravitino.cli.commands.TableDetails;
 import org.apache.gravitino.cli.commands.UpdateCatalogComment;
 import org.apache.gravitino.cli.commands.UpdateCatalogName;
@@ -177,7 +180,7 @@ public class GravitinoCommandLine {
 
     if (CommandActions.DETAILS.equals(command)) {
       if (line.hasOption(GravitinoOptions.AUDIT)) {
-        new MetalakeAuditInfo(url, ignore, metalake).handle();
+        new MetalakeAudit(url, ignore, metalake).handle();
       } else {
         new MetalakeDetails(url, ignore, metalake).handle();
       }
@@ -225,7 +228,11 @@ public class GravitinoCommandLine {
     String catalog = name.getCatalogName();
 
     if (CommandActions.DETAILS.equals(command)) {
-      new CatalogDetails(url, ignore, metalake, catalog).handle();
+      if (line.hasOption(GravitinoOptions.AUDIT)) {
+        new CatalogAudit(url, ignore, metalake, catalog).handle();
+      } else {
+        new CatalogDetails(url, ignore, metalake, catalog).handle();
+      }
     } else if (CommandActions.CREATE.equals(command)) {
       String comment = line.getOptionValue(GravitinoOptions.COMMENT);
       String provider = line.getOptionValue(GravitinoOptions.PROVIDER);
@@ -272,7 +279,11 @@ public class GravitinoCommandLine {
     String schema = name.getSchemaName();
 
     if (CommandActions.DETAILS.equals(command)) {
-      new SchemaDetails(url, ignore, metalake, catalog, schema).handle();
+      if (line.hasOption(GravitinoOptions.AUDIT)) {
+        new SchemaAudit(url, ignore, metalake, catalog, schema).handle();
+      } else {
+        new SchemaDetails(url, ignore, metalake, catalog, schema).handle();
+      }
     } else if (CommandActions.CREATE.equals(command)) {
       String comment = line.getOptionValue(GravitinoOptions.COMMENT);
       new CreateSchema(url, ignore, metalake, catalog, schema, 
comment).handle();
@@ -308,7 +319,11 @@ public class GravitinoCommandLine {
     String table = name.getTableName();
 
     if (CommandActions.DETAILS.equals(command)) {
-      new TableDetails(url, ignore, metalake, catalog, schema, table).handle();
+      if (line.hasOption(GravitinoOptions.AUDIT)) {
+        new TableAudit(url, ignore, metalake, catalog, schema, table).handle();
+      } else {
+        new TableDetails(url, ignore, metalake, catalog, schema, 
table).handle();
+      }
     } else if (CommandActions.CREATE.equals(command)) {
       // TODO
     } else if (CommandActions.DELETE.equals(command)) {
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
 b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AuditCommand.java
similarity index 58%
copy from 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
copy to 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/AuditCommand.java
index de3807839..09eee3478 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AuditCommand.java
@@ -20,42 +20,28 @@
 package org.apache.gravitino.cli.commands;
 
 import org.apache.gravitino.Audit;
-import org.apache.gravitino.cli.ErrorMessages;
-import org.apache.gravitino.client.GravitinoClient;
-import org.apache.gravitino.exceptions.NoSuchMetalakeException;
-
-/** Displays the audit information of a metalake. */
-public class MetalakeAuditInfo extends Command {
-  protected final String metalake;
 
+public abstract class AuditCommand extends Command {
   /**
-   * Displays metalake audit information.
-   *
    * @param url The URL of the Gravitino server.
    * @param ignoreVersions If true don't check the client/server versions 
match.
-   * @param metalake The name of the metalake.
    */
-  public MetalakeAuditInfo(String url, boolean ignoreVersions, String 
metalake) {
+  public AuditCommand(String url, boolean ignoreVersions) {
     super(url, ignoreVersions);
-    this.metalake = metalake;
   }
 
-  /** Displays the audit information of a metalake. */
+  /* Overridden in parent - do nothing  */
   @Override
-  public void handle() {
-    Audit audit;
-    try (GravitinoClient client = buildClient(metalake)) {
-      audit = client.loadMetalake(metalake).auditInfo();
-    } catch (NoSuchMetalakeException err) {
-      System.err.println(ErrorMessages.UNKNOWN_METALAKE);
-      return;
-    } catch (Exception exp) {
-      System.err.println(exp.getMessage());
-      return;
-    }
+  public void handle() {}
 
+  /**
+   * Displays audit information for the given audit object.
+   *
+   * @param audit from a class that implements the Auditable interface.
+   */
+  public void displayAuditInfo(Audit audit) {
     String auditInfo =
-        "creator,createTime,lastModifier,lastModifiedTime"
+        "creator,create_time,modified,modified_time"
             + System.lineSeparator()
             + audit.creator()
             + ","
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
 b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogAudit.java
similarity index 68%
copy from 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
copy to 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogAudit.java
index de3807839..588d8bf42 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogAudit.java
@@ -19,52 +19,51 @@
 
 package org.apache.gravitino.cli.commands;
 
-import org.apache.gravitino.Audit;
+import org.apache.gravitino.Catalog;
 import org.apache.gravitino.cli.ErrorMessages;
 import org.apache.gravitino.client.GravitinoClient;
+import org.apache.gravitino.exceptions.NoSuchCatalogException;
 import org.apache.gravitino.exceptions.NoSuchMetalakeException;
 
-/** Displays the audit information of a metalake. */
-public class MetalakeAuditInfo extends Command {
+public class CatalogAudit extends AuditCommand {
+
   protected final String metalake;
+  protected final String catalog;
 
   /**
-   * Displays metalake audit information.
+   * Displays the audit information of a catalog.
    *
    * @param url The URL of the Gravitino server.
    * @param ignoreVersions If true don't check the client/server versions 
match.
    * @param metalake The name of the metalake.
+   * @param catalog The name of the catalog.
    */
-  public MetalakeAuditInfo(String url, boolean ignoreVersions, String 
metalake) {
+  public CatalogAudit(String url, boolean ignoreVersions, String metalake, 
String catalog) {
     super(url, ignoreVersions);
     this.metalake = metalake;
+    this.catalog = catalog;
   }
 
-  /** Displays the audit information of a metalake. */
+  /** Displays the audit information of a specified catalog. */
   @Override
   public void handle() {
-    Audit audit;
+    Catalog result;
+
     try (GravitinoClient client = buildClient(metalake)) {
-      audit = client.loadMetalake(metalake).auditInfo();
+      result = client.loadCatalog(this.catalog);
     } catch (NoSuchMetalakeException err) {
       System.err.println(ErrorMessages.UNKNOWN_METALAKE);
       return;
+    } catch (NoSuchCatalogException err) {
+      System.err.println(ErrorMessages.UNKNOWN_CATALOG);
+      return;
     } catch (Exception exp) {
       System.err.println(exp.getMessage());
       return;
     }
 
-    String auditInfo =
-        "creator,createTime,lastModifier,lastModifiedTime"
-            + System.lineSeparator()
-            + audit.creator()
-            + ","
-            + audit.createTime()
-            + ","
-            + audit.lastModifier()
-            + ","
-            + audit.lastModifiedTime();
-
-    System.out.println(auditInfo);
+    if (result != null) {
+      displayAuditInfo(result.auditInfo());
+    }
   }
 }
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAudit.java
similarity index 79%
copy from 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
copy to 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAudit.java
index de3807839..2e4b7c326 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAudit.java
@@ -25,7 +25,7 @@ import org.apache.gravitino.client.GravitinoClient;
 import org.apache.gravitino.exceptions.NoSuchMetalakeException;
 
 /** Displays the audit information of a metalake. */
-public class MetalakeAuditInfo extends Command {
+public class MetalakeAudit extends AuditCommand {
   protected final String metalake;
 
   /**
@@ -35,7 +35,7 @@ public class MetalakeAuditInfo extends Command {
    * @param ignoreVersions If true don't check the client/server versions 
match.
    * @param metalake The name of the metalake.
    */
-  public MetalakeAuditInfo(String url, boolean ignoreVersions, String 
metalake) {
+  public MetalakeAudit(String url, boolean ignoreVersions, String metalake) {
     super(url, ignoreVersions);
     this.metalake = metalake;
   }
@@ -54,17 +54,6 @@ public class MetalakeAuditInfo extends Command {
       return;
     }
 
-    String auditInfo =
-        "creator,createTime,lastModifier,lastModifiedTime"
-            + System.lineSeparator()
-            + audit.creator()
-            + ","
-            + audit.createTime()
-            + ","
-            + audit.lastModifier()
-            + ","
-            + audit.lastModifiedTime();
-
-    System.out.println(auditInfo);
+    displayAuditInfo(audit);
   }
 }
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaAudit.java
similarity index 70%
copy from 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java
copy to 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaAudit.java
index a292a2f5b..b34ab36cf 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaAudit.java
@@ -19,59 +19,60 @@
 
 package org.apache.gravitino.cli.commands;
 
+import org.apache.gravitino.Schema;
 import org.apache.gravitino.cli.ErrorMessages;
 import org.apache.gravitino.client.GravitinoClient;
 import org.apache.gravitino.exceptions.NoSuchCatalogException;
 import org.apache.gravitino.exceptions.NoSuchMetalakeException;
 import org.apache.gravitino.exceptions.NoSuchSchemaException;
-import org.apache.gravitino.exceptions.NoSuchTableException;
-import org.apache.gravitino.rel.TableCatalog;
 
-/* Common code for all table commands. */
-public class TableCommand extends Command {
+/** Displays the audit information of schema. */
+public class SchemaAudit extends AuditCommand {
 
   protected final String metalake;
   protected final String catalog;
+  protected final String schema;
 
   /**
-   * Common code for all table commands.
+   * Displays the audit information of a schema.
    *
    * @param url The URL of the Gravitino server.
    * @param ignoreVersions If true don't check the client/server versions 
match.
    * @param metalake The name of the metalake.
    * @param catalog The name of the catalog.
+   * @param schema The name of the schenma.
    */
-  public TableCommand(String url, boolean ignoreVersions, String metalake, 
String catalog) {
+  public SchemaAudit(
+      String url, boolean ignoreVersions, String metalake, String catalog, 
String schema) {
     super(url, ignoreVersions);
     this.metalake = metalake;
     this.catalog = catalog;
+    this.schema = schema;
   }
 
-  /* Overridden in parent - do nothing  */
+  /** Displays the audit information of schema. */
   @Override
-  public void handle() {}
+  public void handle() {
+    Schema result;
 
-  /**
-   * Returns the table catalog for a given metalake and catalog.
-   *
-   * @return The TableCatalog or null if an error occurs.
-   */
-  public TableCatalog tableCatalog() {
-    try {
-      GravitinoClient client = buildClient(metalake);
-      return 
client.loadMetalake(metalake).loadCatalog(catalog).asTableCatalog();
+    try (GravitinoClient client = buildClient(metalake)) {
+      result = client.loadCatalog(catalog).asSchemas().loadSchema(this.schema);
     } catch (NoSuchMetalakeException err) {
       System.err.println(ErrorMessages.UNKNOWN_METALAKE);
+      return;
     } catch (NoSuchCatalogException err) {
       System.err.println(ErrorMessages.UNKNOWN_CATALOG);
+      return;
     } catch (NoSuchSchemaException err) {
       System.err.println(ErrorMessages.UNKNOWN_SCHEMA);
-    } catch (NoSuchTableException err) {
-      System.err.println(ErrorMessages.UNKNOWN_TABLE);
+      return;
     } catch (Exception exp) {
       System.err.println(exp.getMessage());
+      return;
     }
 
-    return null;
+    if (result != null) {
+      displayAuditInfo(result.auditInfo());
+    }
   }
 }
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
 b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableAudit.java
similarity index 50%
rename from 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
rename to 
clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableAudit.java
index de3807839..8051daf34 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeAuditInfo.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableAudit.java
@@ -19,52 +19,50 @@
 
 package org.apache.gravitino.cli.commands;
 
-import org.apache.gravitino.Audit;
-import org.apache.gravitino.cli.ErrorMessages;
-import org.apache.gravitino.client.GravitinoClient;
-import org.apache.gravitino.exceptions.NoSuchMetalakeException;
+import org.apache.gravitino.NameIdentifier;
+import org.apache.gravitino.rel.Table;
 
-/** Displays the audit information of a metalake. */
-public class MetalakeAuditInfo extends Command {
-  protected final String metalake;
+/** Displays the audit information of a table. */
+public class TableAudit extends TableCommand {
+
+  protected final String schema;
+  protected final String table;
 
   /**
-   * Displays metalake audit information.
+   * Displays the audit information of a table.
    *
    * @param url The URL of the Gravitino server.
    * @param ignoreVersions If true don't check the client/server versions 
match.
    * @param metalake The name of the metalake.
+   * @param catalog The name of the catalog.
+   * @param schema The name of the schenma.
+   * @param table The name of the table.
    */
-  public MetalakeAuditInfo(String url, boolean ignoreVersions, String 
metalake) {
-    super(url, ignoreVersions);
-    this.metalake = metalake;
+  public TableAudit(
+      String url,
+      boolean ignoreVersions,
+      String metalake,
+      String catalog,
+      String schema,
+      String table) {
+    super(url, ignoreVersions, metalake, catalog);
+    this.schema = schema;
+    this.table = table;
   }
 
-  /** Displays the audit information of a metalake. */
+  /** Displays the audit information of a table. */
   @Override
   public void handle() {
-    Audit audit;
-    try (GravitinoClient client = buildClient(metalake)) {
-      audit = client.loadMetalake(metalake).auditInfo();
-    } catch (NoSuchMetalakeException err) {
-      System.err.println(ErrorMessages.UNKNOWN_METALAKE);
-      return;
+    Table gTable;
+
+    try {
+      NameIdentifier name = NameIdentifier.of(schema, table);
+      gTable = tableCatalog().loadTable(name);
     } catch (Exception exp) {
       System.err.println(exp.getMessage());
       return;
     }
 
-    String auditInfo =
-        "creator,createTime,lastModifier,lastModifiedTime"
-            + System.lineSeparator()
-            + audit.creator()
-            + ","
-            + audit.createTime()
-            + ","
-            + audit.lastModifier()
-            + ","
-            + audit.lastModifiedTime();
-
-    System.out.println(auditInfo);
+    displayAuditInfo(gTable.auditInfo());
   }
 }
diff --git 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java
index a292a2f5b..f0e89d71f 100644
--- 
a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java
+++ 
b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java
@@ -28,7 +28,7 @@ import org.apache.gravitino.exceptions.NoSuchTableException;
 import org.apache.gravitino.rel.TableCatalog;
 
 /* Common code for all table commands. */
-public class TableCommand extends Command {
+public class TableCommand extends AuditCommand {
 
   protected final String metalake;
   protected final String catalog;
diff --git a/docs/cli.md b/docs/cli.md
index d54ba2c33..663a9c6ec 100644
--- a/docs/cli.md
+++ b/docs/cli.md
@@ -34,6 +34,7 @@ The general structure for running commands with the Gravitino 
CLI is `gcli entit
  -h,--help               command help information
  -i,--ignore             Ignore client/sever version check
  -l,--user <arg>         user name
+ -a,--audit              display audit information
  -m,--metalake <arg>     Metalake name
  -n,--name <arg>         full entity name (dot separated)
  -P,--property <arg>     property name
@@ -160,6 +161,12 @@ gcli metalake list
 gcli metalake details --metalake metalake_demo
 ```
 
+#### Show a metalake audit information
+
+```bash
+gcli metalake details --metalake metalake_demo --audit
+```
+
 #### Create a metalake
 
 ```bash
@@ -216,6 +223,12 @@ gcli catalog list --metalake metalake_demo
 gcli catalog details --metalake metalake_demo --name catalog_postgres
 ```
 
+#### Show a catalog audit information
+
+```bash
+gcli catalog details --metalake metalake_demo --name catalog_postgres --audit
+```
+
 #### Creating a catalog
 
 The type of catalog to be created is specified by the `--provider` option. 
Different catalogs require different properties, for example, a Hive catalog 
requires a metastore-uri property.
@@ -300,6 +313,12 @@ gcli schema list --metalake metalake_demo --name 
catalog_postgres
 gcli schema details --metalake metalake_demo --name catalog_postgres.hr
 ```
 
+#### Show schema audit information
+
+```bash
+gcli schema details --metalake metalake_demo --name catalog_postgres.hr --audit
+```
+
 #### Create a schema
 
 ```bash
@@ -328,6 +347,12 @@ gcli table list --metalake metalake_demo --name 
catalog_postgres.hr
 gcli column list --metalake metalake_demo --name 
catalog_postgres.hr.departments
 ```
 
+#### Show tables audit information
+
+```bash
+gcli table details --metalake metalake_demo --name 
catalog_postgres.hr.departments --audit
+```
+
 #### Delete a table
 
 ```bash

Reply via email to