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.  --- .../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