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 <[email protected]>
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