Skip to content

Commit

Permalink
[#5059] Add commands to create, delete and modify metalakes, catalogs…
Browse files Browse the repository at this point in the history
… and schema in CLI. (#5117)

### What changes were proposed in this pull request?

Add commands to create, delete and modify metalakes, catalogs and
schema.

### Why are the changes needed?

stage 2 of the CLI.

Fix: #5059

### Does this PR introduce _any_ user-facing change?

Add new CLI features.

### How was this patch tested?

Tests pass locally.
  • Loading branch information
justinmclean authored Nov 6, 2024
1 parent 07d42f5 commit 919dcac
Show file tree
Hide file tree
Showing 52 changed files with 2,669 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,9 @@ public class CommandActions {
public static final String UPDATE = "update";
public static final String CREATE = "create";
public static final String DELETE = "delete";
public static final String SET = "set";
public static final String REMOVE = "remove";
public static final String PROPERTIES = "properties";

private static final HashSet<String> VALID_COMMANDS = new HashSet<>();

Expand All @@ -40,6 +43,9 @@ public class CommandActions {
VALID_COMMANDS.add(UPDATE);
VALID_COMMANDS.add(CREATE);
VALID_COMMANDS.add(DELETE);
VALID_COMMANDS.add(SET);
VALID_COMMANDS.add(REMOVE);
VALID_COMMANDS.add(PROPERTIES);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,14 @@
public class ErrorMessages {
public static final String UNSUPPORTED_COMMAND = "Unsupported or unknown command.";
public static final String UNKNOWN_ENTITY = "Unknown entity.";
public static final String TOO_MANY_ARGUMENTS = "Too many arguments.";
public static final String UNKNOWN_METALAKE = "Unknown metalake name.";
public static final String UNKNOWN_CATALOG = "Unknown catalog name.";
public static final String UNKNOWN_SCHEMA = "Unknown schema name.";
public static final String UNKNOWN_TABLE = "Unknown table name.";
public static final String MALFORMED_NAME = "Malformed entity name.";
public static final String MISSING_NAME = "Missing name.";
public static final String METALAKE_EXISTS = "Metalake already exists.";
public static final String CATALOG_EXISTS = "Catalog already exists.";
public static final String SCHEMA_EXISTS = "Schema already exists.";
}
16 changes: 15 additions & 1 deletion clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java
Original file line number Diff line number Diff line change
Expand Up @@ -41,11 +41,13 @@ public FullName(CommandLine line) {

/**
* Retrieves the metalake name from the command line options, the GRAVITINO_METALAKE environment
* variable.
* variable or the Gravitino config file.
*
* @return The metalake name, or null if not found.
*/
public String getMetalakeName() {
GravitinoConfig config = new GravitinoConfig(null);

// If specified on the command line use that
if (line.hasOption(GravitinoOptions.METALAKE)) {
return line.getOptionValue(GravitinoOptions.METALAKE);
Expand All @@ -60,6 +62,18 @@ public String getMetalakeName() {
// Check if the metalake name is set as an environment variable
if (metalakeEnv != null) {
return metalakeEnv;
// Check if the metalake name is specified in the configuration file
} else if (config.fileExists()) {
config.read();
String configName = config.getMetalakeName();
if (configName != null) {
return configName;
}
}

// Extract the metalake name from the full name option
if (line.hasOption(GravitinoOptions.NAME)) {
return line.getOptionValue(GravitinoOptions.NAME).split("\\.")[0];
}

return null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,42 @@

package org.apache.gravitino.cli;

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.CatalogDetails;
import org.apache.gravitino.cli.commands.ClientVersion;
import org.apache.gravitino.cli.commands.CreateCatalog;
import org.apache.gravitino.cli.commands.CreateMetalake;
import org.apache.gravitino.cli.commands.CreateSchema;
import org.apache.gravitino.cli.commands.DeleteCatalog;
import org.apache.gravitino.cli.commands.DeleteMetalake;
import org.apache.gravitino.cli.commands.DeleteSchema;
import org.apache.gravitino.cli.commands.DeleteTable;
import org.apache.gravitino.cli.commands.ListCatalogProperties;
import org.apache.gravitino.cli.commands.ListCatalogs;
import org.apache.gravitino.cli.commands.ListColumns;
import org.apache.gravitino.cli.commands.ListMetalakeProperties;
import org.apache.gravitino.cli.commands.ListMetalakes;
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.MetalakeAuditInfo;
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.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.TableDetails;
import org.apache.gravitino.cli.commands.UpdateCatalogComment;
import org.apache.gravitino.cli.commands.UpdateCatalogName;
import org.apache.gravitino.cli.commands.UpdateMetalakeComment;
import org.apache.gravitino.cli.commands.UpdateMetalakeName;

/* Gravitino Command line */
public class GravitinoCommandLine {
Expand All @@ -45,6 +66,8 @@ public class GravitinoCommandLine {
private String urlEnv;
private boolean urlSet = false;
private boolean ignore = false;
private String ignoreEnv;
private boolean ignoreSet = false;

public static final String CMD = "gcli"; // recommended name
public static final String DEFAULT_URL = "http://localhost:8090";
Expand All @@ -66,9 +89,26 @@ public GravitinoCommandLine(CommandLine line, Options options, String entity, St

/** Handles the parsed command line arguments and executes the corresponding actions. */
public void handleCommandLine() {
GravitinoConfig config = new GravitinoConfig(null);

/* Check if you should ignore client/version versions */
if (line.hasOption(GravitinoOptions.IGNORE)) {
ignore = true;
} else {
// Cache the ignore environment variable
if (ignoreEnv == null && !ignoreSet) {
ignoreEnv = System.getenv("GRAVITINO_IGNORE");
ignore = ignoreEnv != null && ignoreEnv.equals("true");
ignoreSet = true;
}

// Check if the ignore name is specified in the configuration file
if (ignoreEnv == null) {
if (config.fileExists()) {
config.read();
ignore = config.getIgnore();
}
}
}

executeCommand();
Expand Down Expand Up @@ -131,6 +171,29 @@ private void handleMetalakeCommand() {
}
} else if (CommandActions.LIST.equals(command)) {
new ListMetalakes(url, ignore).handle();
} else if (CommandActions.CREATE.equals(command)) {
String comment = line.getOptionValue(GravitinoOptions.COMMENT);
new CreateMetalake(url, ignore, metalake, comment).handle();
} else if (CommandActions.DELETE.equals(command)) {
new DeleteMetalake(url, ignore, metalake).handle();
} else if (CommandActions.SET.equals(command)) {
String property = line.getOptionValue(GravitinoOptions.PROPERTY);
String value = line.getOptionValue(GravitinoOptions.VALUE);
new SetMetalakeProperty(url, ignore, metalake, property, value).handle();
} else if (CommandActions.REMOVE.equals(command)) {
String property = line.getOptionValue(GravitinoOptions.PROPERTY);
new RemoveMetalakeProperty(url, ignore, metalake, property).handle();
} else if (CommandActions.PROPERTIES.equals(command)) {
new ListMetalakeProperties(url, ignore, metalake).handle();
} else if (CommandActions.UPDATE.equals(command)) {
if (line.hasOption(GravitinoOptions.COMMENT)) {
String comment = line.getOptionValue(GravitinoOptions.COMMENT);
new UpdateMetalakeComment(url, ignore, metalake, comment).handle();
}
if (line.hasOption(GravitinoOptions.RENAME)) {
String newName = line.getOptionValue(GravitinoOptions.RENAME);
new UpdateMetalakeName(url, ignore, metalake, newName).handle();
}
}
}

Expand All @@ -142,11 +205,41 @@ private void handleCatalogCommand() {
FullName name = new FullName(line);
String metalake = name.getMetalakeName();

if (CommandActions.LIST.equals(command)) {
new ListCatalogs(url, ignore, metalake).handle();
return;
}

String catalog = name.getCatalogName();

if (CommandActions.DETAILS.equals(command)) {
String catalog = name.getCatalogName();
new CatalogDetails(url, ignore, metalake, catalog).handle();
} else if (CommandActions.LIST.equals(command)) {
new ListCatalogs(url, ignore, metalake).handle();
} else if (CommandActions.CREATE.equals(command)) {
String comment = line.getOptionValue(GravitinoOptions.COMMENT);
String provider = line.getOptionValue(GravitinoOptions.PROVIDER);
String properties = line.getOptionValue(GravitinoOptions.PROPERTIES);
Map<String, String> propertyMap = new Properties().parse(properties);
new CreateCatalog(url, ignore, metalake, catalog, provider, comment, propertyMap).handle();
} else if (CommandActions.DELETE.equals(command)) {
new DeleteCatalog(url, ignore, metalake, catalog).handle();
} else if (CommandActions.SET.equals(command)) {
String property = line.getOptionValue(GravitinoOptions.PROPERTY);
String value = line.getOptionValue(GravitinoOptions.VALUE);
new SetCatalogProperty(url, ignore, metalake, catalog, property, value).handle();
} else if (CommandActions.REMOVE.equals(command)) {
String property = line.getOptionValue(GravitinoOptions.PROPERTY);
new RemoveCatalogProperty(url, ignore, metalake, catalog, property).handle();
} else if (CommandActions.PROPERTIES.equals(command)) {
new ListCatalogProperties(url, ignore, metalake, catalog).handle();
} else if (CommandActions.UPDATE.equals(command)) {
if (line.hasOption(GravitinoOptions.COMMENT)) {
String comment = line.getOptionValue(GravitinoOptions.COMMENT);
new UpdateCatalogComment(url, ignore, metalake, catalog, comment).handle();
}
if (line.hasOption(GravitinoOptions.RENAME)) {
String newName = line.getOptionValue(GravitinoOptions.RENAME);
new UpdateCatalogName(url, ignore, metalake, catalog, newName).handle();
}
}
}

Expand All @@ -159,11 +252,29 @@ private void handleSchemaCommand() {
String metalake = name.getMetalakeName();
String catalog = name.getCatalogName();

if (CommandActions.LIST.equals(command)) {
new ListSchema(url, ignore, metalake, catalog).handle();
return;
}

String schema = name.getSchemaName();

if (CommandActions.DETAILS.equals(command)) {
String schema = name.getSchemaName();
new SchemaDetails(url, ignore, metalake, catalog, schema).handle();
} else if (CommandActions.LIST.equals(command)) {
new ListSchema(url, ignore, metalake, catalog).handle();
} else if (CommandActions.CREATE.equals(command)) {
String comment = line.getOptionValue(GravitinoOptions.COMMENT);
new CreateSchema(url, ignore, metalake, catalog, schema, comment).handle();
} else if (CommandActions.DELETE.equals(command)) {
new DeleteSchema(url, ignore, metalake, catalog, schema).handle();
} else if (CommandActions.SET.equals(command)) {
String property = line.getOptionValue(GravitinoOptions.PROPERTY);
String value = line.getOptionValue(GravitinoOptions.VALUE);
new SetSchemaProperty(url, ignore, metalake, catalog, schema, property, value).handle();
} else if (CommandActions.REMOVE.equals(command)) {
String property = line.getOptionValue(GravitinoOptions.PROPERTY);
new RemoveSchemaProperty(url, ignore, metalake, catalog, schema, property).handle();
} else if (CommandActions.PROPERTIES.equals(command)) {
new ListSchemaProperties(url, ignore, metalake, catalog, schema).handle();
}
}

Expand All @@ -177,11 +288,19 @@ private void handleTableCommand() {
String catalog = name.getCatalogName();
String schema = name.getSchemaName();

if (CommandActions.LIST.equals(command)) {
new ListTables(url, ignore, metalake, catalog, schema).handle();
return;
}

String table = name.getTableName();

if (CommandActions.DETAILS.equals(command)) {
String table = name.getTableName();
new TableDetails(url, ignore, metalake, catalog, schema, table).handle();
} else if (CommandActions.LIST.equals(command)) {
new ListTables(url, ignore, metalake, catalog, schema).handle();
} else if (CommandActions.CREATE.equals(command)) {
// TODO
} else if (CommandActions.DELETE.equals(command)) {
new DeleteTable(url, ignore, metalake, catalog, schema, table).handle();
}
}

Expand All @@ -194,20 +313,22 @@ private void handleColumnCommand() {
String metalake = name.getMetalakeName();
String catalog = name.getCatalogName();
String schema = name.getSchemaName();
String table = name.getTableName();

if (CommandActions.LIST.equals(command)) {
String table = name.getTableName();
new ListColumns(url, ignore, metalake, catalog, schema, table).handle();
}
}

/**
* Retrieves the Gravitinno URL from the command line options or the GRAVITINO_URL environment
* variable.
* variable or the Gravitio config file.
*
* @return The Gravitinno URL, or null if not found.
*/
public String getUrl() {
GravitinoConfig config = new GravitinoConfig(null);

// If specified on the command line use that
if (line.hasOption(GravitinoOptions.URL)) {
return line.getOptionValue(GravitinoOptions.URL);
Expand All @@ -224,6 +345,15 @@ public String getUrl() {
return urlEnv;
}

// Check if the metalake name is specified in the configuration file
if (config.fileExists()) {
config.read();
String configURL = config.getGravitinoURL();
if (configURL != null) {
return configURL;
}
}

// Return the default localhost URL
return DEFAULT_URL;
}
Expand Down
Loading

0 comments on commit 919dcac

Please sign in to comment.