From b5e08c0cee6d0294ccf05e8c4037f25d288d7c40 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 13:56:51 +1000 Subject: [PATCH 01/83] Added firest part of CLI code. --- build.gradle.kts | 2 +- clients/cli/README.md | 114 +++++++++++ clients/cli/build.gradle.kts | 59 ++++++ clients/cli/errors.sh | 51 +++++ clients/cli/examples.sh | 111 ++++++++++ .../apache/gravitino/cli/CommandActions.java | 54 +++++ .../apache/gravitino/cli/CommandEntities.java | 52 +++++ .../apache/gravitino/cli/ErrorMessages.java | 32 +++ .../org/apache/gravitino/cli/FullName.java | 123 +++++++++++ .../gravitino/cli/GravitinoCommandLine.java | 191 ++++++++++++++++++ .../gravitino/cli/GravitinoOptions.java | 99 +++++++++ .../java/org/apache/gravitino/cli/Main.java | 132 ++++++++++++ .../cli/commands/AllMetalakeDetails.java | 57 ++++++ .../cli/commands/CatalogDetails.java | 69 +++++++ .../gravitino/cli/commands/Command.java | 60 ++++++ .../gravitino/cli/commands/ListCatalogs.java | 66 ++++++ .../gravitino/cli/commands/ListColumns.java | 81 ++++++++ .../gravitino/cli/commands/ListMetalakes.java | 58 ++++++ .../gravitino/cli/commands/ListSchema.java | 73 +++++++ .../gravitino/cli/commands/ListTables.java | 64 ++++++ .../cli/commands/MetalakeDetails.java | 57 ++++++ .../gravitino/cli/commands/SchemaDetails.java | 76 +++++++ .../gravitino/cli/commands/TableCommand.java | 75 +++++++ .../gravitino/cli/commands/TableDetails.java | 60 ++++++ .../gravitino/cli/commands/Version.java | 49 +++++ .../gravitino/cli/TestCommandActions.java | 69 +++++++ .../gravitino/cli/TestCommandEntities.java | 67 ++++++ .../apache/gravitino/cli/TestFulllName.java | 182 +++++++++++++++++ .../gravitino/cli/TestGravitinoOptions.java | 59 ++++++ .../org/apache/gravitino/cli/TestMain.java | 117 +++++++++++ settings.gradle.kts | 3 +- 31 files changed, 2360 insertions(+), 2 deletions(-) create mode 100644 clients/cli/README.md create mode 100644 clients/cli/build.gradle.kts create mode 100644 clients/cli/errors.sh create mode 100755 clients/cli/examples.sh create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/Main.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/Version.java create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java diff --git a/build.gradle.kts b/build.gradle.kts index 73cbdd80f24..dfac198af9e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -349,7 +349,7 @@ subprojects { options.locale = "en_US" val projectName = project.name - if (projectName == "common" || projectName == "api" || projectName == "client-java" || projectName == "filesystem-hadoop3") { + if (projectName == "common" || projectName == "api" || projectName == "client-java" || projectName == "client-cli" || projectName == "filesystem-hadoop3") { options { (this as CoreJavadocOptions).addStringOption("Xwerror", "-quiet") isFailOnError = true diff --git a/clients/cli/README.md b/clients/cli/README.md new file mode 100644 index 00000000000..f6f52693cf9 --- /dev/null +++ b/clients/cli/README.md @@ -0,0 +1,114 @@ +# Apache Gravitino CLI + +Apache Gravitino CLI is a command-line tool that interacts with the Gravitino server to manage and query entities like metalakes, catalogs, schemas, and tables. The tool provides options for listing information about Gravitino entities and in future versions support creating, deleting, and updating these entities. + +## Table of Contents + +- [Features](#features) +- [Installation](#installation) +- [Usage](#usage) +- [Commands](#commands) +- [Running Tests](#running-tests) +- [Contributing](#contributing) +- [License](#license) + +## Features + +- Retrieve server version +- Provide help on usage +- Manage Gravitino entities such as Metalakes, Catalogs, Schemas, and Tables +- List details about Graviotino entities + +## Installation + +### Prerequisites + +Before you can build and run this project, it is suggested you have the following installed: + +- Java 11 or higher + +### Build the Project + +1. Clone the entire Gravitino repository: + + ```bash + git clone https://github.com/apache/gravitino + ``` + +2. Build the CLI sub-project using Gradle: + + ```bash + ./gradlew :clients:cli:build + ``` +3. Create an alias: + + ```bash + alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' + ``` +3. Test the command: + ```bash + gcli --help + ``` + +## Usage + +To run the Gravitino CLI, use the following command structure: + +```bash +java -jar gravitino-cli.jar [options] +Options +-h, --help: Display help information +-v, --version: Display the Gravitino server version +-u, --url : Specify the Gravitino server URL (default: http://localhost:8090) +-m, --metalake : Specify the Metalake to operate on +-c, --catalog : Specify the Catalog to operate on +-s, --schema : Specify the Schema to operate on +-t, --table : Specify the Table to operate on +-x, --command : Specify the action (list, details, create, delete, or update) +``` + +## Commands +The following commands are available for entity management: + +list: List available entities +details: Show detailed information about an entity +create: Create a new entity +delete: Delete an existing entity +update: Update an existing entity + +### Examples +List All Metalakes + +```bash +gcli list +``` + +Get Details of a Specific Metalake + +```bash +gcli metalake details -name my-metalake +``` + +List Tables in a Catalog + +```bash +gcli metalake list -name my-metalake.my-catalog +``` + +## Running Tests + +This project includes a suite of unit tests to verify its functionality. + +To run the tests, execute the following command: + +```bash +./gradlew :clients:cli:test +``` + +## Contributing + +We welcome contributions to the Gravitino CLI! + +## License + +This project is licensed under the Apache License 2.0. diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts new file mode 100644 index 00000000000..5e518e100de --- /dev/null +++ b/clients/cli/build.gradle.kts @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +plugins { + `maven-publish` + id("java") + id("idea") +} + +dependencies { + implementation(project(":clients:client-java")) + implementation(project(":api")) + implementation(project(":common")) + implementation("commons-cli:commons-cli:1.9.0") + implementation("org.slf4j:slf4j-api:2.0.16") + implementation("org.slf4j:slf4j-simple:2.0.16") + + testImplementation(libs.junit.jupiter.api) + testImplementation(libs.junit.jupiter.params) + testImplementation(libs.mockito.core) + + testRuntimeOnly(libs.junit.jupiter.engine) +} + +tasks.build { + dependsOn("javadoc") +} + +tasks.clean { + delete("target") + delete("tmp") +} + +tasks.jar { + manifest { + attributes["Main-Class"] = "org.apache.gravitino.cli.Main" + } + val dependencies = configurations + .runtimeClasspath + .get() + .map(::zipTree) + from(dependencies) + duplicatesStrategy = DuplicatesStrategy.EXCLUDE +} diff --git a/clients/cli/errors.sh b/clients/cli/errors.sh new file mode 100644 index 00000000000..bc67633c06a --- /dev/null +++ b/clients/cli/errors.sh @@ -0,0 +1,51 @@ +#!/bin/bash + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +# Some of these examples assume you have the Apache Gravitino playground running. + +alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' + +# No such command +gcli unknown + +# unknown command and entiry +gcli unknown unknown + +# unknown command and entiry +gcli unknown unknown + +# unknown command +gcli metalake unknown + +# unknown entity +gcli unknown list + +# Name not specified +gcli metalake details + +# Unknown metalake name +gcli metalake details --name unknown + +# Unknown catalog name +gcli catalog details --name metalake_demo.unknown + +# Unknown catalog name +gcli catalog details --name metalake_demo diff --git a/clients/cli/examples.sh b/clients/cli/examples.sh new file mode 100755 index 00000000000..757ef89f017 --- /dev/null +++ b/clients/cli/examples.sh @@ -0,0 +1,111 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +#!/bin/bash + +# These examples assume you have the Apache Gravitino playground running. + +unset GRAVITINO_METALAKE +alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' + +# display help +gcli --help + +# display version +gcli --version + +# metalake details +gcli details + +# metalake list +gcli list + +# metalake details (all these command are equivalent) +gcli metalake details --name metalake_demo +gcli metalake details --metalake metalake_demo +gcli --command details --metalake metalake_demo +gcli metalake --name metalake_demo details +gcli details --name metalake_demo +gcli details --metalake metalake_demo + +# list all catalogs in a metalake +gcli metalake list --name metalake_demo + +# list catalog schema +gcli catalog list --name metalake_demo.catalog_iceberg +gcli catalog list --name metalake_demo.catalog_mysql +gcli catalog list --name metalake_demo.catalog_postgres +gcli catalog list --name metalake_demo.catalog_hive + +# list catalog details +gcli catalog details --name metalake_demo.catalog_iceberg +gcli catalog details --name metalake_demo.catalog_mysql +gcli catalog details --name metalake_demo.catalog_postgres +gcli catalog details --name metalake_demo.catalog_hive + +# list schema tables +gcli schema list --name metalake_demo.catalog_postgres.hr +gcli schema list --name metalake_demo.catalog_mysql.db +gcli schema list --name metalake_demo.catalog_hive.sales + +# list schema details +gcli schema details --name metalake_demo.catalog_postgres.hr +gcli schema details --name metalake_demo.catalog_mysql.db +gcli schema details --name metalake_demo.catalog_hive.sales + +# list table details +gcli table list --name metalake_demo.catalog_postgres.hr.departments +gcli table list --name metalake_demo.catalog_mysql.db.iceberg_tables +gcli table list --name metalake_demo.catalog_hive.sales.products + +# Exmaples where metalake is set in an evironment variable +export GRAVITINO_METALAKE=metalake_demo + +# metalake details +gcli metalake details + +# list all catalogs in a metalake +gcli metalake list + +# list catalog schema +gcli catalog list --name catalog_iceberg +gcli catalog list --name catalog_mysql +gcli catalog list --name catalog_postgres +gcli catalog list --name catalog_hive + +# list catalog details +gcli catalog details --name catalog_iceberg +gcli catalog details --name catalog_mysql +gcli catalog details --name catalog_postgres +gcli catalog details --name catalog_hive + +# list schema tables +gcli schema list --name catalog_postgres.hr +gcli schema list --name catalog_mysql.db +gcli schema list --name catalog_hive.sales + +# list schema details +gcli schema details --name catalog_postgres.hr +gcli schema details --name catalog_mysql.db +gcli schema details --name catalog_hive.sales + +# list table details +gcli table list --name catalog_postgres.hr.departments +gcli table list --name catalog_mysql.db.iceberg_tables +gcli table list --name catalog_hive.sales.products diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java new file mode 100644 index 00000000000..1077f437c9d --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import java.util.HashSet; + +/** + * The {@code CommandActions} class defines a set of standard commands that can be used in the + * Gravitino CLI. It also can validate if a given command is a valid commands. + */ +public class CommandActions { + public static final String DETAILS = "details"; + public static final String LIST = "list"; + public static final String UPDATE = "update"; + public static final String CREATE = "create"; + public static final String DELETE = "delete"; + + private static final HashSet VALID_COMMANDS = new HashSet<>(); + + static { + VALID_COMMANDS.add(DETAILS); + VALID_COMMANDS.add(LIST); + VALID_COMMANDS.add(UPDATE); + VALID_COMMANDS.add(CREATE); + VALID_COMMANDS.add(DELETE); + } + + /** + * Checks if a given command is a valid command type. + * + * @param command The command to check. + * @return true if the command is valid, false otherwise. + */ + public static boolean isValidCommand(String command) { + return VALID_COMMANDS.contains(command); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java new file mode 100644 index 00000000000..b177acf6c20 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java @@ -0,0 +1,52 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import java.util.HashSet; + +/** + * The {@code CommandEntities} class defines a set of standard entities that can be used in the + * Gravitino CLI. It also can validate if a given entity is a valid entity. + */ +public class CommandEntities { + public static final String METALAKE = "metalake"; + public static final String CATALOG = "catalog"; + public static final String SCHEMA = "schema"; + public static final String TABLE = "table"; + + private static final HashSet VALID_ENTITIES = new HashSet<>(); + + static { + VALID_ENTITIES.add(METALAKE); + VALID_ENTITIES.add(CATALOG); + VALID_ENTITIES.add(SCHEMA); + VALID_ENTITIES.add(TABLE); + } + + /** + * Checks if a given command is a valid entity. + * + * @param entity The entity to check. + * @return true if the command is valid, false otherwise. + */ + public static boolean isValidEntity(String entity) { + return VALID_ENTITIES.contains(entity); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java new file mode 100644 index 00000000000..847b96516c0 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java @@ -0,0 +1,32 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +/* User friendly error messages. */ +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 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."; +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java new file mode 100644 index 00000000000..15a94699fba --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -0,0 +1,123 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import org.apache.commons.cli.CommandLine; + +/** + * Extracts different arts of a full name (dot seperated) from the command line input. This includes + * metalake, catalog, schema, and table names. + */ +public class FullName { + CommandLine line; + + /** + * Constructor for the {@code FullName} class. + * + * @param line The parsed command line arguments. + */ + public FullName(CommandLine line) { + this.line = line; + } + + /** + * Retrieves the metalake name from the command line options, environment variables, or the first + * part of the full name. + * + * @return The metalake name, or null if not found. + */ + public String getMetalakeName() { + String metalakeEnv = System.getenv("GRAVITINO_METALAKE"); + + // Check if the metalake name is specified as a command line option + if (line.hasOption(GravitinoOptions.METALAKE)) { + return line.getOptionValue(GravitinoOptions.METALAKE); + // Check if the metalake name is set as an environment variable + } else if (metalakeEnv != null) { + return metalakeEnv; + // Extract the metalake name from the full name option + } else if (line.hasOption(GravitinoOptions.NAME)) { + return line.getOptionValue(GravitinoOptions.NAME).split("\\.")[0]; + } + + return null; + } + + /** + * Retrieves the catalog name from the command line or the second part of the full name option. + * + * @return The catalog name, or null if not found. + */ + public String getCatalogName() { + return getNamePart(GravitinoOptions.CATALOG, 1); + } + + /** + * Retrieves the schema name from the command line or the third part of the full name option. + * + * @return The schema name, or null if not found. + */ + public String getSchemaName() { + return getNamePart(GravitinoOptions.SCHEMA, 2); + } + + /** + * Retrieves the table name from the command line or the fourth part of the full name option. + * + * @return The table name, or null if not found. + */ + public String getTableName() { + return getNamePart(GravitinoOptions.TABLE, 3); + } + + /** + * Helper method to retrieve a specific part of the full name based on the position of the part. + * + * @param entity The part of the name to obtain. + * @param position The position of the name part in the full name string. + * @return The extracted part of the name, or {@code null} if the name part is missing or + * malformed. + */ + public String getNamePart(String entity, int position) { + /* Check if the name is specified as a command line option. */ + if (line.hasOption(entity)) { + return line.getOptionValue(entity); + /* Extract the name part from the full name if available. */ + } else if (line.hasOption(GravitinoOptions.NAME)) { + String[] names = line.getOptionValue(GravitinoOptions.NAME).split("\\."); + + /* Adjust position if metalake is part of the full name. */ + String metalakeEnv = System.getenv("GRAVITINO_METALAKE"); + if (metalakeEnv != null) { + position = position - 1; + } + + if (names.length < position) { + System.err.println(ErrorMessages.MALFORMED_NAME); + return null; + } + + return names[position]; + } + + System.err.println(ErrorMessages.MISSING_NAME); + return null; + } +} 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 new file mode 100644 index 00000000000..0a91a2e596a --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoCommandLine.java @@ -0,0 +1,191 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.HelpFormatter; +import org.apache.commons.cli.Options; +import org.apache.gravitino.cli.commands.AllMetalakeDetails; +import org.apache.gravitino.cli.commands.CatalogDetails; +import org.apache.gravitino.cli.commands.ListCatalogs; +import org.apache.gravitino.cli.commands.ListColumns; +import org.apache.gravitino.cli.commands.ListMetalakes; +import org.apache.gravitino.cli.commands.ListSchema; +import org.apache.gravitino.cli.commands.ListTables; +import org.apache.gravitino.cli.commands.MetalakeDetails; +import org.apache.gravitino.cli.commands.SchemaDetails; +import org.apache.gravitino.cli.commands.TableDetails; +import org.apache.gravitino.cli.commands.Version; + +/* Gravitino Command line */ +public class GravitinoCommandLine { + + private CommandLine line; + private Options options; + private String entity; + private String command; + + public static final String CMD = "gcli"; // recommended name + public static final String DEFAULT_URL = "http://localhost:8090"; + + /** + * Gravitino Command line. + * + * @param line Parsed command line object. + * @param options Available options for the CLI. + * @param entity The entity to apply the command to e.g. metlake, catalog, schema, table etc etc. + * @param command The type of command to run i.e. list, details, update, delete, or create. + */ + public GravitinoCommandLine(CommandLine line, Options options, String entity, String command) { + this.line = line; + this.options = options; + this.entity = entity; + this.command = command; + } + + /** Handles the parsed command line arguments and executes the corresponding actions. */ + public void handleCommandLine() { + /* Display command usage. */ + if (line.hasOption(GravitinoOptions.HELP)) { + GravitinoCommandLine.displayHelp(options); + } + /* Display Gravitino version. */ + else if (line.hasOption(GravitinoOptions.VERSION)) { + new Version(getUrl()).handle(); + } else { + executeCommand(); + } + } + + /** + * Displays the help message for the command line tool. + * + * @param options The command options. + */ + public static void displayHelp(Options options) { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp(CMD, options); + } + + /** Executes the appropriate command based on the command type. */ + private void executeCommand() { + if (entity != null) { + if (entity.equals(CommandEntities.TABLE)) { + handleTableCommand(); + } else if (entity.equals(CommandEntities.SCHEMA)) { + handleSchemaCommand(); + } else if (entity.equals(CommandEntities.CATALOG)) { + handleCatalogCommand(); + } else if (entity.equals(CommandEntities.METALAKE)) { + handleMetalakeCommand(); + } + } else { + handleGeneralCommand(); + } + } + + /** + * Handles the command execution for Metalakes based on command type and the command line options. + */ + protected void handleMetalakeCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + + if (CommandActions.DETAILS.equals(command)) { + new MetalakeDetails(url, metalake).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListCatalogs(url, metalake).handle(); + } + } + + /** + * Handles the command execution for Catalogs based on command type and the command line options. + */ + protected void handleCatalogCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String catalog = name.getCatalogName(); + + if (CommandActions.DETAILS.equals(command)) { + new CatalogDetails(url, metalake, catalog).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListSchema(url, metalake, catalog).handle(); + } + } + + /** + * Handles the command execution for Schemas based on command type and the command line options. + */ + protected void handleSchemaCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + + if (CommandActions.DETAILS.equals(command)) { + new SchemaDetails(url, metalake, catalog, schema).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListTables(url, metalake, catalog, schema).handle(); + } + } + + /** + * Handles the command execution for Tables based on command type and the command line options. + */ + protected void handleTableCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + String table = name.getTableName(); + + if (CommandActions.DETAILS.equals(command)) { + new TableDetails(url, metalake, catalog, schema, table).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListColumns(url, metalake, catalog, schema, table).handle(); + } + } + + /** Handles the command execution based on command type and the command line options. */ + protected void handleGeneralCommand() { + String url = getUrl(); + + if (CommandActions.DETAILS.equals(command)) { + new AllMetalakeDetails(url).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListMetalakes(url).handle(); + } + } + + /** + * Gets the Gravitino URL from the command line options, or returns the default URL. + * + * @return The Gravitino URL to be used. + */ + protected String getUrl() { + return line.hasOption(GravitinoOptions.URL) + ? line.getOptionValue(GravitinoOptions.URL) + : DEFAULT_URL; + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java new file mode 100644 index 00000000000..cf4bcd47b41 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import org.apache.commons.cli.Option; +import org.apache.commons.cli.Options; + +/* Gravitino Command line options */ +public class GravitinoOptions { + public static final String HELP = "help"; + public static final String VERSION = "version"; + public static final String URL = "url"; + public static final String METALAKE = "metalake"; + public static final String CATALOG = "catalog"; + public static final String SCHEMA = "schema"; + public static final String TABLE = "table"; + public static final String NAME = "name"; + public static final String ENTITY = "entity"; + public static final String COMMAND = "command"; + public static final String LIST = "list"; + public static final String DETAILS = "details"; + public static final String CREATE = "create"; + public static final String UPDATE = "update"; + public static final String DELETE = "delete"; + + /** + * Builds and returns the CLI options for Gravitino. + * + * @return Valid CLI command options. + */ + public Options options() { + Options options = new Options(); + + // Add options using helper method to avoid repetition + options.addOption(createSimpleOption("h", HELP, "command help information")); + options.addOption(createSimpleOption("v", VERSION, "Gravitino version")); + options.addOption(createArgOption("u", URL, "Gravitino URL")); + options.addOption(createArgOption("m", METALAKE, "metalake name")); + options.addOption(createArgOption("c", CATALOG, "catalog name")); + options.addOption(createArgOption("s", SCHEMA, "schema name")); + options.addOption(createArgOption("t", TABLE, "table name")); + options.addOption(createArgOption("f", NAME, "full entity name (dot separated)")); + options.addOption(createArgOption("e", ENTITY, "entity type")); + + // One way of specifying the command + options.addOption( + createArgOption("x", COMMAND, "one of: list, details, create, delete, or update")); + + // Another way of specifying the command + options.addOption(createSimpleOption("L", LIST, "list entity children")); + options.addOption(createSimpleOption("D", DETAILS, "list details about an entity")); + options.addOption(createSimpleOption("C", CREATE, "create an entity")); + options.addOption(createSimpleOption("U", UPDATE, "update an entity")); + options.addOption(createSimpleOption("R", DELETE, "delete an entity")); + + return options; + } + + /** + * Helper method to create an Option that does not require arguments. + * + * @param shortName The option name as a single letter + * @param longName The long option name. + * @param description The option description. + * @return The Option object. + */ + public Option createSimpleOption(String shortName, String longName, String description) { + return new Option(shortName, longName, false, description); + } + + /** + * Helper method to create an Option that requires an argument. + * + * @param shortName The option name as a single letter + * @param longName The long option name. + * @param description The option description. + * @return The Option object. + */ + public Option createArgOption(String shortName, String longName, String description) { + return new Option(shortName, longName, true, description); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java new file mode 100644 index 00000000000..47a01a2a587 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -0,0 +1,132 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +/* Entry point for teh Gravitino command line. */ +public class Main { + + public static void main(String[] args) { + CommandLineParser parser = new DefaultParser(); + Options options = new GravitinoOptions().options(); + + try { + CommandLine line = parser.parse(options, args); + String command = resolveCommand(line); + String entity = resolveEntity(line); + GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); + commandLine.handleCommandLine(); + } catch (ParseException exp) { + System.err.println("Error parsing command line: " + exp.getMessage()); + GravitinoCommandLine.displayHelp(options); + } + } + + /** + * Determines the command based on the command line input. + * + * @param line Parsed command line object. + * @return The command, one of 'details', 'list', 'create', 'delete' or 'update'. + */ + protected static String resolveCommand(CommandLine line) { + /* Can be specified in the form --command XXX. */ + if (line.hasOption(GravitinoOptions.COMMAND)) { + String command = line.getOptionValue(GravitinoOptions.COMMAND); + if (CommandActions.isValidCommand(command)) { + return command; + } + } + + /* Or as --list, --details --create --delete or --update. */ + if (line.hasOption(GravitinoOptions.LIST)) { + return CommandActions.LIST; + } else if (line.hasOption(GravitinoOptions.DETAILS)) { + return CommandActions.DETAILS; + } else if (line.hasOption(GravitinoOptions.CREATE)) { + return CommandActions.CREATE; + } else if (line.hasOption(GravitinoOptions.DELETE)) { + return CommandActions.DELETE; + } else if (line.hasOption(GravitinoOptions.UPDATE)) { + return CommandActions.UPDATE; + } + + /* Or as the bare second argument of two arguments. */ + String[] args = line.getArgs(); + + if (args.length == 1 || args.length == 2) { + String command = args[args.length - 1]; + if (CommandActions.isValidCommand(command)) { + return command; + } else { + System.err.println(ErrorMessages.UNSUPPORTED_COMMAND); + return null; + } + } else { + return CommandActions.DETAILS; /* Default to 'details' command. */ + } + } + + /** + * Determines the entity to act upon based on the command line input. + * + * @param line Parsed command line object. + * @return The entity, e.g. metakalake, catalog, schema, table, etc. + */ + protected static String resolveEntity(CommandLine line) { + /* Can be specified in the form --entity XXX. */ + if (line.hasOption(GravitinoOptions.ENTITY)) { + String entity = line.getOptionValue(GravitinoOptions.ENTITY); + if (CommandEntities.isValidEntity(entity)) { + return entity; + } + } + + /* Or as --metalake, --catalog, --schema, --table etc. */ + if (line.hasOption(GravitinoOptions.METALAKE)) { + return CommandEntities.METALAKE; + } else if (line.hasOption(GravitinoOptions.CATALOG)) { + return CommandEntities.CATALOG; + } else if (line.hasOption(GravitinoOptions.SCHEMA)) { + return CommandEntities.SCHEMA; + } else if (line.hasOption(GravitinoOptions.TABLE)) { + return CommandEntities.TABLE; + } + + /* Or as the bare first argument of two arguments. */ + String[] args = line.getArgs(); + + if (args.length == 2) { + String entity = args[0]; + if (CommandEntities.isValidEntity(entity)) { + return entity; + } else { + System.err.println(ErrorMessages.UNKNOWN_ENTITY); + return null; + } + } + + return null; + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java new file mode 100644 index 00000000000..6884caf41d4 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.Metalake; +import org.apache.gravitino.client.GravitinoAdminClient; + +public class AllMetalakeDetails extends Command { + + /** + * Parameters needed to list all metalakes. + * + * @param url The URL of the Gravitino server. + */ + public AllMetalakeDetails(String url) { + super(url); + } + + /** Displays the name and comment of all metalakes. */ + public void handle() { + Metalake[] metalakes = new Metalake[0]; + try { + GravitinoAdminClient client = buildAdminClient(); + metalakes = client.listMetalakes(); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < metalakes.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(metalakes[i].name() + "," + metalakes[i].comment() + System.lineSeparator()); + } + + System.out.print(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java new file mode 100644 index 00000000000..85b31f5ae6b --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +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; + +public class CatalogDetails extends Command { + + protected String metalake; + protected String catalog; + + /** + * Displays the name and comment of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + */ + public CatalogDetails(String url, String metalake, String catalog) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + } + + /** Displays the name and details of a specified catalog. */ + public void handle() { + Catalog result = null; + + try { + GravitinoClient client = buildClient(metalake); + result = client.loadMetalake(metalake).loadCatalog(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; + } + + if (result != null) { + System.out.println( + result.name() + "," + result.type() + "," + result.provider() + "," + result.comment()); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java new file mode 100644 index 00000000000..8dd84bf41b2 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/* The base for all commands. */ +public abstract class Command { + private final String url; + + /** + * Command constructor. + * + * @param url The URL of the Gravitino server. + */ + protected Command(String url) { + this.url = url; + } + /** All commands have a handle method to handle and run the required command. */ + public abstract void handle(); + + /** + * Builds a {@link GravitinoClient} instance with the provided server URL and metalake. + * + * @param metalake The name of the metalake. + * @return A configured {@link GravitinoClient} instance. + * @throws NoSuchMetalakeException if the specified metalake does not exist. + */ + protected GravitinoClient buildClient(String metalake) throws NoSuchMetalakeException { + return GravitinoClient.builder(url).withMetalake(metalake).withVersionCheckDisabled().build(); + } + + /** + * Builds a {@link GravitinoAdminClient} instance with the server URL. + * + * @return A configured {@link GravitinoAdminClient} instance. + */ + protected GravitinoAdminClient buildAdminClient() { + return GravitinoAdminClient.builder(url).withVersionCheckDisabled().build(); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java new file mode 100644 index 00000000000..e00c79520b4 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/* Lists all catalogs in a metalake. */ +public class ListCatalogs extends Command { + + protected String metalake; + + /** + * Lists all catalogs in a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + */ + public ListCatalogs(String url, String metalake) { + super(url); + this.metalake = metalake; + } + + /** Lists all catalogs in a metalake. */ + public void handle() { + String[] catalogs = new String[0]; + try { + GravitinoClient client = buildClient(metalake); + catalogs = client.listCatalogs(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < catalogs.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(catalogs[i]); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java new file mode 100644 index 00000000000..3e7cbcf674f --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java @@ -0,0 +1,81 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.rel.Column; + +/** Displays the details of a table's columns. */ +public class ListColumns extends TableCommand { + + protected String schema; + protected String table; + + /** + * Displays the details of a table's columns. + * + * @param url The URL of the Gravitino server. + * @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 ListColumns(String url, String metalake, String catalog, String schema, String table) { + super(url, metalake, catalog); + this.schema = schema; + this.table = table; + } + + /** Displays the details of a table's columns. */ + public void handle() { + Column[] columns = null; + + try { + NameIdentifier name = NameIdentifier.of(schema, table); + columns = tableCatalog().loadTable(name).columns(); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < columns.length; i++) { + String name = columns[i].name(); + String dataType = columns[i].dataType().simpleString(); + String comment = columns[i].comment(); + String nullable = columns[i].nullable() ? "null" : ""; + String autoIncrement = columns[i].autoIncrement() ? "auto" : ""; + // TODO default values + all.append( + name + + "," + + dataType + + "," + + comment + + "," + + nullable + + "," + + autoIncrement + + System.lineSeparator()); + } + + System.out.print(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java new file mode 100644 index 00000000000..8f7a73a89d9 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.Metalake; +import org.apache.gravitino.client.GravitinoAdminClient; + +/** Lists all metalakes. */ +public class ListMetalakes extends Command { + + /** + * List all metalakes. + * + * @param url The URL of the Gravitino server. + */ + public ListMetalakes(String url) { + super(url); + } + + /** Lists all metalakes. */ + public void handle() { + Metalake[] metalakes = new Metalake[0]; + try { + GravitinoAdminClient client = buildAdminClient(); + metalakes = client.listMetalakes(); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < metalakes.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(metalakes[i].name()); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java new file mode 100644 index 00000000000..00845836d5f --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** List all schema names in a schema. */ +public class ListSchema extends Command { + + protected String metalake; + protected String catalog; + + /** + * Lists all schemas in a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + */ + public ListSchema(String url, String metalake, String catalog) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + } + + /** List all schema names in a schema. */ + public void handle() { + String[] schemas = new String[0]; + try { + GravitinoClient client = buildClient(metalake); + schemas = client.loadCatalog(catalog).asSchemas().listSchemas(); + } 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; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < schemas.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(schemas[i]); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java new file mode 100644 index 00000000000..22c1e1329d7 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java @@ -0,0 +1,64 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.Namespace; + +/** List the names of all tables in a schema. */ +public class ListTables extends TableCommand { + + protected String schema; + + /** + * List the names of all tables in a schema. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schenma. + */ + public ListTables(String url, String metalake, String catalog, String schema) { + super(url, metalake, catalog); + this.schema = schema; + } + + /** List the names of all tables in a schema. */ + public void handle() { + NameIdentifier[] tables = null; + Namespace name = Namespace.of(schema); + try { + tables = tableCatalog().listTables(name); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < tables.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(tables[i].name()); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java new file mode 100644 index 00000000000..575a11d8089 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java @@ -0,0 +1,57 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Displays the details of a metalake. */ +public class MetalakeDetails extends Command { + protected String metalake; + + /** + * Displays metalake details. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + */ + public MetalakeDetails(String url, String metalake) { + super(url); + this.metalake = metalake; + } + + /** Displays the name and comment of a metalake. */ + public void handle() { + String comment = ""; + try { + GravitinoClient client = buildClient(metalake); + comment = client.loadMetalake(metalake).comment(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(metalake + "," + comment); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java new file mode 100644 index 00000000000..6972e3dba58 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +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; + +/** Displays the details of schema. */ +public class SchemaDetails extends Command { + + protected String metalake; + protected String catalog; + protected String schema; + + /** + * Displays the details of a schema. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schenma. + */ + public SchemaDetails(String url, String metalake, String catalog, String schema) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.schema = schema; + } + + /** Displays the name and comments of schema. */ + public void handle() { + Schema result = null; + + try { + GravitinoClient client = buildClient(metalake); + result = client.loadMetalake(metalake).loadCatalog(catalog).asSchemas().loadSchema(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); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (result != null) { + System.out.println(result.name() + "," + result.comment()); + } + } +} 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 new file mode 100644 index 00000000000..f4059ba508e --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableCommand.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +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 { + + protected String metalake; + protected String catalog; + + /** + * Common code for all table commands. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + */ + public TableCommand(String url, String metalake, String catalog) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + } + + /* Overridden in parent - do nothing */ + public void handle() {} + + /** + * 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(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + } catch (NoSuchCatalogException err) { + System.err.println(ErrorMessages.UNKNOWN_CATALOG); + } catch (NoSuchSchemaException err) { + System.err.println(ErrorMessages.UNKNOWN_SCHEMA); + } catch (NoSuchTableException err) { + System.err.println(ErrorMessages.UNKNOWN_TABLE); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + } + + return null; + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java new file mode 100644 index 00000000000..67679b7a0a5 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.rel.Table; + +/** Displays the details of a table. */ +public class TableDetails extends TableCommand { + + protected String schema; + protected String table; + + /** + * Displays the details of a table. + * + * @param url The URL of the Gravitino server. + * @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 TableDetails(String url, String metalake, String catalog, String schema, String table) { + super(url, metalake, catalog); + this.schema = schema; + this.table = table; + } + + /** Displays the details of a table. */ + public void handle() { + Table gTable = null; + + try { + NameIdentifier name = NameIdentifier.of(table); + gTable = tableCatalog().loadTable(name); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(gTable.name() + "," + gTable.comment()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Version.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Version.java new file mode 100644 index 00000000000..96efe6acdf9 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Version.java @@ -0,0 +1,49 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.client.GravitinoAdminClient; + +/** Displays the Gravitino server version. */ +public class Version extends Command { + + /** + * Displays the server version. + * + * @param url The URL of the Gravitino server. + */ + public Version(String url) { + super(url); + } + + /** Displays the server version. */ + public void handle() { + String version = "unknown"; + try { + GravitinoAdminClient client = buildAdminClient(); + version = client.serverVersion().version(); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println("Apache Gravitino " + version); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java new file mode 100644 index 00000000000..a79f9961fb1 --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class TestCommandActions { + + @Test + public void ValidCommands() { + assertTrue( + CommandActions.isValidCommand(CommandActions.DETAILS), "DETAILS should be a valid command"); + assertTrue( + CommandActions.isValidCommand(CommandActions.LIST), "LIST should be a valid command"); + assertTrue( + CommandActions.isValidCommand(CommandActions.UPDATE), "UPDATE should be a valid command"); + assertTrue( + CommandActions.isValidCommand(CommandActions.CREATE), "CREATE should be a valid command"); + assertTrue( + CommandActions.isValidCommand(CommandActions.DELETE), "DELETE should be a valid command"); + } + + @Test + public void invalidCommand() { + assertFalse( + CommandActions.isValidCommand("invalidCommand"), "An invalid command should return false"); + } + + @Test + public void nullCommand() { + assertFalse( + CommandActions.isValidCommand(null), + "Null should return false as it's not a valid command"); + } + + @Test + public void emptyCommand() { + assertFalse( + CommandActions.isValidCommand(""), + "Empty string should return false as it's not a valid command"); + } + + @Test + public void caseSensitive() { + assertFalse( + CommandActions.isValidCommand("DETAILS".toUpperCase()), + "Commands should be case-sensitive"); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java new file mode 100644 index 00000000000..1ce61cd6f3f --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java @@ -0,0 +1,67 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class TestCommandEntities { + + @Test + public void validEntities() { + assertTrue( + CommandEntities.isValidEntity(CommandEntities.METALAKE), + "METALAKE should be a valid entity"); + assertTrue( + CommandEntities.isValidEntity(CommandEntities.CATALOG), "CATALOG should be a valid entity"); + assertTrue( + CommandEntities.isValidEntity(CommandEntities.SCHEMA), "SCHEMA should be a valid entity"); + assertTrue( + CommandEntities.isValidEntity(CommandEntities.TABLE), "TABLE should be a valid entity"); + } + + @Test + public void invalidEntity() { + assertFalse( + CommandEntities.isValidEntity("invalidEntity"), "An invalid command should return false"); + } + + @Test + public void nullEntity() { + assertFalse( + CommandEntities.isValidEntity(null), "Null should return false as it's not a valid entity"); + } + + @Test + public void emptyEntity() { + assertFalse( + CommandEntities.isValidEntity(""), + "Empty string should return false as it's not a valid entity"); + } + + @Test + public void caseSensitive() { + assertFalse( + CommandEntities.isValidEntity("DETAILS".toUpperCase()), + "Entities should be case-sensitive"); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java new file mode 100644 index 00000000000..07582b9cfb7 --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -0,0 +1,182 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.HashMap; +import java.util.Map; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.apache.gravitino.cli.FullName; +import org.apache.gravitino.cli.GravitinoOptions; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class TestFulllName { + + private Options options; + private static final Map DEFAULTS = new HashMap<>(System.getenv()); + private static Map envMap; + + /* Used to simulate setting environment variables. */ + @BeforeAll + public static void accessFields() throws Exception { + envMap = new HashMap<>(); + Class clazz = Class.forName("java.lang.ProcessEnvironment"); + Field environmentField = clazz.getDeclaredField("theEnvironment"); + Field unmodifiableEnvironmentField = clazz.getDeclaredField("theUnmodifiableEnvironment"); + removeStaticFinalAndSetValue(environmentField, envMap); + removeStaticFinalAndSetValue(unmodifiableEnvironmentField, envMap); + } + + private static void removeStaticFinalAndSetValue(Field field, Object value) throws Exception { + field.setAccessible(true); + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, value); + } + + @BeforeEach + public void setUp() { + options = new GravitinoOptions().options(); + envMap.clear(); + envMap.putAll(DEFAULTS); + } + + @Test + public void entityFromCommandLineOption() throws Exception { + String[] args = {"--metalake", "metalake_demo"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String metalakeName = fullName.getMetalakeName(); + assertEquals("metalake_demo", metalakeName); + } + + @Test + public void entityFromEnvironmentVariable() throws Exception { + String[] args = {}; // No command line metalake option + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + System.getenv().put("GRAVITINO_METALAKE", "metalake_env"); + + String metalakeName = fullName.getMetalakeName(); + assertEquals("metalake_env", metalakeName); + } + + @Test + public void entityFromFullNameOption() throws Exception { + String[] args = {"--name", "metalakeA.catalogB.schemaC.tableD"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String metalakeName = fullName.getMetalakeName(); + assertEquals("metalakeA", metalakeName); + String catalogName = fullName.getCatalogName(); + assertEquals("catalogB", catalogName); + String schemaName = fullName.getSchemaName(); + assertEquals("schemaC", schemaName); + String tableName = fullName.getTableName(); + assertEquals("tableD", tableName); + } + + @Test + public void entityFromFullNameOptionWithoutMetalake() throws Exception { + String[] args = {"--name", "catalogB.schemaC.tableD"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + System.getenv().put("GRAVITINO_METALAKE", "metalake_env"); + + String metalakeName = fullName.getMetalakeName(); + assertEquals("metalake_env", metalakeName); + String catalogName = fullName.getCatalogName(); + assertEquals("catalogB", catalogName); + String schemaName = fullName.getSchemaName(); + assertEquals("schemaC", schemaName); + String tableName = fullName.getTableName(); + assertEquals("tableD", tableName); + } + + @Test + public void entityNotFound() throws Exception { + String[] args = {}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String metalakeName = fullName.getMetalakeName(); + assertNull(metalakeName); + } + + @Test + public void catalogFromCommandLineOption() throws Exception { + String[] args = {"--catalog", "catalogA"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String catalogName = fullName.getCatalogName(); + assertEquals("catalogA", catalogName); + } + + @Test + public void schemaFromCommandLineOption() throws Exception { + String[] args = {"--schema", "schemaA"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String schemaName = fullName.getSchemaName(); + assertEquals("schemaA", schemaName); + } + + @Test + public void tableFromCommandLineOption() throws Exception { + String[] args = {"--table", "tableA"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String tableName = fullName.getTableName(); + assertEquals("tableA", tableName); + } + + @Test + public void malformedName() throws Exception { + String[] args = {"--name", "metalake.catalog"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + String tableName = fullName.getTableName(); + assertNull(tableName); + } + + @Test + public void missingName() throws Exception { + String[] args = {}; // No name provided + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String namePart = fullName.getNamePart(GravitinoOptions.TABLE, 3); + assertNull(namePart); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java new file mode 100644 index 00000000000..6fd12276d16 --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java @@ -0,0 +1,59 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.apache.commons.cli.Option; +import org.junit.jupiter.api.Test; + +public class TestGravitinoOptions { + + @Test + public void testCreateSimpleOption() { + GravitinoOptions gravitinoOptions = new GravitinoOptions(); + Option helpOption = + gravitinoOptions.createSimpleOption("h", GravitinoOptions.HELP, "help message"); + + assertEquals("h", helpOption.getOpt(), "Simple option short name should be 'h'."); + assertEquals("help", helpOption.getLongOpt(), "Simple option long name should be 'help'."); + assertFalse(helpOption.hasArg(), "Simple option should not require an argument."); + assertEquals( + "help message", + helpOption.getDescription(), + "Simple option should have correct description."); + } + + @Test + public void testCreateArgOption() { + GravitinoOptions gravitinoOptions = new GravitinoOptions(); + Option urlOption = gravitinoOptions.createArgOption("u", GravitinoOptions.URL, "url argument"); + + assertEquals("u", urlOption.getOpt(), "Argument option short name should be 'u'."); + assertEquals("url", urlOption.getLongOpt(), "Argument option long name should be 'url'."); + assertTrue(urlOption.hasArg(), "Argument option should require an argument."); + assertEquals( + "url argument", + urlOption.getDescription(), + "Argument option should have correct description."); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java new file mode 100644 index 00000000000..cc8d43727ef --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -0,0 +1,117 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class TestMain { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + private final PrintStream originalErr = System.err; + + @BeforeEach + public void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @AfterEach + public void restoreStreams() { + System.setOut(originalOut); + System.setErr(originalErr); + } + + @Test + public void withCommandParameters() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"--entity", "metalake", "--command", "list"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.LIST, command); + String entity = Main.resolveEntity(line); + assertEquals(CommandEntities.METALAKE, entity); + } + + @Test + public void withTwoArgsOnly() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"metalake", "details"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line); + assertEquals(CommandEntities.METALAKE, entity); + } + + @Test + public void defaultToDetails() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line); + assertNull(entity); + } + + @Test + public void withHelpOption() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"--help"}; + CommandLine line = parser.parse(options, args); + + GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, null, "help"); + commandLine.handleCommandLine(); + + assertTrue(outContent.toString().contains("usage:")); // Expected help output + } + + @Test + public void parseError() { + String[] args = {"--invalidOption"}; + + Main.main(args); + + assertTrue(errContent.toString().contains("Error parsing command line")); // Expect error + assertTrue(outContent.toString().contains("usage:")); // Expect help output + } +} diff --git a/settings.gradle.kts b/settings.gradle.kts index e98f81d39c0..1a67c28b540 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -46,7 +46,8 @@ include( "clients:client-java-runtime", "clients:filesystem-hadoop3", "clients:filesystem-hadoop3-runtime", - "clients:client-python" + "clients:client-python", + "clients:cli", ) include("iceberg:iceberg-common") include("iceberg:iceberg-rest-server") From 655d13380881b28eff0be3e17fe7a36ae7b043d1 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 14:05:50 +1000 Subject: [PATCH 02/83] update CLI option with output --- clients/cli/README.md | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/clients/cli/README.md b/clients/cli/README.md index f6f52693cf9..10f97fd730b 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -55,16 +55,23 @@ Before you can build and run this project, it is suggested you have the followin To run the Gravitino CLI, use the following command structure: ```bash -java -jar gravitino-cli.jar [options] +usage: gcli [options] Options --h, --help: Display help information --v, --version: Display the Gravitino server version --u, --url : Specify the Gravitino server URL (default: http://localhost:8090) --m, --metalake : Specify the Metalake to operate on --c, --catalog : Specify the Catalog to operate on --s, --schema : Specify the Schema to operate on --t, --table : Specify the Table to operate on --x, --command : Specify the action (list, details, create, delete, or update) + -c,--catalog catalog name + -C,--create create an entity + -D,--details list details about an entity + -e,--entity entity type + -f,--name full entity name (dot separated) + -h,--help command help information + -L,--list list entity children + -m,--metalake metalake name + -R,--delete delete an entity + -s,--schema schema name + -t,--table table name + -u,--url Gravitino URL (default: http://localhost:8090) + -U,--update update an entity + -v,--version Gravitino version + -x,--command one of: list, details, create, delete, or update ``` ## Commands From 4a29c8bcfe771455f824bd5ad0eac39f7f7da491 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 15:12:47 +1000 Subject: [PATCH 03/83] Add missing license header --- clients/cli/README.md | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/clients/cli/README.md b/clients/cli/README.md index 10f97fd730b..3e089c20a4d 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -1,3 +1,22 @@ + + # Apache Gravitino CLI Apache Gravitino CLI is a command-line tool that interacts with the Gravitino server to manage and query entities like metalakes, catalogs, schemas, and tables. The tool provides options for listing information about Gravitino entities and in future versions support creating, deleting, and updating these entities. From 1b12effa7724db980eb14be3bb62e256161a3193 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 15:13:01 +1000 Subject: [PATCH 04/83] Add default --- .../main/java/org/apache/gravitino/cli/GravitinoOptions.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index cf4bcd47b41..ae04739933b 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -51,7 +51,7 @@ public Options options() { // Add options using helper method to avoid repetition options.addOption(createSimpleOption("h", HELP, "command help information")); options.addOption(createSimpleOption("v", VERSION, "Gravitino version")); - options.addOption(createArgOption("u", URL, "Gravitino URL")); + options.addOption(createArgOption("u", URL, "Gravitino URL (default: http://localhost:8090)")); options.addOption(createArgOption("m", METALAKE, "metalake name")); options.addOption(createArgOption("c", CATALOG, "catalog name")); options.addOption(createArgOption("s", SCHEMA, "schema name")); From 75de71e537bc526565f7eb17bf87f836c302e3bf Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 15:32:57 +1000 Subject: [PATCH 05/83] Spotless on Java 11 --- settings.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settings.gradle.kts b/settings.gradle.kts index 1a67c28b540..d219a0cdf72 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -47,7 +47,7 @@ include( "clients:filesystem-hadoop3", "clients:filesystem-hadoop3-runtime", "clients:client-python", - "clients:cli", + "clients:cli" ) include("iceberg:iceberg-common") include("iceberg:iceberg-rest-server") From 5172afa25d027ee46fdaf5f881fb63d112d476f7 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 16:08:18 +1000 Subject: [PATCH 06/83] Ignore warnings in test with Java 11 --- .../src/test/java/org/apache/gravitino/cli/TestMain.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index cc8d43727ef..425dd3f8b9d 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -25,6 +25,7 @@ import java.io.ByteArrayOutputStream; import java.io.PrintStream; +import java.io.UnsupportedEncodingException; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.CommandLineParser; import org.apache.commons.cli.DefaultParser; @@ -93,7 +94,8 @@ public void defaultToDetails() throws ParseException { } @Test - public void withHelpOption() throws ParseException { + @SuppressWarnings("DefaultCharset") + public void withHelpOption() throws ParseException, UnsupportedEncodingException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); String[] args = {"--help"}; @@ -106,7 +108,8 @@ public void withHelpOption() throws ParseException { } @Test - public void parseError() { + @SuppressWarnings("DefaultCharset") + public void parseError() throws UnsupportedEncodingException { String[] args = {"--invalidOption"}; Main.main(args); From 0dc885668eca2fbeb87a50cf61d617bda03fa704 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 16:39:59 +1000 Subject: [PATCH 07/83] Disable two tests on JAVA 17 --- .../src/test/java/org/apache/gravitino/cli/TestFulllName.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 07582b9cfb7..fc3141423b2 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -75,6 +75,7 @@ public void entityFromCommandLineOption() throws Exception { assertEquals("metalake_demo", metalakeName); } + @DisablesOnJre(JRE.JAVA_17) @Test public void entityFromEnvironmentVariable() throws Exception { String[] args = {}; // No command line metalake option @@ -103,6 +104,7 @@ public void entityFromFullNameOption() throws Exception { assertEquals("tableD", tableName); } + @DisablesOnJre(JRE.JAVA_17) @Test public void entityFromFullNameOptionWithoutMetalake() throws Exception { String[] args = {"--name", "catalogB.schemaC.tableD"}; From 24dee9e5efc26e5a5d53097ba7e778dea4536e7e Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 16:52:43 +1000 Subject: [PATCH 08/83] disabling two tests for now --- .../src/test/java/org/apache/gravitino/cli/TestFulllName.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index fc3141423b2..57651031dea 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -75,7 +75,7 @@ public void entityFromCommandLineOption() throws Exception { assertEquals("metalake_demo", metalakeName); } - @DisablesOnJre(JRE.JAVA_17) + @DDisable("Issues on Java 11 and 17") @Test public void entityFromEnvironmentVariable() throws Exception { String[] args = {}; // No command line metalake option @@ -104,7 +104,7 @@ public void entityFromFullNameOption() throws Exception { assertEquals("tableD", tableName); } - @DisablesOnJre(JRE.JAVA_17) + @DDisable("Issues on Java 11 and 17") @Test public void entityFromFullNameOptionWithoutMetalake() throws Exception { String[] args = {"--name", "catalogB.schemaC.tableD"}; From 0ddbb7d94bf48a0a9798c2c6cb8a595e27caff0e Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 16:58:01 +1000 Subject: [PATCH 09/83] fix disabled tests --- .../test/java/org/apache/gravitino/cli/TestFulllName.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 57651031dea..e2796fb8779 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -31,6 +31,7 @@ import org.apache.gravitino.cli.GravitinoOptions; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; public class TestFulllName { @@ -75,7 +76,7 @@ public void entityFromCommandLineOption() throws Exception { assertEquals("metalake_demo", metalakeName); } - @DDisable("Issues on Java 11 and 17") + @Disabled("Issues on Java 11 and 17") @Test public void entityFromEnvironmentVariable() throws Exception { String[] args = {}; // No command line metalake option @@ -104,7 +105,7 @@ public void entityFromFullNameOption() throws Exception { assertEquals("tableD", tableName); } - @DDisable("Issues on Java 11 and 17") + @Disabled("Issues on Java 11 and 17") @Test public void entityFromFullNameOptionWithoutMetalake() throws Exception { String[] args = {"--name", "catalogB.schemaC.tableD"}; From 4b95dd3d1daae9001bf825047704ba0b9968dffc Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 17:47:17 +1000 Subject: [PATCH 10/83] Still having issues on Java 17 --- .../src/test/java/org/apache/gravitino/cli/TestFulllName.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index e2796fb8779..c905f34f6a5 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -41,7 +41,6 @@ public class TestFulllName { private static Map envMap; /* Used to simulate setting environment variables. */ - @BeforeAll public static void accessFields() throws Exception { envMap = new HashMap<>(); Class clazz = Class.forName("java.lang.ProcessEnvironment"); @@ -56,7 +55,7 @@ private static void removeStaticFinalAndSetValue(Field field, Object value) thro Field modifiersField = Field.class.getDeclaredField("modifiers"); modifiersField.setAccessible(true); modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, value); + field.set(null, value); } @BeforeEach From f76fa16b1f392b8e3cf0db6f6fa9d0d15cf7043d Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 2 Oct 2024 22:07:29 +1000 Subject: [PATCH 11/83] remove two tests as Java 17 is still giving issues --- .../apache/gravitino/cli/TestFulllName.java | 60 ------------------- 1 file changed, 60 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index c905f34f6a5..6cc56249424 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -20,49 +20,21 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; -import java.util.HashMap; -import java.util.Map; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.Options; import org.apache.gravitino.cli.FullName; import org.apache.gravitino.cli.GravitinoOptions; -import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; public class TestFulllName { private Options options; - private static final Map DEFAULTS = new HashMap<>(System.getenv()); - private static Map envMap; - - /* Used to simulate setting environment variables. */ - public static void accessFields() throws Exception { - envMap = new HashMap<>(); - Class clazz = Class.forName("java.lang.ProcessEnvironment"); - Field environmentField = clazz.getDeclaredField("theEnvironment"); - Field unmodifiableEnvironmentField = clazz.getDeclaredField("theUnmodifiableEnvironment"); - removeStaticFinalAndSetValue(environmentField, envMap); - removeStaticFinalAndSetValue(unmodifiableEnvironmentField, envMap); - } - - private static void removeStaticFinalAndSetValue(Field field, Object value) throws Exception { - field.setAccessible(true); - Field modifiersField = Field.class.getDeclaredField("modifiers"); - modifiersField.setAccessible(true); - modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); - field.set(null, value); - } @BeforeEach public void setUp() { options = new GravitinoOptions().options(); - envMap.clear(); - envMap.putAll(DEFAULTS); } @Test @@ -75,19 +47,6 @@ public void entityFromCommandLineOption() throws Exception { assertEquals("metalake_demo", metalakeName); } - @Disabled("Issues on Java 11 and 17") - @Test - public void entityFromEnvironmentVariable() throws Exception { - String[] args = {}; // No command line metalake option - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - System.getenv().put("GRAVITINO_METALAKE", "metalake_env"); - - String metalakeName = fullName.getMetalakeName(); - assertEquals("metalake_env", metalakeName); - } - @Test public void entityFromFullNameOption() throws Exception { String[] args = {"--name", "metalakeA.catalogB.schemaC.tableD"}; @@ -104,25 +63,6 @@ public void entityFromFullNameOption() throws Exception { assertEquals("tableD", tableName); } - @Disabled("Issues on Java 11 and 17") - @Test - public void entityFromFullNameOptionWithoutMetalake() throws Exception { - String[] args = {"--name", "catalogB.schemaC.tableD"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - System.getenv().put("GRAVITINO_METALAKE", "metalake_env"); - - String metalakeName = fullName.getMetalakeName(); - assertEquals("metalake_env", metalakeName); - String catalogName = fullName.getCatalogName(); - assertEquals("catalogB", catalogName); - String schemaName = fullName.getSchemaName(); - assertEquals("schemaC", schemaName); - String tableName = fullName.getTableName(); - assertEquals("tableD", tableName); - } - @Test public void entityNotFound() throws Exception { String[] args = {}; From 8cbc605872c287c90b0fcf49464ffa299f390446 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 3 Oct 2024 08:38:26 +1000 Subject: [PATCH 12/83] No need to copy CLI for IT tests --- build.gradle.kts | 1 + 1 file changed, 1 insertion(+) diff --git a/build.gradle.kts b/build.gradle.kts index dfac198af9e..42b6352b23f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -756,6 +756,7 @@ tasks { subprojects.forEach() { if (!it.name.startsWith("catalog") && !it.name.startsWith("client") && + !it.name.startsWith("cli") && !it.name.startsWith("authorization") && !it.name.startsWith("filesystem") && !it.name.startsWith("spark") && From 0ec7ecb5e0b1c44263e04ad63ab79bfacff0d139 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 9 Oct 2024 08:51:23 -0600 Subject: [PATCH 13/83] create catalogs and other entities --- clients/cli/README.md | 94 +++++++++++--- clients/cli/errors.sh | 12 ++ clients/cli/examples.sh | 40 +++++- .../apache/gravitino/cli/CommandActions.java | 6 + .../apache/gravitino/cli/ErrorMessages.java | 4 + .../org/apache/gravitino/cli/FullName.java | 16 ++- .../gravitino/cli/GravitinoCommandLine.java | 117 ++++++++++++++++++ .../apache/gravitino/cli/GravitinoConfig.java | 69 +++++++++++ .../gravitino/cli/GravitinoOptions.java | 32 ++++- .../java/org/apache/gravitino/cli/Main.java | 43 ++++--- .../org/apache/gravitino/cli/Providers.java | 92 ++++++++++++++ .../gravitino/cli/commands/CreateCatalog.java | 79 ++++++++++++ .../cli/commands/CreateHadoopCatalog.java | 37 ++++++ .../cli/commands/CreateHiveCatalog.java | 44 +++++++ .../cli/commands/CreateIcebergCatalog.java | 48 +++++++ .../cli/commands/CreateKafkaCatalog.java | 44 +++++++ .../cli/commands/CreateMetalake.java | 58 +++++++++ .../cli/commands/CreateMySQLCatalog.java | 51 ++++++++ .../cli/commands/CreatePostgresCatalog.java | 54 ++++++++ .../gravitino/cli/commands/CreateSchema.java | 72 +++++++++++ .../gravitino/cli/commands/DeleteCatalog.java | 69 +++++++++++ .../cli/commands/DeleteMetalake.java | 60 +++++++++ .../gravitino/cli/commands/DeleteSchema.java | 76 ++++++++++++ .../gravitino/cli/commands/DeleteTable.java | 85 +++++++++++++ .../cli/commands/ListCatalogProperties.java | 68 ++++++++++ .../cli/commands/ListMetalakeProperties.java | 62 ++++++++++ .../cli/commands/ListProperties.java | 54 ++++++++ .../cli/commands/ListSchemaProperties.java | 75 +++++++++++ .../cli/commands/MetalakeDetails.java | 1 + .../cli/commands/RemoveCatalogProperty.java | 69 +++++++++++ .../cli/commands/RemoveMetalakeProperty.java | 62 ++++++++++ .../cli/commands/RemoveSchemaProperty.java | 77 ++++++++++++ .../cli/commands/SetCatalogProperty.java | 73 +++++++++++ .../cli/commands/SetMetalakeProperty.java | 65 ++++++++++ .../cli/commands/SetSchemaProperty.java | 80 ++++++++++++ .../cli/commands/UpdateCatalogComment.java | 69 +++++++++++ .../cli/commands/UpdateCatalogName.java | 65 ++++++++++ .../cli/commands/UpdateMetalakeComment.java | 62 ++++++++++ .../cli/commands/UpdateMetalakeName.java | 62 ++++++++++ .../gravitino/cli/TestCommandActions.java | 8 +- .../apache/gravitino/cli/TestFulllName.java | 11 +- .../org/apache/gravitino/cli/TestMain.java | 67 +++++++++- 42 files changed, 2284 insertions(+), 48 deletions(-) create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/Providers.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java diff --git a/clients/cli/README.md b/clients/cli/README.md index 3e089c20a4d..3d8ef718d32 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -75,24 +75,42 @@ To run the Gravitino CLI, use the following command structure: ```bash usage: gcli [options] -Options - -c,--catalog catalog name - -C,--create create an entity - -D,--details list details about an entity - -e,--entity entity type - -f,--name full entity name (dot separated) - -h,--help command help information - -L,--list list entity children - -m,--metalake metalake name - -R,--delete delete an entity - -s,--schema schema name - -t,--table table name - -u,--url Gravitino URL (default: http://localhost:8090) - -U,--update update an entity - -v,--version Gravitino version - -x,--command one of: list, details, create, delete, or update + -b,--bootstrap Kafka bootstrap servers + -c,--catalog catalog name + -C,--create create an entity + -D,--details list details about an entity + -d,--database database name + -e,--entity entity type + -h,--help command help information + -j,--jdbcurl JDBC URL + -L,--list list entity children + -m,--metastore Hive metastore URI + -n,--name full entity name (dot separated) + -P,--properties show an entities properties + -p,--password database password + -R,--delete delete an entity + -r,--rename new entity name + -s,--schema schema name + -t,--table table name + -u,--user database username + -U,--update update an entity + -v,--value property value + -w,--warehouse warehouse name + -x,--command one of: list, details, create, delete, or update ``` +The command line can be used in several ways to achieve the same results, depending on your preference. +```bash +gcli catalog details --name metalake_demo.catalog_postgres +gcli catalog --command details -name metalake_demo.catalog_postgres +gcli --entity catalog --command details -name metalake_demo.catalog_postgres +gcli catalog details --metalake metalake_demo --catalog catalog_postgres +gcli details --metalake metalake_demo --catalog catalog_postgres +gcli --metalake metalake_demo --catalog catalog_postgres +gcli --command details --metalake metalake_demo --catalog catalog_postgres +``` +The form `gcli [options]` is used in this document. + ## Commands The following commands are available for entity management: @@ -112,15 +130,55 @@ gcli list Get Details of a Specific Metalake ```bash -gcli metalake details -name my-metalake +gcli metalake details -name my_metalake ``` List Tables in a Catalog ```bash -gcli metalake list -name my-metalake.my-catalog +gcli metalake list -name my_metalake.my_catalog +``` + +Create a Metalake + +```bash +gcli metalake create -name my_metalake -comment "This is my metalake" ``` +Create a Catalog + +```bash +gcli catalog create -name metalake_demo.iceberg --provider iceberg --metastore thrift://hive-host:9083 --warehouse hdfs://hdfs-host:9000/user/iceberg/warehouse +``` + +Delete a Catalog + +```bash +gcli catalog delete -name my_metalake.my_catalog +``` + +Rename a Metalake + +```bash +gcli metalake update -name metalake_demo -rename demo +``` + +Update a Metalake's comment + +```bash +gcli metalake update -name metalake_demo -comment "new comment" +``` + +### Setting Metalake name + +As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways. + +1. Passed in on the command line either as the first part of the entities name or via the `--metalake` parameter. +2. Set via the 'GRAVITINO_METALAKE' environment variable. +3. Placed in the Gravitino configuration file `~/.gravitino` by adding a line like `metalake=metalake_demo`. + +The command line option overrides the other options and the environment variable overrides the value in the configuration file. + ## Running Tests This project includes a suite of unit tests to verify its functionality. diff --git a/clients/cli/errors.sh b/clients/cli/errors.sh index bc67633c06a..9d0571742de 100644 --- a/clients/cli/errors.sh +++ b/clients/cli/errors.sh @@ -41,6 +41,9 @@ gcli unknown list # Name not specified gcli metalake details +# Too many arguments +gcli metalake details more + # Unknown metalake name gcli metalake details --name unknown @@ -49,3 +52,12 @@ gcli catalog details --name metalake_demo.unknown # Unknown catalog name gcli catalog details --name metalake_demo + +# Already exists +gcli metalake create -name metalake_demo + +# Doesn't exist +gcli metalake delete -name unknown-metalake + +# Malformed name +gcli catalog details -name metalake_demo diff --git a/clients/cli/examples.sh b/clients/cli/examples.sh index 757ef89f017..38ff8c96525 100755 --- a/clients/cli/examples.sh +++ b/clients/cli/examples.sh @@ -39,7 +39,7 @@ gcli list # metalake details (all these command are equivalent) gcli metalake details --name metalake_demo gcli metalake details --metalake metalake_demo -gcli --command details --metalake metalake_demo +gcli metalake --command details --metalake metalake_demo gcli metalake --name metalake_demo details gcli details --name metalake_demo gcli details --metalake metalake_demo @@ -74,6 +74,44 @@ gcli table list --name metalake_demo.catalog_postgres.hr.departments gcli table list --name metalake_demo.catalog_mysql.db.iceberg_tables gcli table list --name metalake_demo.catalog_hive.sales.products +# Metalkes operations +gcli metalake create --name my_metalake --comment "This is my metalake" +gcli metalake delete --name my_metalake +gcli metalake update --name metalake_demo --rename demo +gcli metalake update --name demo --rename metalake_demo +gcli metalake update --name metalake_demo --comment "new comment" +gcli metalake properties --name metalake_demo +gcli metalake set --name metalake_demo --property test --value value +gcli metalake remove --name metalake_demo --property test + +# Catalog operations +gcli catalog create -name metalake_demo.hive --provider hive --metastore thrift://hive-host:9083 +gcli catalog create -name metalake_demo.iceberg --provider iceberg --metastore thrift://hive-host:9083 --warehouse hdfs://hdfs-host:9000/user/iceberg/warehouse +gcli catalog create -name metalake_demo.mysql --provider mysql --jdbcurl "jdbc:mysql://mysql-host:3306?useSSL=false" --user user --password password +gcli catalog create -name metalake_demo.postgres --provider postgres --jdbcurl jdbc:postgresql://postgresql-host/mydb --user user --password password -database db +gcli catalog create -name metalake_demo.kafka --provider kafka -bootstrap 127.0.0.1:9092,127.0.0.2:9092 +gcli catalog delete -name metalake_demo.hive +gcli catalog delete -name metalake_demo.iceberg +gcli catalog delete -name metalake_demo.mysql +gcli catalog delete -name metalake_demo.postres +gcli catalog delete -name metalake_demo.kafka +gcli catalog update --name metalake_demo.catalog_mysql --rename mysql +gcli catalog update --name metalake_demo.mysql --rename catalog_mysql +gcli catalog update --name metalake_demo.catalog_mysql --comment "new comment" +gcli catalog properties --name metalake_demo.catalog_mysql +gcli catalog set --name metalake_demo.catalog_mysql --property test --value value +gcli catalog remove --name metalake_demo.catalog_mysql --property test + +# Schema operations +gcli schema create -name metalake_demo.catalog_postgres.new_db +gcli schema delete -name metalake_demo.catalog_postgres.public +gcli schema properties --name metalake_demo.catalog_postgres.hr +gcli schema set --name metalake_demo.catalog_postgres.hr --property test --value value # not currently supported +gcli schema remove --name metalake_demo.catalog_postgres.hr --property test # not currently supported + +# Table operations +gcli table delete -name metalake_demo.catalog_postgres.hr.salaries + # Exmaples where metalake is set in an evironment variable export GRAVITINO_METALAKE=metalake_demo diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java index 1077f437c9d..48b9bc23826 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandActions.java @@ -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 VALID_COMMANDS = new HashSet<>(); @@ -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); } /** diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java index 847b96516c0..0e7816ae437 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java @@ -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."; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index 15a94699fba..14b6af9374a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -45,6 +45,7 @@ public FullName(CommandLine line) { */ public String getMetalakeName() { String metalakeEnv = System.getenv("GRAVITINO_METALAKE"); + GravitinoConfig config = new GravitinoConfig(null); // Check if the metalake name is specified as a command line option if (line.hasOption(GravitinoOptions.METALAKE)) { @@ -52,8 +53,17 @@ public String getMetalakeName() { // Check if the metalake name is set as an environment variable } else if (metalakeEnv != null) { return metalakeEnv; - // Extract the metalake name from the full name option - } else if (line.hasOption(GravitinoOptions.NAME)) { + // 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 config.getMetalakeName(); + } + } + + // Extract the metalake name from the full name option + if (line.hasOption(GravitinoOptions.NAME)) { return line.getOptionValue(GravitinoOptions.NAME).split("\\.")[0]; } @@ -109,7 +119,7 @@ public String getNamePart(String entity, int position) { position = position - 1; } - if (names.length < position) { + if (names.length - 1 < position) { System.err.println(ErrorMessages.MALFORMED_NAME); return null; } 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 0a91a2e596a..8c60ec25a84 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 @@ -24,14 +24,39 @@ import org.apache.commons.cli.Options; import org.apache.gravitino.cli.commands.AllMetalakeDetails; import org.apache.gravitino.cli.commands.CatalogDetails; +import org.apache.gravitino.cli.commands.CreateHadoopCatalog; +import org.apache.gravitino.cli.commands.CreateHiveCatalog; +import org.apache.gravitino.cli.commands.CreateIcebergCatalog; +import org.apache.gravitino.cli.commands.CreateKafkaCatalog; +import org.apache.gravitino.cli.commands.CreateMetalake; +import org.apache.gravitino.cli.commands.CreateMySQLCatalog; +import org.apache.gravitino.cli.commands.CreatePostgresCatalog; +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.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.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; import org.apache.gravitino.cli.commands.Version; /* Gravitino Command line */ @@ -113,6 +138,29 @@ protected void handleMetalakeCommand() { new MetalakeDetails(url, metalake).handle(); } else if (CommandActions.LIST.equals(command)) { new ListCatalogs(url, metalake).handle(); + } else if (CommandActions.CREATE.equals(command)) { + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + new CreateMetalake(url, metalake, comment).handle(); + } else if (CommandActions.DELETE.equals(command)) { + new DeleteMetalake(url, metalake).handle(); + } else if (CommandActions.SET.equals(command)) { + String property = line.getOptionValue(GravitinoOptions.PROPERTY); + String value = line.getOptionValue(GravitinoOptions.VALUE); + new SetMetalakeProperty(url, metalake, property, value).handle(); + } else if (CommandActions.REMOVE.equals(command)) { + String property = line.getOptionValue(GravitinoOptions.PROPERTY); + new RemoveMetalakeProperty(url, metalake, property).handle(); + } else if (CommandActions.PROPERTIES.equals(command)) { + new ListMetalakeProperties(url, metalake).handle(); + } else if (CommandActions.UPDATE.equals(command)) { + if (line.hasOption(GravitinoOptions.COMMENT)) { + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + new UpdateMetalakeComment(url, metalake, comment).handle(); + } + if (line.hasOption(GravitinoOptions.RENAME)) { + String newName = line.getOptionValue(GravitinoOptions.RENAME); + new UpdateMetalakeName(url, metalake, newName).handle(); + } } } @@ -129,6 +177,57 @@ protected void handleCatalogCommand() { new CatalogDetails(url, metalake, catalog).handle(); } else if (CommandActions.LIST.equals(command)) { new ListSchema(url, metalake, catalog).handle(); + } else if (CommandActions.CREATE.equals(command)) { + String provider = line.getOptionValue(GravitinoOptions.PROVIDER); + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + if (provider.equals(Providers.HIVE)) { + String metastore = line.getOptionValue(GravitinoOptions.METASTORE); + new CreateHiveCatalog(url, metalake, catalog, provider, comment, metastore).handle(); + } else if (provider.equals(Providers.ICEBERG)) { + String metastore = line.getOptionValue(GravitinoOptions.METASTORE); + String warehouse = line.getOptionValue(GravitinoOptions.WAREHOUSE); + new CreateIcebergCatalog(url, metalake, catalog, provider, comment, metastore, warehouse) + .handle(); + } else if (provider.equals(Providers.MYSQL)) { + String jdbcurl = line.getOptionValue(GravitinoOptions.JDBCURL); + String user = line.getOptionValue(GravitinoOptions.USER); + String password = line.getOptionValue(GravitinoOptions.PASSWORD); + new CreateMySQLCatalog(url, metalake, catalog, provider, comment, jdbcurl, user, password) + .handle(); + } else if (provider.equals(Providers.POSTGRES)) { + String jdbcurl = line.getOptionValue(GravitinoOptions.JDBCURL); + String user = line.getOptionValue(GravitinoOptions.USER); + String password = line.getOptionValue(GravitinoOptions.PASSWORD); + String database = line.getOptionValue(GravitinoOptions.DATABASE); + new CreatePostgresCatalog( + url, metalake, catalog, provider, comment, jdbcurl, user, password, database) + .handle(); + } else if (provider.equals(Providers.HADOOP)) { + new CreateHadoopCatalog(url, metalake, catalog, provider, comment).handle(); + } else if (provider.equals(Providers.KAFKA)) { + String bootstrap = line.getOptionValue(GravitinoOptions.BOOTSTRAP); + new CreateKafkaCatalog(url, metalake, catalog, provider, comment, bootstrap).handle(); + } + } else if (CommandActions.DELETE.equals(command)) { + new DeleteCatalog(url, metalake, catalog).handle(); + } else if (CommandActions.SET.equals(command)) { + String property = line.getOptionValue(GravitinoOptions.PROPERTY); + String value = line.getOptionValue(GravitinoOptions.VALUE); + new SetCatalogProperty(url, metalake, catalog, property, value).handle(); + } else if (CommandActions.REMOVE.equals(command)) { + String property = line.getOptionValue(GravitinoOptions.PROPERTY); + new RemoveCatalogProperty(url, metalake, catalog, property).handle(); + } else if (CommandActions.PROPERTIES.equals(command)) { + new ListCatalogProperties(url, metalake, catalog).handle(); + } else if (CommandActions.UPDATE.equals(command)) { + if (line.hasOption(GravitinoOptions.COMMENT)) { + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + new UpdateCatalogComment(url, metalake, catalog, comment).handle(); + } + if (line.hasOption(GravitinoOptions.RENAME)) { + String newName = line.getOptionValue(GravitinoOptions.RENAME); + new UpdateCatalogName(url, metalake, catalog, newName).handle(); + } } } @@ -146,6 +245,20 @@ protected void handleSchemaCommand() { new SchemaDetails(url, metalake, catalog, schema).handle(); } else if (CommandActions.LIST.equals(command)) { new ListTables(url, metalake, catalog, schema).handle(); + } else if (CommandActions.CREATE.equals(command)) { + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + new CreateSchema(url, metalake, catalog, schema, comment).handle(); + } else if (CommandActions.DELETE.equals(command)) { + new DeleteSchema(url, 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, metalake, catalog, schema, property, value).handle(); + } else if (CommandActions.REMOVE.equals(command)) { + String property = line.getOptionValue(GravitinoOptions.PROPERTY); + new RemoveSchemaProperty(url, metalake, catalog, schema, property).handle(); + } else if (CommandActions.PROPERTIES.equals(command)) { + new ListSchemaProperties(url, metalake, catalog, schema).handle(); } } @@ -164,6 +277,10 @@ protected void handleTableCommand() { new TableDetails(url, metalake, catalog, schema, table).handle(); } else if (CommandActions.LIST.equals(command)) { new ListColumns(url, metalake, catalog, schema, table).handle(); + } else if (CommandActions.CREATE.equals(command)) { + // TODO + } else if (CommandActions.DELETE.equals(command)) { + new DeleteTable(url, metalake, catalog, schema, table).handle(); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java new file mode 100644 index 00000000000..e5926a25b03 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.Properties; + +public class GravitinoConfig { + + private static String defaultFile = ".gravitino"; + + private String configFile; + private String metalake; + + public GravitinoConfig(String file) { + if (file == null) { + configFile = System.getProperty("user.home") + "/" + defaultFile; + } else { + configFile = file; + } + } + + public boolean fileExists() { + File file = new File(configFile); + return file.exists(); + } + + public void read() { + String key = "metalake"; + Properties prop = new Properties(); + + try (FileInputStream stream = new FileInputStream(configFile)) { + prop.load(stream); + } catch (FileNotFoundException ex) { + // ignore as config file is optional + return; + } catch (IOException exp) { + System.err.println(exp.getMessage()); + } + + if (prop.containsKey(key)) { + metalake = prop.getProperty(key); + } + } + + public String getMetalakeName() { + return metalake; + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index ae04739933b..4ccfd83b12e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -39,6 +39,19 @@ public class GravitinoOptions { public static final String CREATE = "create"; public static final String UPDATE = "update"; public static final String DELETE = "delete"; + public static final String COMMENT = "comment"; + public static final String RENAME = "rename"; + public static final String PROPERTY = "property"; + public static final String VALUE = "value"; + public static final String PROPERTIES = "properties"; + public static final String PROVIDER = "provider"; + public static final String METASTORE = "metastore"; + public static final String WAREHOUSE = "warehouse"; + public static final String JDBCURL = "jdbcurl"; + public static final String USER = "user"; + public static final String PASSWORD = "password"; + public static final String DATABASE = "database"; + public static final String BOOTSTRAP = "bootstrap"; /** * Builds and returns the CLI options for Gravitino. @@ -56,7 +69,7 @@ public Options options() { options.addOption(createArgOption("c", CATALOG, "catalog name")); options.addOption(createArgOption("s", SCHEMA, "schema name")); options.addOption(createArgOption("t", TABLE, "table name")); - options.addOption(createArgOption("f", NAME, "full entity name (dot separated)")); + options.addOption(createArgOption("n", NAME, "full entity name (dot separated)")); options.addOption(createArgOption("e", ENTITY, "entity type")); // One way of specifying the command @@ -69,6 +82,23 @@ public Options options() { options.addOption(createSimpleOption("C", CREATE, "create an entity")); options.addOption(createSimpleOption("U", UPDATE, "update an entity")); options.addOption(createSimpleOption("R", DELETE, "delete an entity")); + options.addOption(createSimpleOption("P", PROPERTIES, "show an entities properties")); + + // Create/update options + options.addOption(createArgOption("r", RENAME, "new entity name")); + options.addOption(createArgOption("d", COMMENT, "entity comment")); + options.addOption(createArgOption("p", PROPERTY, "property name")); + options.addOption(createArgOption("v", VALUE, "property value")); + options.addOption( + createArgOption( + "p", PROVIDER, "provider one of hadoop, hive, mysql, postgres, iceberg, kafka")); + options.addOption(createArgOption("m", METASTORE, "Hive metastore URI")); + options.addOption(createArgOption("w", WAREHOUSE, "warehouse name")); + options.addOption(createArgOption("b", BOOTSTRAP, "Kafka bootstrap servers")); + options.addOption(createArgOption("j", JDBCURL, "JDBC URL")); + options.addOption(createArgOption("u", USER, "database username")); + options.addOption(createArgOption("p", PASSWORD, "database password")); + options.addOption(createArgOption("d", DATABASE, "database name")); return options; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 47a01a2a587..62196c2368b 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -34,8 +34,13 @@ public static void main(String[] args) { try { CommandLine line = parser.parse(options, args); + String[] extra = line.getArgs(); + if (extra.length > 2) { + System.err.println(ErrorMessages.TOO_MANY_ARGUMENTS); + return; + } String command = resolveCommand(line); - String entity = resolveEntity(line); + String entity = resolveEntity(line, command != null); GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); commandLine.handleCommandLine(); } catch (ParseException exp) { @@ -72,7 +77,7 @@ protected static String resolveCommand(CommandLine line) { return CommandActions.UPDATE; } - /* Or as the bare second argument of two arguments. */ + /* Or as the first command or bare second argument of two arguments. */ String[] args = line.getArgs(); if (args.length == 1 || args.length == 2) { @@ -92,9 +97,10 @@ protected static String resolveCommand(CommandLine line) { * Determines the entity to act upon based on the command line input. * * @param line Parsed command line object. + * @param command true if command is an argument * @return The entity, e.g. metakalake, catalog, schema, table, etc. */ - protected static String resolveEntity(CommandLine line) { + protected static String resolveEntity(CommandLine line, boolean command) { /* Can be specified in the form --entity XXX. */ if (line.hasOption(GravitinoOptions.ENTITY)) { String entity = line.getOptionValue(GravitinoOptions.ENTITY); @@ -104,29 +110,32 @@ protected static String resolveEntity(CommandLine line) { } /* Or as --metalake, --catalog, --schema, --table etc. */ - if (line.hasOption(GravitinoOptions.METALAKE)) { - return CommandEntities.METALAKE; - } else if (line.hasOption(GravitinoOptions.CATALOG)) { - return CommandEntities.CATALOG; + if (line.hasOption(GravitinoOptions.TABLE)) { + return CommandEntities.TABLE; } else if (line.hasOption(GravitinoOptions.SCHEMA)) { return CommandEntities.SCHEMA; - } else if (line.hasOption(GravitinoOptions.TABLE)) { - return CommandEntities.TABLE; + } else if (line.hasOption(GravitinoOptions.CATALOG)) { + return CommandEntities.CATALOG; + } else if (line.hasOption(GravitinoOptions.METALAKE)) { + return CommandEntities.METALAKE; } - /* Or as the bare first argument of two arguments. */ + /* Or as the bare first argument of one or two arguments. */ String[] args = line.getArgs(); + String entity = args[0]; - if (args.length == 2) { - String entity = args[0]; - if (CommandEntities.isValidEntity(entity)) { - return entity; - } else { - System.err.println(ErrorMessages.UNKNOWN_ENTITY); - return null; + if (args.length == 1) { + if (CommandActions.isValidCommand(args[0])) { + return null; /* But not an error. */ } } + if (CommandEntities.isValidEntity(entity)) { + return entity; + } else { + System.err.println(ErrorMessages.UNKNOWN_ENTITY); + } + return null; } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Providers.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Providers.java new file mode 100644 index 00000000000..a03861c39a8 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Providers.java @@ -0,0 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import java.util.HashSet; +import org.apache.gravitino.Catalog; + +/** + * The {@code CommandEntities} class defines a set of standard entities that can be used in the + * Gravitino CLI. It also can validate if a given entity is a valid entity. + */ +public class Providers { + public static final String HIVE = "hive"; + public static final String HADOOP = "hadoop"; + public static final String ICEBERG = "iceberg"; + public static final String MYSQL = "mysql"; + public static final String POSTGRES = "postgres"; + public static final String KAFKA = "kafka"; + + private static final HashSet VALID_PROVIDERS = new HashSet<>(); + + static { + VALID_PROVIDERS.add(HIVE); + VALID_PROVIDERS.add(HADOOP); + VALID_PROVIDERS.add(ICEBERG); + VALID_PROVIDERS.add(MYSQL); + VALID_PROVIDERS.add(POSTGRES); + VALID_PROVIDERS.add(KAFKA); + } + + /** + * Checks if a given provider is a valid provider. + * + * @param provider The provider to check. + * @return true if the provider is valid, false otherwise. + */ + public static boolean isValidProvider(String provider) { + return VALID_PROVIDERS.contains(provider); + } + + public static String internal(String provider) { + switch (provider) { + case HIVE: + return "hive"; + case HADOOP: + return "hadoop"; + case MYSQL: + return "jdbc-mysql"; + case POSTGRES: + return "jdbc-postgresql"; + case ICEBERG: + return "lakehouse-iceberg"; + case KAFKA: + return "kafka"; + } + + return null; + } + + public static Catalog.Type catalogType(String provider) { + switch (provider) { + case HADOOP: + return Catalog.Type.FILESET; + case HIVE: + case MYSQL: + case POSTGRES: + case ICEBERG: + return Catalog.Type.RELATIONAL; + case KAFKA: + return Catalog.Type.MESSAGING; + } + + return null; + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java new file mode 100644 index 00000000000..815a5944c87 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java @@ -0,0 +1,79 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.HashMap; +import java.util.Map; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.cli.Providers; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.CatalogAlreadyExistsException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +public class CreateCatalog extends Command { + protected String metalake; + protected String catalog; + protected String provider; + protected String comment; + Map properties; + + /** + * Create a new catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param provider The provider/type of catalog. + * @param comment The catalog's comment. + */ + public CreateCatalog( + String url, String metalake, String catalog, String provider, String comment) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.provider = provider; + this.comment = comment; + properties = new HashMap<>(); + } + + /** Create a new catalog. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + client.createCatalog( + catalog, + Providers.catalogType(provider), + Providers.internal(provider), + comment, + properties); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.METALAKE_EXISTS); + return; + } catch (CatalogAlreadyExistsException err) { + System.err.println(ErrorMessages.CATALOG_EXISTS); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(catalog + " created"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java new file mode 100644 index 00000000000..6a1102270fa --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java @@ -0,0 +1,37 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +public class CreateHadoopCatalog extends CreateCatalog { + + /** + * Create a new Hadoop catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param provider The provider/type of catalog. + * @param comment The catalog's comment. + */ + public CreateHadoopCatalog( + String url, String metalake, String catalog, String provider, String comment) { + super(url, metalake, catalog, provider, comment); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java new file mode 100644 index 00000000000..e14e8aee9a6 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +public class CreateHiveCatalog extends CreateCatalog { + + /** + * Create a new Hive catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param provider The provider/type of catalog. + * @param comment The catalog's comment. + * @param metastore The Hive metastore URL. + */ + public CreateHiveCatalog( + String url, + String metalake, + String catalog, + String provider, + String comment, + String metastore) { + super(url, metalake, catalog, provider, comment); + properties.put("metastore.uris", metastore); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java new file mode 100644 index 00000000000..99f1a084d3c --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +public class CreateIcebergCatalog extends CreateCatalog { + + /** + * Create a new Iceberg catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param provider The provider/type of catalog. + * @param comment The catalog's comment. + * @param metastore The Hive metastore URL. + * @param warehouse The Iceberg warehouse. + */ + public CreateIcebergCatalog( + String url, + String metalake, + String catalog, + String provider, + String comment, + String metastore, + String warehouse) { + super(url, metalake, catalog, provider, comment); + properties.put("uri", metastore); + properties.put("catalog-backend", "hive"); + properties.put("warehouse", warehouse); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java new file mode 100644 index 00000000000..f0780ecc9cd --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java @@ -0,0 +1,44 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +public class CreateKafkaCatalog extends CreateCatalog { + + /** + * Create a new Kafka catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param provider The provider/type of catalog. + * @param comment The catalog's comment. + * @param bootstrap The Hive metastore URL. + */ + public CreateKafkaCatalog( + String url, + String metalake, + String catalog, + String provider, + String comment, + String bootstrap) { + super(url, metalake, catalog, provider, comment); + properties.put("bootstrap.servers", bootstrap); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java new file mode 100644 index 00000000000..f032e7d7462 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java @@ -0,0 +1,58 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.exceptions.MetalakeAlreadyExistsException; + +public class CreateMetalake extends Command { + protected String metalake; + protected String comment; + + /** + * Create a new metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param comment The metalake's comment. + */ + public CreateMetalake(String url, String metalake, String comment) { + super(url); + this.metalake = metalake; + this.comment = comment; + } + + /** Create a new metalake. */ + public void handle() { + try { + GravitinoAdminClient client = buildAdminClient(); + client.createMetalake(metalake, comment, null); + } catch (MetalakeAlreadyExistsException err) { + System.err.println(ErrorMessages.METALAKE_EXISTS); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(metalake + " created"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java new file mode 100644 index 00000000000..d76a5a53658 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java @@ -0,0 +1,51 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +public class CreateMySQLCatalog extends CreateCatalog { + + /** + * Create a new MySQL catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param provider The provider/type of catalog. + * @param comment The catalog's comment. + * @param jdbcurl The MySQL JDBC URL. + * @param user The MySQL user. + * @param password The MySQL user's password. + */ + public CreateMySQLCatalog( + String url, + String metalake, + String catalog, + String provider, + String comment, + String jdbcurl, + String user, + String password) { + super(url, metalake, catalog, provider, comment); + properties.put("jdbc-url", jdbcurl); + properties.put("jdbc-user", user); + properties.put("jdbc-password", password); + properties.put("jdbc-driver", "com.mysql.cj.jdbc.Driver"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java new file mode 100644 index 00000000000..f47dc924507 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +public class CreatePostgresCatalog extends CreateCatalog { + + /** + * Create a new Postgres catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param provider The provider/type of catalog. + * @param comment The catalog's comment. + * @param jdbcurl The MySQL JDBC URL. + * @param user The Posgres user. + * @param password The Postgres user's password. + * @param database The Postgres database. + */ + public CreatePostgresCatalog( + String url, + String metalake, + String catalog, + String provider, + String comment, + String jdbcurl, + String user, + String password, + String database) { + super(url, metalake, catalog, provider, comment); + properties.put("jdbc-url", jdbcurl); + properties.put("jdbc-user", user); + properties.put("jdbc-password", password); + properties.put("jdbc-database", database); + properties.put("jdbc-driver", "org.postgresql.Driver"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java new file mode 100644 index 00000000000..ee05d31bf57 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +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.SchemaAlreadyExistsException; + +public class CreateSchema extends Command { + protected String metalake; + protected String catalog; + protected String schema; + protected String comment; + + /** + * Create a new schema. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schema. + * @param comment The schema's comment. + */ + public CreateSchema(String url, String metalake, String catalog, String schema, String comment) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.schema = schema; + this.comment = comment; + } + + /** Create a new schema. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + client.loadCatalog(catalog).asSchemas().createSchema(schema, comment, null); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchCatalogException err) { + System.err.println(ErrorMessages.UNKNOWN_CATALOG); + return; + } catch (SchemaAlreadyExistsException err) { + System.err.println(ErrorMessages.SCHEMA_EXISTS); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(schema + " created"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java new file mode 100644 index 00000000000..c6e83563ab0 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +public class DeleteCatalog extends Command { + + protected String metalake; + protected String catalog; + + /** + * Delete a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + */ + public DeleteCatalog(String url, String metalake, String catalog) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + } + + /** Delete a catalog. */ + public void handle() { + boolean deleted = false; + + try { + GravitinoClient client = buildClient(metalake); + deleted = client.dropCatalog(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; + } + + if (deleted) { + System.out.println(catalog + " deleted."); + } else { + System.out.println(catalog + " not deleted."); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java new file mode 100644 index 00000000000..1791a08d83b --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java @@ -0,0 +1,60 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +public class DeleteMetalake extends Command { + protected String metalake; + + /** + * Delete a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + */ + public DeleteMetalake(String url, String metalake) { + super(url); + this.metalake = metalake; + } + + /** Delete a metalake. */ + public void handle() { + boolean deleted = false; + try { + GravitinoAdminClient client = buildAdminClient(); + deleted = client.dropMetalake(metalake); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (deleted) { + System.out.println(metalake + " deleted."); + } else { + System.out.println(metalake + " not deleted."); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java new file mode 100644 index 00000000000..430ec8ec35f --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java @@ -0,0 +1,76 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +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; + +public class DeleteSchema extends Command { + + protected String metalake; + protected String catalog; + protected String schema; + + /** + * Delete a schema. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schema. + */ + public DeleteSchema(String url, String metalake, String catalog, String schema) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.schema = schema; + } + + /** Delete a schema. */ + public void handle() { + boolean deleted = false; + + try { + GravitinoClient client = buildClient(metalake); + deleted = client.loadCatalog(catalog).asSchemas().dropSchema(schema, false); + } 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); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (deleted) { + System.out.println(schema + " deleted."); + } else { + System.out.println(schema + " not deleted."); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java new file mode 100644 index 00000000000..78d9ea32838 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java @@ -0,0 +1,85 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.NameIdentifier; +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; + +public class DeleteTable extends Command { + + protected String metalake; + protected String catalog; + protected String schema; + protected String table; + + /** + * Delete a table. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schema. + * @param table The name of the table. + */ + public DeleteTable(String url, String metalake, String catalog, String schema, String table) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.schema = schema; + this.table = table; + } + + /** Delete a table. */ + public void handle() { + boolean deleted = false; + + try { + GravitinoClient client = buildClient(metalake); + NameIdentifier name = NameIdentifier.of(schema, table); + deleted = client.loadCatalog(catalog).asTableCatalog().dropTable(name); + } 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); + return; + } catch (NoSuchTableException err) { + System.err.println(ErrorMessages.UNKNOWN_TABLE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (deleted) { + System.out.println(table + " deleted."); + } else { + System.out.println(table + " not deleted."); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java new file mode 100644 index 00000000000..0782cbfebab --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.Map; +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; + +/** List the properties of a catalog. */ +public class ListCatalogProperties extends ListProperties { + + protected String metalake; + protected String catalog; + + /** + * List the properties of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + */ + public ListCatalogProperties(String url, String metalake, String catalog) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + } + + /** List the properties of a catalog. */ + public void handle() { + Catalog gCatalog = null; + try { + GravitinoClient client = buildClient(metalake); + gCatalog = client.loadCatalog(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; + } + + Map properties = gCatalog.properties(); + printProperties(properties); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java new file mode 100644 index 00000000000..9d387a1734c --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.Map; +import org.apache.gravitino.Metalake; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** List the properties of a metalake. */ +public class ListMetalakeProperties extends ListProperties { + + protected String metalake; + + /** + * List the properties of a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + */ + public ListMetalakeProperties(String url, String metalake) { + super(url); + this.metalake = metalake; + } + + /** List the properties of a metalake. */ + public void handle() { + Metalake gMetalake = null; + try { + GravitinoAdminClient client = buildAdminClient(); + gMetalake = client.loadMetalake(metalake); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + Map properties = gMetalake.properties(); + + printProperties(properties); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java new file mode 100644 index 00000000000..44a474d0cda --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java @@ -0,0 +1,54 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.Map; + +/** List the properties of a metalake. */ +public class ListProperties extends Command { + + /** + * List the properties of an entity. + * + * @param url The URL of the Gravitino server. + */ + public ListProperties(String url) { + super(url); + } + + public void handle() { + /* Do nothing */ + } + + /** + * List the properties of an entity. + * + * @param properties The name, value pairs of properties. + */ + public void printProperties(Map properties) { + StringBuilder all = new StringBuilder(); + + for (Map.Entry property : properties.entrySet()) { + all.append(property.getKey() + "," + property.getValue() + System.lineSeparator()); + } + + System.out.print(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java new file mode 100644 index 00000000000..d7ea8696d62 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java @@ -0,0 +1,75 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.Map; +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; + +/** List the properties of a catalog. */ +public class ListSchemaProperties extends ListProperties { + + protected String metalake; + protected String catalog; + protected String schema; + + /** + * List the properties of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schema. + */ + public ListSchemaProperties(String url, String metalake, String catalog, String schema) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.schema = schema; + } + + /** List the properties of a catalog. */ + public void handle() { + Schema gSchema = null; + try { + GravitinoClient client = buildClient(metalake); + gSchema = client.loadCatalog(catalog).asSchemas().loadSchema(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); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + Map properties = gSchema.properties(); + printProperties(properties); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java index 575a11d8089..1c3d65f515d 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java @@ -25,6 +25,7 @@ /** Displays the details of a metalake. */ public class MetalakeDetails extends Command { + protected String metalake; /** diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java new file mode 100644 index 00000000000..0d0ac66f54f --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.CatalogChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Remove a property of a catalog. */ +public class RemoveCatalogProperty extends Command { + + protected String metalake; + protected String catalog; + protected String property; + + /** + * Remove a property of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param property The name of the property. + */ + public RemoveCatalogProperty(String url, String metalake, String catalog, String property) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.property = property; + } + + /** Remove a property of a catalog. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + CatalogChange change = CatalogChange.removeProperty(property); + client.alterCatalog(catalog, change); + } 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; + } + + System.out.println(property + " property removed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java new file mode 100644 index 00000000000..af61c180e20 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.MetalakeChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Remove a property of a metalake. */ +public class RemoveMetalakeProperty extends Command { + + protected String metalake; + protected String property; + + /** + * Remove a property of a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param property The name of the property. + */ + public RemoveMetalakeProperty(String url, String metalake, String property) { + super(url); + this.metalake = metalake; + this.property = property; + } + + /** Remove a property of a metalake. */ + public void handle() { + try { + GravitinoAdminClient client = buildAdminClient(); + MetalakeChange change = MetalakeChange.removeProperty(property); + client.alterMetalake(metalake, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(property + " property removed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java new file mode 100644 index 00000000000..1533ede653a --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java @@ -0,0 +1,77 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.SchemaChange; +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; + +/** Remove a property of a schema. */ +public class RemoveSchemaProperty extends Command { + + protected String metalake; + protected String catalog; + protected String schema; + protected String property; + + /** + * Remove a property of a schema. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schema. + * @param property The name of the property. + */ + public RemoveSchemaProperty( + String url, String metalake, String catalog, String schema, String property) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.schema = schema; + this.property = property; + } + + /** Remove a property of a schema. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + SchemaChange change = SchemaChange.removeProperty(property); + client.loadCatalog(catalog).asSchemas().alterSchema(schema, change); + } 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); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(property + " property removed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java new file mode 100644 index 00000000000..e78d7462adb --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java @@ -0,0 +1,73 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.CatalogChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Set a property of a catalog. */ +public class SetCatalogProperty extends Command { + + protected String metalake; + protected String catalog; + protected String property; + protected String value; + + /** + * Set a property of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param property The name of the property. + * @param value The value of the property. + */ + public SetCatalogProperty( + String url, String metalake, String catalog, String property, String value) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.property = property; + this.value = value; + } + + /** Set a property of a catalog. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + CatalogChange change = CatalogChange.setProperty(property, value); + client.alterCatalog(catalog, change); + } 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; + } + + System.out.println(catalog + " property set."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java new file mode 100644 index 00000000000..d3b835e6238 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.MetalakeChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Set a property of a metalake. */ +public class SetMetalakeProperty extends Command { + + protected String metalake; + protected String property; + protected String value; + + /** + * Set a property of a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param property The name of the property. + * @param value The value of the property. + */ + public SetMetalakeProperty(String url, String metalake, String property, String value) { + super(url); + this.metalake = metalake; + this.property = property; + this.value = value; + } + + /** Set a property of a metalake. */ + public void handle() { + try { + GravitinoAdminClient client = buildAdminClient(); + MetalakeChange change = MetalakeChange.setProperty(property, value); + client.alterMetalake(metalake, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(metalake + " property set."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java new file mode 100644 index 00000000000..b22671a316d --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java @@ -0,0 +1,80 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.SchemaChange; +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; + +/** Set a property of a schema. */ +public class SetSchemaProperty extends Command { + + protected String metalake; + protected String catalog; + protected String schema; + protected String property; + protected String value; + + /** + * Set a property of a schema. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param schema The name of the schema. + * @param property The name of the property. + * @param value The value of the property. + */ + public SetSchemaProperty( + String url, String metalake, String catalog, String schema, String property, String value) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.schema = schema; + this.property = property; + this.value = value; + } + + /** Set a property of a schema. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + SchemaChange change = SchemaChange.setProperty(property, value); + client.loadCatalog(catalog).asSchemas().alterSchema(schema, change); + } 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); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(schema + " property set."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java new file mode 100644 index 00000000000..06fde701694 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.CatalogChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Update the comment of a catalog. */ +public class UpdateCatalogComment extends Command { + + protected String metalake; + protected String catalog; + protected String comment; + + /** + * Update the comment of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param comment New metalake comment. + */ + public UpdateCatalogComment(String url, String metalake, String catalog, String comment) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.comment = comment; + } + + /** Update the comment of a catalog. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + CatalogChange change = CatalogChange.updateComment(comment); + client.alterCatalog(catalog, change); + } 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; + } + + System.out.println(catalog + " comment changed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java new file mode 100644 index 00000000000..34722b19b6f --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.CatalogChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Update the name of a catalog. */ +public class UpdateCatalogName extends Command { + + protected String metalake; + protected String catalog; + protected String name; + + /** + * Update the name of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param catalog The name of the catalog. + * @param name The new metalake name. + */ + public UpdateCatalogName(String url, String metalake, String catalog, String name) { + super(url); + this.metalake = metalake; + this.catalog = catalog; + this.name = name; + } + + /** Update the name of a catalog. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + CatalogChange change = CatalogChange.rename(name); + client.alterCatalog(catalog, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(catalog + " name changed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java new file mode 100644 index 00000000000..b9358f8e298 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.MetalakeChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Update the comment of a metalake. */ +public class UpdateMetalakeComment extends Command { + + protected String metalake; + protected String comment; + + /** + * Update the comment of a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param comment New metalake comment. + */ + public UpdateMetalakeComment(String url, String metalake, String comment) { + super(url); + this.metalake = metalake; + this.comment = comment; + } + + /** Update the comment of a metalake. */ + public void handle() { + try { + GravitinoAdminClient client = buildAdminClient(); + MetalakeChange change = MetalakeChange.updateComment(comment); + client.alterMetalake(metalake, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(metalake + " comment changed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java new file mode 100644 index 00000000000..24aab90574b --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.MetalakeChange; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoAdminClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/** Update the name of a metalake. */ +public class UpdateMetalakeName extends Command { + + protected String metalake; + protected String name; + + /** + * Update the name of a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param name The new metalake name. + */ + public UpdateMetalakeName(String url, String metalake, String name) { + super(url); + this.metalake = metalake; + this.name = name; + } + + /** Update the name of a metalake. */ + public void handle() { + try { + GravitinoAdminClient client = buildAdminClient(); + MetalakeChange change = MetalakeChange.rename(name); + client.alterMetalake(metalake, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(metalake + " name changed."); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java index a79f9961fb1..94bfea6a5af 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java @@ -27,7 +27,7 @@ public class TestCommandActions { @Test - public void ValidCommands() { + public void validCommands() { assertTrue( CommandActions.isValidCommand(CommandActions.DETAILS), "DETAILS should be a valid command"); assertTrue( @@ -38,6 +38,12 @@ public void ValidCommands() { CommandActions.isValidCommand(CommandActions.CREATE), "CREATE should be a valid command"); assertTrue( CommandActions.isValidCommand(CommandActions.DELETE), "DELETE should be a valid command"); + assertTrue(CommandActions.isValidCommand(CommandActions.SET), "SET should be a valid command"); + assertTrue( + CommandActions.isValidCommand(CommandActions.REMOVE), "REMOVE should be a valid command"); + assertTrue( + CommandActions.isValidCommand(CommandActions.PROPERTIES), + "PROPERTIES should be a valid command"); } @Test diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 6cc56249424..e8b45f876c7 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -104,7 +104,7 @@ public void tableFromCommandLineOption() throws Exception { } @Test - public void malformedName() throws Exception { + public void malformedMissingEntityName() throws Exception { String[] args = {"--name", "metalake.catalog"}; CommandLine commandLine = new DefaultParser().parse(options, args); FullName fullName = new FullName(commandLine); @@ -112,6 +112,15 @@ public void malformedName() throws Exception { assertNull(tableName); } + @Test + public void malformedMissingdName() throws Exception { + String[] args = {"catalog", "--name", "metalake"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + String catalogName = fullName.getCatalogName(); + assertNull(catalogName); + } + @Test public void missingName() throws Exception { String[] args = {}; // No name provided diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index 425dd3f8b9d..4ea720f338a 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -20,7 +20,6 @@ package org.apache.gravitino.cli; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayOutputStream; @@ -63,7 +62,7 @@ public void withCommandParameters() throws ParseException { String command = Main.resolveCommand(line); assertEquals(CommandActions.LIST, command); - String entity = Main.resolveEntity(line); + String entity = Main.resolveEntity(line, false); assertEquals(CommandEntities.METALAKE, entity); } @@ -76,7 +75,7 @@ public void withTwoArgsOnly() throws ParseException { String command = Main.resolveCommand(line); assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line); + String entity = Main.resolveEntity(line, true); assertEquals(CommandEntities.METALAKE, entity); } @@ -84,13 +83,13 @@ public void withTwoArgsOnly() throws ParseException { public void defaultToDetails() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {}; + String[] args = {"--metalake", "metalake_demo"}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line); - assertNull(entity); + String entity = Main.resolveEntity(line, false); + assertEquals(CommandEntities.METALAKE, entity); } @Test @@ -117,4 +116,60 @@ public void parseError() throws UnsupportedEncodingException { assertTrue(errContent.toString().contains("Error parsing command line")); // Expect error assertTrue(outContent.toString().contains("usage:")); // Expect help output } + + @Test + public void catalogWithTwoArgs() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"catalog", "details", "--name", "metalake_demo.catalog_postgres"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line, true); + assertEquals(CommandEntities.CATALOG, entity); + } + + @Test + public void catalogWithOneArg() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"catalog", "--command", "details", "--name", "metalake_demo.catalog_postgres"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line, true); + assertEquals(CommandEntities.CATALOG, entity); + } + + @Test + public void catalogWithEntity() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = { + "--entity", "catalog", "--command", "details", "--name", "metalake_demo.catalog_postgres" + }; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line, false); + assertEquals(CommandEntities.CATALOG, entity); + } + + @Test + public void catalogWithNoName() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = { + "catalog", "details", "--metalake", "metalake_demo", "--catalog", "catalog_postgres" + }; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line, true); + assertEquals(CommandEntities.CATALOG, entity); + } } From fa2cdaf73c39a00d6b4e7417231c0948847af793 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 9 Oct 2024 08:54:43 -0600 Subject: [PATCH 14/83] remove unneeded call --- .../java/org/apache/gravitino/cli/commands/CatalogDetails.java | 2 +- .../java/org/apache/gravitino/cli/commands/SchemaDetails.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java index 85b31f5ae6b..408d3d81fe6 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java @@ -49,7 +49,7 @@ public void handle() { try { GravitinoClient client = buildClient(metalake); - result = client.loadMetalake(metalake).loadCatalog(catalog); + result = client.loadCatalog(catalog); } catch (NoSuchMetalakeException err) { System.err.println(ErrorMessages.UNKNOWN_METALAKE); return; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java index 6972e3dba58..255d540c3df 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java @@ -54,7 +54,7 @@ public void handle() { try { GravitinoClient client = buildClient(metalake); - result = client.loadMetalake(metalake).loadCatalog(catalog).asSchemas().loadSchema(schema); + result = client.loadCatalog(catalog).asSchemas().loadSchema(schema); } catch (NoSuchMetalakeException err) { System.err.println(ErrorMessages.UNKNOWN_METALAKE); return; From 3df9f113909b74fcba9aecee2beae675f57691a6 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 12:20:25 -0600 Subject: [PATCH 15/83] add more tests --- .../gravitino/cli/TestCommandActions.java | 4 +- .../gravitino/cli/TestCommandEntities.java | 4 +- .../apache/gravitino/cli/TestFulllName.java | 11 ++ .../gravitino/cli/TestGravitinoConfig.java | 141 ++++++++++++++++++ .../gravitino/cli/TestGravitinoOptions.java | 4 +- .../apache/gravitino/cli/TestProviders.java | 94 ++++++++++++ 6 files changed, 250 insertions(+), 8 deletions(-) create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java create mode 100644 clients/cli/src/test/java/org/apache/gravitino/cli/TestProviders.java diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java index 94bfea6a5af..58f7f977379 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandActions.java @@ -68,8 +68,6 @@ public void emptyCommand() { @Test public void caseSensitive() { - assertFalse( - CommandActions.isValidCommand("DETAILS".toUpperCase()), - "Commands should be case-sensitive"); + assertFalse(CommandActions.isValidCommand("DETAILS"), "Commands should be case-sensitive"); } } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java index 1ce61cd6f3f..2ca43d0603c 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java @@ -60,8 +60,6 @@ public void emptyEntity() { @Test public void caseSensitive() { - assertFalse( - CommandEntities.isValidEntity("DETAILS".toUpperCase()), - "Entities should be case-sensitive"); + assertFalse(CommandEntities.isValidEntity("METALAKE"), "Entities should be case-sensitive"); } } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index e8b45f876c7..ae98222be72 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -22,6 +22,7 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.MissingArgumentException; import org.apache.commons.cli.Options; import org.apache.gravitino.cli.FullName; import org.apache.gravitino.cli.GravitinoOptions; @@ -73,6 +74,16 @@ public void entityNotFound() throws Exception { assertNull(metalakeName); } + @Test + public void justName() throws Exception, MissingArgumentException { + String[] args = {"--name"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String metalakeName = fullName.getMetalakeName(); + assertNull(metalakeName); + } + @Test public void catalogFromCommandLineOption() throws Exception { String[] args = {"--catalog", "catalogA"}; diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java new file mode 100644 index 00000000000..6561fa25ab1 --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java @@ -0,0 +1,141 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.File; +import java.io.IOException; +import java.io.Writer; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.util.Properties; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class TestGravitinoConfig { + + private static final String TEMP_FILE_PATH = + System.getProperty("java.io.tmpdir") + "/gravitino.properties"; + private static final String NON_EXISTENT_FILE_PATH = + System.getProperty("java.io.tmpdir") + "/non_existent.properties"; + private static final String METALAKE_KEY = "metalake"; + private static final String METALAKE_VALUE = "metalake_demo"; + + @BeforeEach + public void setUp() throws IOException { + // Set up a temporary config file + File tempFile = new File(TEMP_FILE_PATH); + if (tempFile.exists()) { + tempFile.delete(); + } + + Properties props = new Properties(); + props.setProperty(METALAKE_KEY, METALAKE_VALUE); + + try (Writer writer = Files.newBufferedWriter(tempFile.toPath(), StandardCharsets.UTF_8)) { + props.store(writer, "Test Config"); + } + } + + @Test + public void defaultPath() { + GravitinoConfig config = new GravitinoConfig(null); + String expectedFilePath = System.getProperty("user.home") + "/.gravitino"; + assertEquals( + expectedFilePath, + config.getConfigFile(), + "Config file path should default to the home directory with '.gravitino'"); + } + + @Test + public void fileDoesExist() { + GravitinoConfig config = new GravitinoConfig(TEMP_FILE_PATH); + assertTrue(config.fileExists(), "Config file should exist"); + } + + @Test + public void fileDoesNotExist() { + GravitinoConfig config = new GravitinoConfig(NON_EXISTENT_FILE_PATH); + assertFalse(config.fileExists(), "Config file should not exist"); + } + + @Test + public void validConfigFile() { + GravitinoConfig config = new GravitinoConfig(TEMP_FILE_PATH); + config.read(); + assertEquals( + METALAKE_VALUE, + config.getMetalakeName(), + "Should read the metalake value from the config file"); + } + + @Test + public void fileNotFound() { + GravitinoConfig config = new GravitinoConfig(NON_EXISTENT_FILE_PATH); + config.read(); // No exception should be thrown, config file is optional + assertNull(config.getMetalakeName(), "Metalake should be null if config file is not found"); + } + + @Test + public void configFileMissingMetalake() throws IOException { + // Create a config file without the "metalake" key + File tempFileWithoutMetalake = + new File(System.getProperty("java.io.tmpdir") + "/no_metalake.properties"); + try (Writer writer = + Files.newBufferedWriter(tempFileWithoutMetalake.toPath(), StandardCharsets.UTF_8)) { + writer.write("# This config file has no metalake key\n"); + } + + GravitinoConfig config = new GravitinoConfig(tempFileWithoutMetalake.getAbsolutePath()); + config.read(); + assertNull( + config.getMetalakeName(), + "Metalake should be null if the key is missing in the config file"); + + tempFileWithoutMetalake.delete(); + } + + @Test + public void invalidConfigFile() throws IOException { + // Create a corrupt config file + File corruptConfigFile = + new File(System.getProperty("java.io.tmpdir") + "/config_corrupt.properties"); + try (Writer writer = + Files.newBufferedWriter(corruptConfigFile.toPath(), StandardCharsets.UTF_8)) { + writer.write("corrupt content = @@%@"); + } + + GravitinoConfig config = new GravitinoConfig(corruptConfigFile.getAbsolutePath()); + config.read(); // Should not throw an exception but handle it gracefully + assertNull(config.getMetalakeName(), "Metalake should be null if the config file is corrupt"); + + corruptConfigFile.delete(); + } + + @Test + public void withoutReadingConfig() { + GravitinoConfig config = new GravitinoConfig(TEMP_FILE_PATH); + assertNull(config.getMetalakeName(), "Metalake should be null before reading the config file"); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java index 6fd12276d16..879283aafac 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoOptions.java @@ -29,7 +29,7 @@ public class TestGravitinoOptions { @Test - public void testCreateSimpleOption() { + public void createSimpleOption() { GravitinoOptions gravitinoOptions = new GravitinoOptions(); Option helpOption = gravitinoOptions.createSimpleOption("h", GravitinoOptions.HELP, "help message"); @@ -44,7 +44,7 @@ public void testCreateSimpleOption() { } @Test - public void testCreateArgOption() { + public void createArgOption() { GravitinoOptions gravitinoOptions = new GravitinoOptions(); Option urlOption = gravitinoOptions.createArgOption("u", GravitinoOptions.URL, "url argument"); diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestProviders.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestProviders.java new file mode 100644 index 00000000000..056b6439903 --- /dev/null +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestProviders.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class TestProviders { + + @Test + public void validProviders() { + assertTrue(Providers.isValidProvider(Providers.HIVE), "HIVE should be a valid entity"); + assertTrue(Providers.isValidProvider(Providers.HADOOP), "HADOOP should be a valid entity"); + assertTrue(Providers.isValidProvider(Providers.ICEBERG), "ICEBERG should be a valid entity"); + assertTrue(Providers.isValidProvider(Providers.MYSQL), "MYSQL should be a valid entity"); + assertTrue(Providers.isValidProvider(Providers.POSTGRES), "POSTGRES should be a valid entity"); + assertTrue(Providers.isValidProvider(Providers.KAFKA), "KAFKA should be a valid entity"); + } + + @Test + public void invalidProvider() { + assertFalse( + Providers.isValidProvider("invalidEntity"), "An invalid provider should return false"); + } + + @Test + public void nullEntity() { + assertFalse( + Providers.isValidProvider(null), "Null should return false as it's not a valid provider"); + } + + @Test + public void emptyEntity() { + assertFalse( + Providers.isValidProvider(""), + "Empty string should return false as it's not a valid entity"); + } + + @Test + public void caseSensitive() { + assertFalse(Providers.isValidProvider("HIVE"), "Providers should be case-sensitive"); + } + + @Test + public void internalNotNull() { + assertNotNull(Providers.internal(Providers.HIVE), "Internal string should not be null"); + assertNotNull(Providers.internal(Providers.HADOOP), "Internal string should not be null"); + assertNotNull(Providers.internal(Providers.ICEBERG), "Internal string should not be null"); + assertNotNull(Providers.internal(Providers.MYSQL), "Internal string should not be null"); + assertNotNull(Providers.internal(Providers.POSTGRES), "Internal string should not be null"); + assertNotNull(Providers.internal(Providers.KAFKA), "Internal string should not be null"); + } + + @Test + public void internalNull() { + assertNull(Providers.internal("unknown"), "Internal string should be null"); + } + + @Test + public void catalogTypeNotNull() { + assertNotNull(Providers.catalogType(Providers.HIVE), "Catalog type should not be null"); + assertNotNull(Providers.catalogType(Providers.HADOOP), "Catalog type should not be null"); + assertNotNull(Providers.catalogType(Providers.ICEBERG), "Catalog type should not be null"); + assertNotNull(Providers.catalogType(Providers.MYSQL), "Catalog type should not be null"); + assertNotNull(Providers.catalogType(Providers.POSTGRES), "Catalog type should not be null"); + assertNotNull(Providers.catalogType(Providers.KAFKA), "Catalog type should not be null"); + } + + @Test + public void catalogTypeNull() { + assertNull(Providers.internal("unknown"), "Catalog type should be null"); + } +} From 5e611be1ca57c673d5c16c74f42c0f9d18fbc7b3 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 12:20:44 -0600 Subject: [PATCH 16/83] add more tests --- .../main/java/org/apache/gravitino/cli/GravitinoConfig.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java index e5926a25b03..80ecf5cc048 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java @@ -66,4 +66,8 @@ public void read() { public String getMetalakeName() { return metalake; } + + public String getConfigFile() { + return configFile; + } } From 68f7fa23eeb32f74b0fc017fcc0a55e0791ae07a Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 12:41:01 -0600 Subject: [PATCH 17/83] change version command into client and server version commands --- .../gravitino/cli/GravitinoCommandLine.java | 7 ++- .../gravitino/cli/GravitinoOptions.java | 4 +- .../gravitino/cli/commands/ClientVersion.java | 48 +++++++++++++++++++ .../{Version.java => ServerVersion.java} | 4 +- 4 files changed, 58 insertions(+), 5 deletions(-) create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java rename clients/cli/src/main/java/org/apache/gravitino/cli/commands/{Version.java => ServerVersion.java} (94%) 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 0a91a2e596a..b72db743ef7 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 @@ -24,6 +24,7 @@ import org.apache.commons.cli.Options; import org.apache.gravitino.cli.commands.AllMetalakeDetails; import org.apache.gravitino.cli.commands.CatalogDetails; +import org.apache.gravitino.cli.commands.ClientVersion; import org.apache.gravitino.cli.commands.ListCatalogs; import org.apache.gravitino.cli.commands.ListColumns; import org.apache.gravitino.cli.commands.ListMetalakes; @@ -31,8 +32,8 @@ import org.apache.gravitino.cli.commands.ListTables; import org.apache.gravitino.cli.commands.MetalakeDetails; import org.apache.gravitino.cli.commands.SchemaDetails; +import org.apache.gravitino.cli.commands.ServerVersion; import org.apache.gravitino.cli.commands.TableDetails; -import org.apache.gravitino.cli.commands.Version; /* Gravitino Command line */ public class GravitinoCommandLine { @@ -68,7 +69,9 @@ public void handleCommandLine() { } /* Display Gravitino version. */ else if (line.hasOption(GravitinoOptions.VERSION)) { - new Version(getUrl()).handle(); + new ClientVersion(getUrl()).handle(); + } else if (line.hasOption(GravitinoOptions.SERVER)) { + new ServerVersion(getUrl()).handle(); } else { executeCommand(); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index ae04739933b..270e0b35637 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -26,6 +26,7 @@ public class GravitinoOptions { public static final String HELP = "help"; public static final String VERSION = "version"; + public static final String SERVER = "server"; public static final String URL = "url"; public static final String METALAKE = "metalake"; public static final String CATALOG = "catalog"; @@ -50,7 +51,8 @@ public Options options() { // Add options using helper method to avoid repetition options.addOption(createSimpleOption("h", HELP, "command help information")); - options.addOption(createSimpleOption("v", VERSION, "Gravitino version")); + options.addOption(createSimpleOption("v", VERSION, "Gravitino client version")); + options.addOption(createSimpleOption("r", SERVER, "Gravitino server version")); options.addOption(createArgOption("u", URL, "Gravitino URL (default: http://localhost:8090)")); options.addOption(createArgOption("m", METALAKE, "metalake name")); options.addOption(createArgOption("c", CATALOG, "catalog name")); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java new file mode 100644 index 00000000000..e8cdc55b666 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java @@ -0,0 +1,48 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.client.GravitinoAdminClient; + +/** Displays the Gravitino client version. */ +public class ClientVersion extends Command { + + /** + * Displays the client version. + * + * @param url The URL of the Gravitino server. + */ + public ClientVersion(String url) { + super(url); + } + + /** Displays the client version. */ + public void handle() { + String version = "unknown"; + try { + GravitinoAdminClient client = buildAdminClient(); + version = client.clientVersion().version(); + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + System.out.println("Apache Gravitino " + version); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Version.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ServerVersion.java similarity index 94% rename from clients/cli/src/main/java/org/apache/gravitino/cli/commands/Version.java rename to clients/cli/src/main/java/org/apache/gravitino/cli/commands/ServerVersion.java index 96efe6acdf9..f9da822d49d 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Version.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ServerVersion.java @@ -22,14 +22,14 @@ import org.apache.gravitino.client.GravitinoAdminClient; /** Displays the Gravitino server version. */ -public class Version extends Command { +public class ServerVersion extends Command { /** * Displays the server version. * * @param url The URL of the Gravitino server. */ - public Version(String url) { + public ServerVersion(String url) { super(url); } From e2ebb7a98395854400f6dc8e9af1d054d917e82c Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 12:51:24 -0600 Subject: [PATCH 18/83] list entities and commands --- clients/cli/README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/clients/cli/README.md b/clients/cli/README.md index 3e089c20a4d..fc61816fb68 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -74,7 +74,7 @@ Before you can build and run this project, it is suggested you have the followin To run the Gravitino CLI, use the following command structure: ```bash -usage: gcli [options] +usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] Options -c,--catalog catalog name -C,--create create an entity @@ -89,7 +89,8 @@ Options -t,--table table name -u,--url Gravitino URL (default: http://localhost:8090) -U,--update update an entity - -v,--version Gravitino version + -v,--version Gravitino client version + -r,--server Gravitino server version -x,--command one of: list, details, create, delete, or update ``` From 0e82c8f64a65cef4d78a85c117fd83708856c1c4 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 12:52:05 -0600 Subject: [PATCH 19/83] Cache the metalake environment variable --- .../src/main/java/org/apache/gravitino/cli/FullName.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index 15a94699fba..a337a56b189 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -26,7 +26,8 @@ * metalake, catalog, schema, and table names. */ public class FullName { - CommandLine line; + private CommandLine line; + private String metalakeEnv; /** * Constructor for the {@code FullName} class. @@ -44,7 +45,10 @@ public FullName(CommandLine line) { * @return The metalake name, or null if not found. */ public String getMetalakeName() { - String metalakeEnv = System.getenv("GRAVITINO_METALAKE"); + // Cache the metalake environment variable + if (metalakeEnv == null) { + metalakeEnv = System.getenv("GRAVITINO_METALAKE"); + } // Check if the metalake name is specified as a command line option if (line.hasOption(GravitinoOptions.METALAKE)) { From 7b97750f8f26d425b5a67e1ee285f48509308123 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 16:01:41 -0700 Subject: [PATCH 20/83] use libs --- clients/cli/build.gradle.kts | 6 +++--- gradle/libs.versions.toml | 3 ++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts index 5e518e100de..ec9175374be 100644 --- a/clients/cli/build.gradle.kts +++ b/clients/cli/build.gradle.kts @@ -26,9 +26,9 @@ dependencies { implementation(project(":clients:client-java")) implementation(project(":api")) implementation(project(":common")) - implementation("commons-cli:commons-cli:1.9.0") - implementation("org.slf4j:slf4j-api:2.0.16") - implementation("org.slf4j:slf4j-simple:2.0.16") + implementation(libs.slf4j.api) + implementation(libs.slf4j.simple) + implementation(libs.commons.cli) testImplementation(libs.junit.jupiter.api) testImplementation(libs.junit.jupiter.params) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 255306c983c..0ec893ab072 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -89,7 +89,7 @@ rat-plugin = '0.8.0' shadow-plugin = "8.1.1" kerby = "2.0.3" node-plugin = "7.0.1" -commons-cli = "1.2" +commons-cli = "1.9.0" sun-activation-version = "1.2.0" error-prone = "3.1.0" woodstox-core = "5.3.0" @@ -118,6 +118,7 @@ junit-jupiter-api = { group = "org.junit.jupiter", name = "junit-jupiter-api", v junit-jupiter-params = { group = "org.junit.jupiter", name = "junit-jupiter-params", version.ref = "junit" } junit-jupiter-engine = { group = "org.junit.jupiter", name = "junit-jupiter-engine"} slf4j-api = { group = "org.slf4j", name = "slf4j-api", version.ref = "slf4j" } +slf4j-simple = { group = "org.slf4j", name = "slf4j-simple", version.ref = "slf4j" } slf4j-jdk14 = { group = "org.slf4j", name = "slf4j-jdk14", version = "1.7.30" } log4j-slf4j2-impl = { group = "org.apache.logging.log4j", name = "log4j-slf4j2-impl", version.ref = "log4j" } log4j-api = { group = "org.apache.logging.log4j", name = "log4j-api", version.ref = "log4j" } From d678b99bb9c3eae329395986840691549aee3515 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 17:39:11 -0700 Subject: [PATCH 21/83] Trino Connector uses old deprecated CLI --- clients/cli/build.gradle.kts | 2 +- gradle/libs.versions.toml | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts index ec9175374be..3b0434b64b8 100644 --- a/clients/cli/build.gradle.kts +++ b/clients/cli/build.gradle.kts @@ -28,7 +28,7 @@ dependencies { implementation(project(":common")) implementation(libs.slf4j.api) implementation(libs.slf4j.simple) - implementation(libs.commons.cli) + implementation(libs.commons.cli.new) testImplementation(libs.junit.jupiter.api) testImplementation(libs.junit.jupiter.params) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 5a8c222e74f..2888f220876 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -89,7 +89,8 @@ rat-plugin = '0.8.0' shadow-plugin = "8.1.1" kerby = "2.0.3" node-plugin = "7.0.1" -commons-cli = "1.9.0" +commons-cli = "1.2" +commons-cli-new = "1.9.0" sun-activation-version = "1.2.0" error-prone = "3.1.0" woodstox-core = "5.3.0" @@ -210,6 +211,7 @@ postgresql-driver = { group = "org.postgresql", name = "postgresql", version.ref minikdc = { group = "org.apache.hadoop", name = "hadoop-minikdc", version.ref = "hadoop-minikdc"} immutables-value = { module = "org.immutables:value", version.ref = "immutables-value" } commons-cli = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli" } +commons-cli-new = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli-new" } sun-activation = { group = "com.sun.activation", name = "javax.activation", version.ref = "sun-activation-version" } kafka-clients = { group = "org.apache.kafka", name = "kafka-clients", version.ref = "kafka" } kafka = { group = "org.apache.kafka", name = "kafka_2.12", version.ref = "kafka" } From 253a2b42f8e2f68b4d12d3789db82ae76f77409d Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 11 Oct 2024 22:30:23 -0700 Subject: [PATCH 22/83] fix test --- .../test/java/org/apache/gravitino/cli/TestFulllName.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index ae98222be72..448ab2dbf6c 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -19,6 +19,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; @@ -77,11 +78,8 @@ public void entityNotFound() throws Exception { @Test public void justName() throws Exception, MissingArgumentException { String[] args = {"--name"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - String metalakeName = fullName.getMetalakeName(); - assertNull(metalakeName); + assertThrows(MissingArgumentException.class, () -> new DefaultParser().parse(options, args)); } @Test From 0ef4695deb5aba7f6fd59c2d36976403cbf507b2 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Mon, 14 Oct 2024 10:23:08 -0700 Subject: [PATCH 23/83] add basic user and group commands --- clients/cli/examples.sh | 12 +++ .../apache/gravitino/cli/CommandEntities.java | 4 + .../apache/gravitino/cli/ErrorMessages.java | 4 + .../gravitino/cli/GravitinoCommandLine.java | 48 ++++++++++++ .../gravitino/cli/GravitinoOptions.java | 4 +- .../gravitino/cli/commands/CreateGroup.java | 62 ++++++++++++++++ .../gravitino/cli/commands/CreateUser.java | 62 ++++++++++++++++ .../gravitino/cli/commands/DeleteGroup.java | 69 +++++++++++++++++ .../gravitino/cli/commands/DeleteUser.java | 69 +++++++++++++++++ .../gravitino/cli/commands/GroupDetails.java | 74 +++++++++++++++++++ .../gravitino/cli/commands/ListGroups.java | 66 +++++++++++++++++ .../gravitino/cli/commands/ListUsers.java | 66 +++++++++++++++++ .../gravitino/cli/commands/UserDetails.java | 74 +++++++++++++++++++ .../gravitino/cli/TestCommandEntities.java | 4 + 14 files changed, 617 insertions(+), 1 deletion(-) create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java diff --git a/clients/cli/examples.sh b/clients/cli/examples.sh index 38ff8c96525..0cb8b4fe2f8 100755 --- a/clients/cli/examples.sh +++ b/clients/cli/examples.sh @@ -147,3 +147,15 @@ gcli schema details --name catalog_hive.sales gcli table list --name catalog_postgres.hr.departments gcli table list --name catalog_mysql.db.iceberg_tables gcli table list --name catalog_hive.sales.products + +# User examples +gcli user create --name metalake_demo --user new_user +gcli user details --name metalake_demo --user new_user +gcli user list --name metalake_demo +gcli user delete --name metalake_demo --user new_user + +# Group examples +gcli group create --name metalake_demo --user new_group +gcli group details --name metalake_demo --user new_group +gcli group list --name metalake_demo +gcli group delete --name metalake_demo --user new_group \ No newline at end of file diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java index b177acf6c20..fa9cd02756e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java @@ -30,6 +30,8 @@ public class CommandEntities { public static final String CATALOG = "catalog"; public static final String SCHEMA = "schema"; public static final String TABLE = "table"; + public static final String USER = "user"; + public static final String GROUP = "group"; private static final HashSet VALID_ENTITIES = new HashSet<>(); @@ -38,6 +40,8 @@ public class CommandEntities { VALID_ENTITIES.add(CATALOG); VALID_ENTITIES.add(SCHEMA); VALID_ENTITIES.add(TABLE); + VALID_ENTITIES.add(USER); + VALID_ENTITIES.add(GROUP); } /** diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java index 0e7816ae437..c3da72ce878 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java @@ -33,4 +33,8 @@ public class ErrorMessages { 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."; + public static final String UNKNOWN_USER = "Unknown user."; + public static final String USER_EXISTS = "User already exists."; + public static final String UNKNOWN_GROUP = "Unknown group."; + public static final String GROUP_EXISTS = "Group already exists."; } 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 8ba2168503e..c39b2261aee 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 @@ -25,6 +25,7 @@ import org.apache.gravitino.cli.commands.AllMetalakeDetails; import org.apache.gravitino.cli.commands.CatalogDetails; import org.apache.gravitino.cli.commands.ClientVersion; +import org.apache.gravitino.cli.commands.CreateGroup; import org.apache.gravitino.cli.commands.CreateHadoopCatalog; import org.apache.gravitino.cli.commands.CreateHiveCatalog; import org.apache.gravitino.cli.commands.CreateIcebergCatalog; @@ -33,18 +34,24 @@ import org.apache.gravitino.cli.commands.CreateMySQLCatalog; import org.apache.gravitino.cli.commands.CreatePostgresCatalog; import org.apache.gravitino.cli.commands.CreateSchema; +import org.apache.gravitino.cli.commands.CreateUser; import org.apache.gravitino.cli.commands.DeleteCatalog; +import org.apache.gravitino.cli.commands.DeleteGroup; 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.DeleteUser; +import org.apache.gravitino.cli.commands.GroupDetails; 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.ListGroups; 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.ListUsers; import org.apache.gravitino.cli.commands.MetalakeDetails; import org.apache.gravitino.cli.commands.RemoveCatalogProperty; import org.apache.gravitino.cli.commands.RemoveMetalakeProperty; @@ -59,6 +66,7 @@ import org.apache.gravitino.cli.commands.UpdateCatalogName; import org.apache.gravitino.cli.commands.UpdateMetalakeComment; import org.apache.gravitino.cli.commands.UpdateMetalakeName; +import org.apache.gravitino.cli.commands.UserDetails; /* Gravitino Command line */ public class GravitinoCommandLine { @@ -123,6 +131,10 @@ private void executeCommand() { handleCatalogCommand(); } else if (entity.equals(CommandEntities.METALAKE)) { handleMetalakeCommand(); + } else if (entity.equals(CommandEntities.USER)) { + handleUserCommand(); + } else if (entity.equals(CommandEntities.GROUP)) { + handleGroupCommand(); } } else { handleGeneralCommand(); @@ -287,6 +299,42 @@ protected void handleTableCommand() { } } + /** Handles the command execution for Users based on command type and the command line options. */ + protected void handleUserCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String user = line.getOptionValue(GravitinoOptions.USER); + + if (CommandActions.DETAILS.equals(command)) { + new UserDetails(url, metalake, user).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListUsers(url, metalake).handle(); + } else if (CommandActions.CREATE.equals(command)) { + new CreateUser(url, metalake, user).handle(); + } else if (CommandActions.DELETE.equals(command)) { + new DeleteUser(url, metalake, user).handle(); + } + } + + /** Handles the command execution for Group based on command type and the command line options. */ + protected void handleGroupCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String group = line.getOptionValue(GravitinoOptions.GROUP); + + if (CommandActions.DETAILS.equals(command)) { + new GroupDetails(url, metalake, group).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListGroups(url, metalake).handle(); + } else if (CommandActions.CREATE.equals(command)) { + new CreateGroup(url, metalake, group).handle(); + } else if (CommandActions.DELETE.equals(command)) { + new DeleteGroup(url, metalake, group).handle(); + } + } + /** Handles the command execution based on command type and the command line options. */ protected void handleGeneralCommand() { String url = getUrl(); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index 62c90f6a28c..ef02481124c 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -53,6 +53,7 @@ public class GravitinoOptions { public static final String PASSWORD = "password"; public static final String DATABASE = "database"; public static final String BOOTSTRAP = "bootstrap"; + public static final String GROUP = "group"; /** * Builds and returns the CLI options for Gravitino. @@ -93,7 +94,7 @@ public Options options() { options.addOption(createArgOption("v", VALUE, "property value")); options.addOption( createArgOption( - "p", PROVIDER, "provider one of hadoop, hive, mysql, postgres, iceberg, kafka")); + "p", PROVIDER, "the provider one of hadoop, hive, mysql, postgres, iceberg or kafka")); options.addOption(createArgOption("m", METASTORE, "Hive metastore URI")); options.addOption(createArgOption("w", WAREHOUSE, "warehouse name")); options.addOption(createArgOption("b", BOOTSTRAP, "Kafka bootstrap servers")); @@ -101,6 +102,7 @@ public Options options() { options.addOption(createArgOption("u", USER, "database username")); options.addOption(createArgOption("p", PASSWORD, "database password")); options.addOption(createArgOption("d", DATABASE, "database name")); + options.addOption(createArgOption("g", GROUP, "group name")); return options; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java new file mode 100644 index 00000000000..885d97a84bc --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.GroupAlreadyExistsException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +public class CreateGroup extends Command { + protected String metalake; + protected String group; + + /** + * Create a new group. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param group The name of the group. + */ + public CreateGroup(String url, String metalake, String group) { + super(url); + this.metalake = metalake; + this.group = group; + } + + /** Create a new group. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + client.addGroup(group); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (GroupAlreadyExistsException err) { + System.err.println(ErrorMessages.USER_EXISTS); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(group + " created"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java new file mode 100644 index 00000000000..0a4061f81d1 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java @@ -0,0 +1,62 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.UserAlreadyExistsException; + +public class CreateUser extends Command { + protected String metalake; + protected String user; + + /** + * Create a new User. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param user The name of the user. + */ + public CreateUser(String url, String metalake, String user) { + super(url); + this.metalake = metalake; + this.user = user; + } + + /** Create a new user. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + client.addUser(user); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (UserAlreadyExistsException err) { + System.err.println(ErrorMessages.USER_EXISTS); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(user + " created"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java new file mode 100644 index 00000000000..1b563822c44 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchGroupException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +public class DeleteGroup extends Command { + + protected String metalake; + protected String group; + + /** + * Delete a group. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param group The name of the group. + */ + public DeleteGroup(String url, String metalake, String group) { + super(url); + this.metalake = metalake; + this.group = group; + } + + /** Delete a group. */ + public void handle() { + boolean deleted = false; + + try { + GravitinoClient client = buildClient(metalake); + deleted = client.removeUser(group); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchGroupException err) { + System.err.println(ErrorMessages.UNKNOWN_GROUP); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (deleted) { + System.out.println(group + " deleted."); + } else { + System.out.println(group + " not deleted."); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java new file mode 100644 index 00000000000..9da3b55662d --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchUserException; + +public class DeleteUser extends Command { + + protected String metalake; + protected String user; + + /** + * Delete a user. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param user The name of the user. + */ + public DeleteUser(String url, String metalake, String user) { + super(url); + this.metalake = metalake; + this.user = user; + } + + /** Delete a user. */ + public void handle() { + boolean deleted = false; + + try { + GravitinoClient client = buildClient(metalake); + deleted = client.removeUser(user); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchUserException err) { + System.err.println(ErrorMessages.UNKNOWN_USER); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (deleted) { + System.out.println(user + " deleted."); + } else { + System.out.println(user + " not deleted."); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java new file mode 100644 index 00000000000..0cafe886808 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.List; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchUserException; + +public class GroupDetails extends Command { + + protected String metalake; + protected String group; + + /** + * Displays the users in a group. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param group The name of the group. + */ + public GroupDetails(String url, String metalake, String group) { + super(url); + this.metalake = metalake; + this.group = group; + } + + /** Displays the roles of a specified user. */ + public void handle() { + List roles = null; + + try { + GravitinoClient client = buildClient(metalake); + roles = client.getGroup(group).roles(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchUserException err) { + System.err.println(ErrorMessages.UNKNOWN_GROUP); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < roles.size(); i++) { + if (i > 0) { + all.append(","); + } + all.append(roles.get(i)); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java new file mode 100644 index 00000000000..e33c4909bd8 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/* Lists all groups in a metalake. */ +public class ListGroups extends Command { + + protected String metalake; + + /** + * Lists all groups in a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + */ + public ListGroups(String url, String metalake) { + super(url); + this.metalake = metalake; + } + + /** Lists all groups in a metalake. */ + public void handle() { + String[] groups = new String[0]; + try { + GravitinoClient client = buildClient(metalake); + groups = client.listGroupNames(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < groups.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(groups[i]); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java new file mode 100644 index 00000000000..3cd1a46921f --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/* Lists all users in a metalake. */ +public class ListUsers extends Command { + + protected String metalake; + + /** + * Lists all users in a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + */ + public ListUsers(String url, String metalake) { + super(url); + this.metalake = metalake; + } + + /** Lists all users in a metalake. */ + public void handle() { + String[] users = new String[0]; + try { + GravitinoClient client = buildClient(metalake); + users = client.listUserNames(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < users.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(users[i]); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java new file mode 100644 index 00000000000..e7b6f68430b --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java @@ -0,0 +1,74 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.List; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchUserException; + +public class UserDetails extends Command { + + protected String metalake; + protected String user; + + /** + * Displays the roles of a user. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param user The name of the user. + */ + public UserDetails(String url, String metalake, String user) { + super(url); + this.metalake = metalake; + this.user = user; + } + + /** Displays the roles of a specified user. */ + public void handle() { + List roles = null; + + try { + GravitinoClient client = buildClient(metalake); + roles = client.getUser(user).roles(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchUserException err) { + System.err.println(ErrorMessages.UNKNOWN_USER); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < roles.size(); i++) { + if (i > 0) { + all.append(","); + } + all.append(roles.get(i)); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java index 2ca43d0603c..5290f89055a 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java @@ -37,6 +37,10 @@ public void validEntities() { CommandEntities.isValidEntity(CommandEntities.SCHEMA), "SCHEMA should be a valid entity"); assertTrue( CommandEntities.isValidEntity(CommandEntities.TABLE), "TABLE should be a valid entity"); + assertTrue( + CommandEntities.isValidEntity(CommandEntities.USER), "USER should be a valid entity"); + assertTrue( + CommandEntities.isValidEntity(CommandEntities.GROUP), "GROUP should be a valid entity"); } @Test From 9320324f3e454699a22bf5ab385dff5805f4f57b Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Mon, 14 Oct 2024 16:07:24 -0700 Subject: [PATCH 24/83] basic CLI for tags --- clients/cli/examples.sh | 19 +++- .../apache/gravitino/cli/CommandEntities.java | 2 + .../apache/gravitino/cli/ErrorMessages.java | 2 + .../org/apache/gravitino/cli/FullName.java | 66 +++++++++++- .../gravitino/cli/GravitinoCommandLine.java | 58 ++++++++++ .../gravitino/cli/GravitinoOptions.java | 2 + .../gravitino/cli/commands/CreateTag.java | 65 ++++++++++++ .../gravitino/cli/commands/DeleteTag.java | 69 ++++++++++++ .../cli/commands/ListTagProperties.java | 68 ++++++++++++ .../gravitino/cli/commands/ListTags.java | 66 ++++++++++++ .../cli/commands/RemoveTagProperty.java | 69 ++++++++++++ .../cli/commands/SetTagProperty.java | 72 +++++++++++++ .../gravitino/cli/commands/TagDetails.java | 68 ++++++++++++ .../gravitino/cli/commands/TagEntity.java | 100 ++++++++++++++++++ .../gravitino/cli/commands/UntagEntity.java | 100 ++++++++++++++++++ .../cli/commands/UpdateCatalogName.java | 4 + .../cli/commands/UpdateTagComment.java | 69 ++++++++++++ .../gravitino/cli/commands/UpdateTagName.java | 69 ++++++++++++ .../gravitino/cli/TestCommandEntities.java | 1 + .../apache/gravitino/cli/TestFulllName.java | 46 ++++++++ 20 files changed, 1012 insertions(+), 3 deletions(-) create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTags.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java diff --git a/clients/cli/examples.sh b/clients/cli/examples.sh index 0cb8b4fe2f8..23ce348026e 100755 --- a/clients/cli/examples.sh +++ b/clients/cli/examples.sh @@ -158,4 +158,21 @@ gcli user delete --name metalake_demo --user new_user gcli group create --name metalake_demo --user new_group gcli group details --name metalake_demo --user new_group gcli group list --name metalake_demo -gcli group delete --name metalake_demo --user new_group \ No newline at end of file +gcli group delete --name metalake_demo --user new_group + +# Tag examples +gcli tag create --name metalake_demo --tag tagA +gcli tag details --name metalake_demo --tag tagA +gcli tag list --name metalake_demo # all tags in a metalake +gcli tag delete --name metalake_demo --tag tagA +gcli tag update --name metalake_demo --tag tagA --rename new_tag +gcli tag update --name metalake_demo --tag tagA --comment "new comment" +gcli tag properties --name metalake_demo --tag tagA +gcli tag set --name metalake_demo --tag tagA --property color --value green +gcli tag remove --name metalake_demo --tag tagA --property color +gcli tag create --name metalake_demo --tag hr +gcli tag set --name metalake_demo.catalog_postgres.hr --tag hr # tag entity +gcli tag remove --name metalake_demo.catalog_postgres.hr --tag hr # untag entity + +gcli tag list --name metalake_demo.catalog_postgres.hr # all tags hr has been taged with +gcli tag list --tag tagA --name metalake_demo # all objects with tagA diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java index fa9cd02756e..390ed5c05b2 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java @@ -32,6 +32,7 @@ public class CommandEntities { public static final String TABLE = "table"; public static final String USER = "user"; public static final String GROUP = "group"; + public static final String TAG = "tag"; private static final HashSet VALID_ENTITIES = new HashSet<>(); @@ -42,6 +43,7 @@ public class CommandEntities { VALID_ENTITIES.add(TABLE); VALID_ENTITIES.add(USER); VALID_ENTITIES.add(GROUP); + VALID_ENTITIES.add(TAG); } /** diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java index c3da72ce878..6a6d4e5bbe8 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java @@ -37,4 +37,6 @@ public class ErrorMessages { public static final String USER_EXISTS = "User already exists."; public static final String UNKNOWN_GROUP = "Unknown group."; public static final String GROUP_EXISTS = "Group already exists."; + public static final String UNKNOWN_TAG = "Unknown tag."; + public static final String TAG_EXISTS = "Tag already exists."; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index b5418fe3105..ecae6c7c437 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -119,12 +119,11 @@ public String getNamePart(String entity, int position) { String[] names = line.getOptionValue(GravitinoOptions.NAME).split("\\."); /* Adjust position if metalake is part of the full name. */ - String metalakeEnv = System.getenv("GRAVITINO_METALAKE"); if (metalakeEnv != null) { position = position - 1; } - if (names.length - 1 < position) { + if (position >= names.length) { System.err.println(ErrorMessages.MALFORMED_NAME); return null; } @@ -135,4 +134,67 @@ public String getNamePart(String entity, int position) { System.err.println(ErrorMessages.MISSING_NAME); return null; } + + /** + * Helper method to determine a specific part of the full name exits. + * + * @param entity The part of the name to obtain. + * @return True if the part exitsts. + */ + public boolean hasNamePart(String entity) { + /* Check if the name is specified as a command line option. */ + if (line.hasOption(entity)) { + return true; + /* Extract the name part from the full name if available. */ + } else if (line.hasOption(GravitinoOptions.NAME)) { + String[] names = line.getOptionValue(GravitinoOptions.NAME).split("\\."); + int length = names.length; + String [] order = {GravitinoOptions.METALAKE, GravitinoOptions.CATALOG,GravitinoOptions.SCHEMA,GravitinoOptions.TABLE}; + int position = order.indexOf(entity); + + /* Adjust position if metalake is part of the full name. */ + if (metalakeEnv != null) { + position = position - 1; + } + return position < length; + } + + return false; + } + + /** + * Does the metalake name exist? + * + * @return True if the catalog name exists, or false if it does not. + */ + public boolean hasMetalakeName() { + return hasNamePart(GravitinoOptions.METALAKE); + } + + /** + * Does the catalog name exist? + * + * @return True if the catalog name exists, or false if it does not. + */ + public boolean hasCatalogName() { + return hasNamePart(GravitinoOptions.CATALOG); + } + + /** + * Does the schema name exist? + * + * @return True if the schema name exists, or false if it does not. + */ + public boolean hasSchemaName() { + return hasNamePart(GravitinoOptions.SCHEMA); + } + + /** + * Does the table name exist? + * + * @return True if the table name exists, or false if it does not. + */ + public boolean hasTableName() { + return hasNamePart(GravitinoOptions.TABLE); + } } 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 c39b2261aee..938dbdaf390 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 @@ -34,12 +34,14 @@ import org.apache.gravitino.cli.commands.CreateMySQLCatalog; import org.apache.gravitino.cli.commands.CreatePostgresCatalog; import org.apache.gravitino.cli.commands.CreateSchema; +import org.apache.gravitino.cli.commands.CreateTag; import org.apache.gravitino.cli.commands.CreateUser; import org.apache.gravitino.cli.commands.DeleteCatalog; import org.apache.gravitino.cli.commands.DeleteGroup; 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.DeleteTag; import org.apache.gravitino.cli.commands.DeleteUser; import org.apache.gravitino.cli.commands.GroupDetails; import org.apache.gravitino.cli.commands.ListCatalogProperties; @@ -51,21 +53,30 @@ 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.ListTagProperties; +import org.apache.gravitino.cli.commands.ListTags; import org.apache.gravitino.cli.commands.ListUsers; 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.RemoveTagProperty; 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.SetTagProperty; import org.apache.gravitino.cli.commands.TableDetails; +import org.apache.gravitino.cli.commands.TagDetails; +import org.apache.gravitino.cli.commands.TagEntity; +import org.apache.gravitino.cli.commands.UntagEntity; 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; +import org.apache.gravitino.cli.commands.UpdateTagComment; +import org.apache.gravitino.cli.commands.UpdateTagName; import org.apache.gravitino.cli.commands.UserDetails; /* Gravitino Command line */ @@ -135,6 +146,8 @@ private void executeCommand() { handleUserCommand(); } else if (entity.equals(CommandEntities.GROUP)) { handleGroupCommand(); + } else if (entity.equals(CommandEntities.TAG)) { + handleTagCommand(); } } else { handleGeneralCommand(); @@ -335,6 +348,51 @@ protected void handleGroupCommand() { } } + /** Handles the command execution for Tags based on command type and the command line options. */ + protected void handleTagCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String tag = line.getOptionValue(GravitinoOptions.TAG); + + if (CommandActions.DETAILS.equals(command)) { + new TagDetails(url, metalake, tag).handle(); + } else if (CommandActions.LIST.equals(command)) { + new ListTags(url, metalake).handle(); + } else if (CommandActions.CREATE.equals(command)) { + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + new CreateTag(url, metalake, tag, comment).handle(); + } else if (CommandActions.DELETE.equals(command)) { + new DeleteTag(url, metalake, tag).handle(); + } else if (CommandActions.SET.equals(command)) { + String property = line.getOptionValue(GravitinoOptions.PROPERTY); + String value = line.getOptionValue(GravitinoOptions.VALUE); + if (property != null && value != null) { + new SetTagProperty(url, metalake, tag, property, value).handle(); + } else { + new TagEntity(url, metalake, name, tag).handle(); + } + } else if (CommandActions.REMOVE.equals(command)) { + String property = line.getOptionValue(GravitinoOptions.PROPERTY); + if (property != null) { + new RemoveTagProperty(url, metalake, tag, property).handle(); + } else { + new UntagEntity(url, metalake, name, tag).handle(); + } + } else if (CommandActions.PROPERTIES.equals(command)) { + new ListTagProperties(url, metalake, tag).handle(); + } else if (CommandActions.UPDATE.equals(command)) { + if (line.hasOption(GravitinoOptions.COMMENT)) { + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + new UpdateTagComment(url, metalake, tag, comment).handle(); + } + if (line.hasOption(GravitinoOptions.RENAME)) { + String newName = line.getOptionValue(GravitinoOptions.RENAME); + new UpdateTagName(url, metalake, tag, newName).handle(); + } + } + } + /** Handles the command execution based on command type and the command line options. */ protected void handleGeneralCommand() { String url = getUrl(); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index ef02481124c..5d14f29f6ed 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -54,6 +54,7 @@ public class GravitinoOptions { public static final String DATABASE = "database"; public static final String BOOTSTRAP = "bootstrap"; public static final String GROUP = "group"; + public static final String TAG = "tag"; /** * Builds and returns the CLI options for Gravitino. @@ -103,6 +104,7 @@ public Options options() { options.addOption(createArgOption("p", PASSWORD, "database password")); options.addOption(createArgOption("d", DATABASE, "database name")); options.addOption(createArgOption("g", GROUP, "group name")); + options.addOption(createArgOption("t", TAG, "tag name")); return options; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java new file mode 100644 index 00000000000..022daccdae3 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java @@ -0,0 +1,65 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.TagAlreadyExistsException; + +public class CreateTag extends Command { + protected String metalake; + protected String tag; + protected String comment; + + /** + * Create a new tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param tag The name of the tag. + * @param comment The comment of the tag. + */ + public CreateTag(String url, String metalake, String tag, String comment) { + super(url); + this.metalake = metalake; + this.tag = tag; + this.comment = comment; + } + + /** Create a new tag. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + client.createTag(tag, comment, null); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (TagAlreadyExistsException err) { + System.err.println(ErrorMessages.TAG_EXISTS); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(tag + " created"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java new file mode 100644 index 00000000000..7b717f3d0a7 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTagException; + +public class DeleteTag extends Command { + + protected String metalake; + protected String tag; + + /** + * Delete a tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param tag The name of the tag. + */ + public DeleteTag(String url, String metalake, String tag) { + super(url); + this.metalake = metalake; + this.tag = tag; + } + + /** Delete a catalog. */ + public void handle() { + boolean deleted = false; + + try { + GravitinoClient client = buildClient(metalake); + deleted = client.deleteTag(tag); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchTagException err) { + System.err.println(ErrorMessages.UNKNOWN_TAG); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (deleted) { + System.out.println(tag + " deleted."); + } else { + System.out.println(tag + " not deleted."); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java new file mode 100644 index 00000000000..7f0f48c18eb --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.Map; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTagException; +import org.apache.gravitino.tag.Tag; + +/** List the properties of a tag. */ +public class ListTagProperties extends ListProperties { + + protected String metalake; + protected String tag; + + /** + * List the properties of a tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param tag The name of the tag. + */ + public ListTagProperties(String url, String metalake, String tag) { + super(url); + this.metalake = metalake; + this.tag = tag; + } + + /** List the properties of a tag. */ + public void handle() { + Tag gTag = null; + try { + GravitinoClient client = buildClient(metalake); + gTag = client.getTag(tag); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchTagException err) { + System.err.println(ErrorMessages.UNKNOWN_TAG); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + Map properties = gTag.properties(); + printProperties(properties); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTags.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTags.java new file mode 100644 index 00000000000..1ef2d8491af --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTags.java @@ -0,0 +1,66 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +/* Lists all tags in a metalake. */ +public class ListTags extends Command { + + protected String metalake; + + /** + * Lists all tags in a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + */ + public ListTags(String url, String metalake) { + super(url); + this.metalake = metalake; + } + + /** Lists all tags in a metalake. */ + public void handle() { + String[] tags = new String[0]; + try { + GravitinoClient client = buildClient(metalake); + tags = client.listTags(); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < tags.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(tags[i]); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java new file mode 100644 index 00000000000..8a815b38e51 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTagException; +import org.apache.gravitino.tag.TagChange; + +/** Remove a property of a tag. */ +public class RemoveTagProperty extends Command { + + protected String metalake; + protected String tag; + protected String property; + + /** + * Remove a property of a tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param tag The name of the tag. + * @param property The name of the property. + */ + public RemoveTagProperty(String url, String metalake, String tag, String property) { + super(url); + this.metalake = metalake; + this.tag = tag; + this.property = property; + } + + /** Remove a property of a catalog. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + TagChange change = TagChange.removeProperty(property); + client.alterTag(tag, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchTagException err) { + System.err.println(ErrorMessages.UNKNOWN_TAG); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(property + " property removed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java new file mode 100644 index 00000000000..4383a4c3fd2 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java @@ -0,0 +1,72 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTagException; +import org.apache.gravitino.tag.TagChange; + +/** Set a property of a tag. */ +public class SetTagProperty extends Command { + + protected String metalake; + protected String tag; + protected String property; + protected String value; + + /** + * Set a property of a tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param tag The name of the tag. + * @param property The name of the property. + * @param value The value of the property. + */ + public SetTagProperty(String url, String metalake, String tag, String property, String value) { + super(url); + this.metalake = metalake; + this.tag = tag; + this.property = property; + this.value = value; + } + + /** Set a property of a tag. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + TagChange change = TagChange.setProperty(property, value); + client.alterTag(tag, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchTagException err) { + System.err.println(ErrorMessages.UNKNOWN_TAG); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(tag + " property set."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java new file mode 100644 index 00000000000..63db84608ce --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +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.tag.Tag; + +public class TagDetails extends Command { + + protected String metalake; + protected String tag; + + /** + * Displays the name and comment of a catalog. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param tag The name of the tag. + */ + public TagDetails(String url, String metalake, String tag) { + super(url); + this.metalake = metalake; + this.tag = tag; + } + + /** Displays the name and details of a specified tag. */ + public void handle() { + Tag result = null; + + try { + GravitinoClient client = buildClient(metalake); + result = client.getTag(tag); + } 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; + } + + if (result != null) { + System.out.println(result.name() + "," + result.comment()); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java new file mode 100644 index 00000000000..1b5e7034446 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.Catalog; +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.Schema; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.cli.FullName; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTableException; +import org.apache.gravitino.rel.Table; + +public class TagEntity extends Command { + protected String metalake; + protected FullName name; + protected String tag; + + /** + * Tag an entity with an existing tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param name The name of the entity. + * @param tag The name of the tag. + */ + public TagEntity(String url, String metalake, FullName name, String tag) { + super(url); + this.metalake = metalake; + this.name = name; + this.tag = tag; + } + + /** Create a new tag. */ + public void handle() { + String entity = "unknown"; + + try { + GravitinoClient client = buildClient(metalake); + + // TODO fileset and topic + if (name.hasTableName()) { + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + String table = name.getTableName(); + Table gTable = + client + .loadCatalog(catalog) + .asTableCatalog() + .loadTable(NameIdentifier.of(schema, table)); + gTable.supportsTags().associateTags(new String[] {tag}, null); + entity = table; + } else if (name.hasSchemaName()) { + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + Schema gSchema = client.loadCatalog(catalog).asSchemas().loadSchema(schema); + gSchema.supportsTags().associateTags(new String[] {tag}, null); + entity = schema; + } else if (name.hasCatalogName()) { + String catalog = name.getCatalogName(); + Catalog gCatalog = client.loadCatalog(catalog); + gCatalog.supportsTags().associateTags(new String[] {tag}, null); + entity = catalog; + } + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchCatalogException err) { + System.err.println(ErrorMessages.UNKNOWN_CATALOG); + return; + } catch (NoSuchTableException err) { + System.err.println(ErrorMessages.UNKNOWN_TABLE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(entity + " tagged"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java new file mode 100644 index 00000000000..c78939233f3 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.Catalog; +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.Schema; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.cli.FullName; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTableException; +import org.apache.gravitino.rel.Table; + +public class UntagEntity extends Command { + protected String metalake; + protected FullName name; + protected String tag; + + /** + * Untag an entity with an existing tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param name The name of the entity. + * @param tag The name of the tag. + */ + public UntagEntity(String url, String metalake, FullName name, String tag) { + super(url); + this.metalake = metalake; + this.name = name; + this.tag = tag; + } + + /** Create a new tag. */ + public void handle() { + String entity = "unknown"; + + try { + GravitinoClient client = buildClient(metalake); + + // TODO fileset and topic + if (name.hasTableName()) { + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + String table = name.getTableName(); + Table gTable = + client + .loadCatalog(catalog) + .asTableCatalog() + .loadTable(NameIdentifier.of(schema, table)); + gTable.supportsTags().associateTags(null, new String[] {tag}); + entity = table; + } else if (name.hasSchemaName()) { + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + Schema gSchema = client.loadCatalog(catalog).asSchemas().loadSchema(schema); + gSchema.supportsTags().associateTags(null, new String[] {tag}); + entity = schema; + } else if (name.hasCatalogName()) { + String catalog = name.getCatalogName(); + Catalog gCatalog = client.loadCatalog(catalog); + gCatalog.supportsTags().associateTags(null, new String[] {tag}); + entity = catalog; + } + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchCatalogException err) { + System.err.println(ErrorMessages.UNKNOWN_CATALOG); + return; + } catch (NoSuchTableException err) { + System.err.println(ErrorMessages.UNKNOWN_TABLE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(entity + " untagged"); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java index 34722b19b6f..ff500515bfd 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java @@ -22,6 +22,7 @@ import org.apache.gravitino.CatalogChange; import org.apache.gravitino.cli.ErrorMessages; import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchCatalogException; import org.apache.gravitino.exceptions.NoSuchMetalakeException; /** Update the name of a catalog. */ @@ -55,6 +56,9 @@ public void handle() { } 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; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java new file mode 100644 index 00000000000..29e6e84c9ee --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTagException; +import org.apache.gravitino.tag.TagChange; + +/** Update the comment of a tag. */ +public class UpdateTagComment extends Command { + + protected String metalake; + protected String tag; + protected String comment; + + /** + * Update the comment of a tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param tag The name of the tag. + * @param comment New metalake comment. + */ + public UpdateTagComment(String url, String metalake, String tag, String comment) { + super(url); + this.metalake = metalake; + this.tag = tag; + this.comment = comment; + } + + /** Update the comment of a tag. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + TagChange change = TagChange.updateComment(comment); + client.alterTag(tag, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchTagException err) { + System.err.println(ErrorMessages.UNKNOWN_TAG); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(tag + " comment changed."); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java new file mode 100644 index 00000000000..b66751ed9d2 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java @@ -0,0 +1,69 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; +import org.apache.gravitino.exceptions.NoSuchTagException; +import org.apache.gravitino.tag.TagChange; + +/** Update the name of a tag. */ +public class UpdateTagName extends Command { + + protected String metalake; + protected String tag; + protected String name; + + /** + * Update the name of a tag. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the tag. + * @param tag The name of the catalog. + * @param name The new metalake name. + */ + public UpdateTagName(String url, String metalake, String tag, String name) { + super(url); + this.metalake = metalake; + this.tag = tag; + this.name = name; + } + + /** Update the name of a catalog. */ + public void handle() { + try { + GravitinoClient client = buildClient(metalake); + TagChange change = TagChange.rename(name); + client.alterTag(tag, change); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchTagException err) { + System.err.println(ErrorMessages.UNKNOWN_TAG); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println(tag + " name changed."); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java index 5290f89055a..6feddde7d7d 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java @@ -41,6 +41,7 @@ public void validEntities() { CommandEntities.isValidEntity(CommandEntities.USER), "USER should be a valid entity"); assertTrue( CommandEntities.isValidEntity(CommandEntities.GROUP), "GROUP should be a valid entity"); + assertTrue(CommandEntities.isValidEntity(CommandEntities.TAG), "TAG should be a valid entity"); } @Test diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 448ab2dbf6c..2afeec7ed80 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -18,8 +18,10 @@ */ import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; @@ -139,4 +141,48 @@ public void missingName() throws Exception { String namePart = fullName.getNamePart(GravitinoOptions.TABLE, 3); assertNull(namePart); } + + @Test + public void hasPartNameMetalake() throws Exception { + String[] args = {"metalake", "details", "--name", "metalake"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + assertTrue(fullName.hasMetalakeName()); + assertFalse(fullName.hasCatalogName()); + assertFalse(fullName.hasSchemaName()); + assertFalse(fullName.hasTableName()); + } + + @Test + public void hasPartNameCatalog() throws Exception { + String[] args = {"catalog", "details", "--name", "metalake.catalog"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + assertTrue(fullName.hasMetalakeName()); + assertTrue(fullName.hasCatalogName()); + assertFalse(fullName.hasSchemaName()); + assertFalse(fullName.hasTableName()); + } + + @Test + public void hasPartNameSchema() throws Exception { + String[] args = {"schema", "details", "--name", "metalake.catalog.schema"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + assertTrue(fullName.hasMetalakeName()); + assertTrue(fullName.hasCatalogName()); + assertTrue(fullName.hasSchemaName()); + assertFalse(fullName.hasTableName()); + } + + @Test + public void hasPartNameTable() throws Exception { + String[] args = {"table", "details", "--name", "metalake.catalog.schema.table"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + assertTrue(fullName.hasMetalakeName()); + assertTrue(fullName.hasCatalogName()); + assertTrue(fullName.hasSchemaName()); + assertTrue(fullName.hasTableName()); + } } From b3f081a4b8475222dd36a0b5b009b21d8afa9d67 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 15 Oct 2024 12:42:02 -0700 Subject: [PATCH 25/83] complete tag CLI --- clients/cli/examples.sh | 56 +++++---- .../org/apache/gravitino/cli/FullName.java | 10 +- .../gravitino/cli/GravitinoCommandLine.java | 9 +- .../java/org/apache/gravitino/cli/Main.java | 5 + .../{ListTags.java => ListAllTags.java} | 4 +- .../cli/commands/ListEntityTags.java | 107 ++++++++++++++++++ .../gravitino/cli/commands/TagEntity.java | 21 +++- .../gravitino/cli/commands/UntagEntity.java | 21 +++- 8 files changed, 190 insertions(+), 43 deletions(-) rename clients/cli/src/main/java/org/apache/gravitino/cli/commands/{ListTags.java => ListAllTags.java} (95%) create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListEntityTags.java diff --git a/clients/cli/examples.sh b/clients/cli/examples.sh index 23ce348026e..cc2d6cc5a22 100755 --- a/clients/cli/examples.sh +++ b/clients/cli/examples.sh @@ -112,6 +112,33 @@ gcli schema remove --name metalake_demo.catalog_postgres.hr --property test # no # Table operations gcli table delete -name metalake_demo.catalog_postgres.hr.salaries +# User examples +gcli user create --name metalake_demo --user new_user +gcli user details --name metalake_demo --user new_user +gcli user list --name metalake_demo +gcli user delete --name metalake_demo --user new_user + +# Group examples +gcli group create --name metalake_demo --user new_group +gcli group details --name metalake_demo --user new_group +gcli group list --name metalake_demo +gcli group delete --name metalake_demo --user new_group + +# Tag examples +gcli tag create --name metalake_demo --tag tagA +gcli tag details --name metalake_demo --tag tagA +gcli tag list --name metalake_demo # all tags in a metalake +gcli tag delete --name metalake_demo --tag tagA +gcli tag update --name metalake_demo --tag tagA --rename new_tag +gcli tag update --name metalake_demo --tag tagA --comment "new comment" +gcli tag properties --name metalake_demo --tag tagA +gcli tag set --name metalake_demo --tag tagA --property color --value green +gcli tag remove --name metalake_demo --tag tagA --property color +gcli tag create --name metalake_demo --tag hr +gcli tag set --name metalake_demo.catalog_postgres.hr --tag hr # tag entity +gcli tag remove --name metalake_demo.catalog_postgres.hr --tag hr # untag entity +gcli tag list --name metalake_demo.catalog_postgres.hr # all tags hr has been taged with + # Exmaples where metalake is set in an evironment variable export GRAVITINO_METALAKE=metalake_demo @@ -147,32 +174,3 @@ gcli schema details --name catalog_hive.sales gcli table list --name catalog_postgres.hr.departments gcli table list --name catalog_mysql.db.iceberg_tables gcli table list --name catalog_hive.sales.products - -# User examples -gcli user create --name metalake_demo --user new_user -gcli user details --name metalake_demo --user new_user -gcli user list --name metalake_demo -gcli user delete --name metalake_demo --user new_user - -# Group examples -gcli group create --name metalake_demo --user new_group -gcli group details --name metalake_demo --user new_group -gcli group list --name metalake_demo -gcli group delete --name metalake_demo --user new_group - -# Tag examples -gcli tag create --name metalake_demo --tag tagA -gcli tag details --name metalake_demo --tag tagA -gcli tag list --name metalake_demo # all tags in a metalake -gcli tag delete --name metalake_demo --tag tagA -gcli tag update --name metalake_demo --tag tagA --rename new_tag -gcli tag update --name metalake_demo --tag tagA --comment "new comment" -gcli tag properties --name metalake_demo --tag tagA -gcli tag set --name metalake_demo --tag tagA --property color --value green -gcli tag remove --name metalake_demo --tag tagA --property color -gcli tag create --name metalake_demo --tag hr -gcli tag set --name metalake_demo.catalog_postgres.hr --tag hr # tag entity -gcli tag remove --name metalake_demo.catalog_postgres.hr --tag hr # untag entity - -gcli tag list --name metalake_demo.catalog_postgres.hr # all tags hr has been taged with -gcli tag list --tag tagA --name metalake_demo # all objects with tagA diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index ecae6c7c437..0fe85026dec 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -19,6 +19,7 @@ package org.apache.gravitino.cli; +import java.util.Arrays; import org.apache.commons.cli.CommandLine; /** @@ -149,8 +150,13 @@ public boolean hasNamePart(String entity) { } else if (line.hasOption(GravitinoOptions.NAME)) { String[] names = line.getOptionValue(GravitinoOptions.NAME).split("\\."); int length = names.length; - String [] order = {GravitinoOptions.METALAKE, GravitinoOptions.CATALOG,GravitinoOptions.SCHEMA,GravitinoOptions.TABLE}; - int position = order.indexOf(entity); + String[] order = { + GravitinoOptions.METALAKE, + GravitinoOptions.CATALOG, + GravitinoOptions.SCHEMA, + GravitinoOptions.TABLE + }; + int position = Arrays.asList(order).indexOf(entity); /* Adjust position if metalake is part of the full name. */ if (metalakeEnv != null) { 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 938dbdaf390..a909c08a4f0 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 @@ -44,9 +44,11 @@ import org.apache.gravitino.cli.commands.DeleteTag; import org.apache.gravitino.cli.commands.DeleteUser; import org.apache.gravitino.cli.commands.GroupDetails; +import org.apache.gravitino.cli.commands.ListAllTags; 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.ListEntityTags; import org.apache.gravitino.cli.commands.ListGroups; import org.apache.gravitino.cli.commands.ListMetalakeProperties; import org.apache.gravitino.cli.commands.ListMetalakes; @@ -54,7 +56,6 @@ import org.apache.gravitino.cli.commands.ListSchemaProperties; import org.apache.gravitino.cli.commands.ListTables; import org.apache.gravitino.cli.commands.ListTagProperties; -import org.apache.gravitino.cli.commands.ListTags; import org.apache.gravitino.cli.commands.ListUsers; import org.apache.gravitino.cli.commands.MetalakeDetails; import org.apache.gravitino.cli.commands.RemoveCatalogProperty; @@ -358,7 +359,11 @@ protected void handleTagCommand() { if (CommandActions.DETAILS.equals(command)) { new TagDetails(url, metalake, tag).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListTags(url, metalake).handle(); + if (name.hasMetalakeName() && !name.hasCatalogName()) { + new ListAllTags(url, metalake).handle(); + } else { + new ListEntityTags(url, metalake, name).handle(); + } } else if (CommandActions.CREATE.equals(command)) { String comment = line.getOptionValue(GravitinoOptions.COMMENT); new CreateTag(url, metalake, tag, comment).handle(); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 62196c2368b..c9853ca970a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -122,6 +122,11 @@ protected static String resolveEntity(CommandLine line, boolean command) { /* Or as the bare first argument of one or two arguments. */ String[] args = line.getArgs(); + + if (args.length == 0) { + return null; + } + String entity = args[0]; if (args.length == 1) { diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTags.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java similarity index 95% rename from clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTags.java rename to clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java index 1ef2d8491af..967d77096f6 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTags.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java @@ -24,7 +24,7 @@ import org.apache.gravitino.exceptions.NoSuchMetalakeException; /* Lists all tags in a metalake. */ -public class ListTags extends Command { +public class ListAllTags extends Command { protected String metalake; @@ -34,7 +34,7 @@ public class ListTags extends Command { * @param url The URL of the Gravitino server. * @param metalake The name of the metalake. */ - public ListTags(String url, String metalake) { + public ListAllTags(String url, String metalake) { super(url); this.metalake = metalake; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListEntityTags.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListEntityTags.java new file mode 100644 index 00000000000..2de2eb8da5b --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListEntityTags.java @@ -0,0 +1,107 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.Catalog; +import org.apache.gravitino.NameIdentifier; +import org.apache.gravitino.Schema; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.cli.FullName; +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.Table; + +/* Lists all tags in a metalake. */ +public class ListEntityTags extends Command { + + protected String metalake; + protected FullName name; + + /** + * Lists all tags in a metalake. + * + * @param url The URL of the Gravitino server. + * @param metalake The name of the metalake. + * @param name The name of the entity. + */ + public ListEntityTags(String url, String metalake, FullName name) { + super(url); + this.metalake = metalake; + this.name = name; + } + + /** Lists all tags in a metalake. */ + public void handle() { + String[] tags = new String[0]; + try { + GravitinoClient client = buildClient(metalake); + + // TODO fileset and topic + if (name.hasTableName()) { + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + String table = name.getTableName(); + Table gTable = + client + .loadCatalog(catalog) + .asTableCatalog() + .loadTable(NameIdentifier.of(schema, table)); + tags = gTable.supportsTags().listTags(); + } else if (name.hasSchemaName()) { + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + Schema gSchema = client.loadCatalog(catalog).asSchemas().loadSchema(schema); + tags = gSchema.supportsTags().listTags(); + } else if (name.hasCatalogName()) { + String catalog = name.getCatalogName(); + Catalog gCatalog = client.loadCatalog(catalog); + tags = gCatalog.supportsTags().listTags(); + } + } 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); + return; + } catch (NoSuchTableException err) { + System.err.println(ErrorMessages.UNKNOWN_TABLE); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + StringBuilder all = new StringBuilder(); + for (int i = 0; i < tags.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(tags[i]); + } + + System.out.println(all.toString()); + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java index 1b5e7034446..84885fd62b6 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java @@ -27,6 +27,7 @@ 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.Table; @@ -53,6 +54,7 @@ public TagEntity(String url, String metalake, FullName name, String tag) { /** Create a new tag. */ public void handle() { String entity = "unknown"; + String[] tags = new String[0]; try { GravitinoClient client = buildClient(metalake); @@ -67,18 +69,18 @@ public void handle() { .loadCatalog(catalog) .asTableCatalog() .loadTable(NameIdentifier.of(schema, table)); - gTable.supportsTags().associateTags(new String[] {tag}, null); + tags = gTable.supportsTags().associateTags(new String[] {tag}, null); entity = table; } else if (name.hasSchemaName()) { String catalog = name.getCatalogName(); String schema = name.getSchemaName(); Schema gSchema = client.loadCatalog(catalog).asSchemas().loadSchema(schema); - gSchema.supportsTags().associateTags(new String[] {tag}, null); + tags = gSchema.supportsTags().associateTags(new String[] {tag}, null); entity = schema; } else if (name.hasCatalogName()) { String catalog = name.getCatalogName(); Catalog gCatalog = client.loadCatalog(catalog); - gCatalog.supportsTags().associateTags(new String[] {tag}, null); + tags = gCatalog.supportsTags().associateTags(new String[] {tag}, null); entity = catalog; } } catch (NoSuchMetalakeException err) { @@ -87,6 +89,9 @@ public void handle() { } catch (NoSuchCatalogException err) { System.err.println(ErrorMessages.UNKNOWN_CATALOG); return; + } catch (NoSuchSchemaException err) { + System.err.println(ErrorMessages.UNKNOWN_SCHEMA); + return; } catch (NoSuchTableException err) { System.err.println(ErrorMessages.UNKNOWN_TABLE); return; @@ -95,6 +100,14 @@ public void handle() { return; } - System.out.println(entity + " tagged"); + StringBuilder all = new StringBuilder(); + for (int i = 0; i < tags.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(tags[i]); + } + + System.out.println(entity + " tagged with " + all); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java index c78939233f3..c47929ad445 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java @@ -27,6 +27,7 @@ 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.Table; @@ -53,6 +54,7 @@ public UntagEntity(String url, String metalake, FullName name, String tag) { /** Create a new tag. */ public void handle() { String entity = "unknown"; + String[] tags = new String[0]; try { GravitinoClient client = buildClient(metalake); @@ -67,18 +69,18 @@ public void handle() { .loadCatalog(catalog) .asTableCatalog() .loadTable(NameIdentifier.of(schema, table)); - gTable.supportsTags().associateTags(null, new String[] {tag}); + tags = gTable.supportsTags().associateTags(null, new String[] {tag}); entity = table; } else if (name.hasSchemaName()) { String catalog = name.getCatalogName(); String schema = name.getSchemaName(); Schema gSchema = client.loadCatalog(catalog).asSchemas().loadSchema(schema); - gSchema.supportsTags().associateTags(null, new String[] {tag}); + tags = gSchema.supportsTags().associateTags(null, new String[] {tag}); entity = schema; } else if (name.hasCatalogName()) { String catalog = name.getCatalogName(); Catalog gCatalog = client.loadCatalog(catalog); - gCatalog.supportsTags().associateTags(null, new String[] {tag}); + tags = gCatalog.supportsTags().associateTags(null, new String[] {tag}); entity = catalog; } } catch (NoSuchMetalakeException err) { @@ -87,6 +89,9 @@ public void handle() { } catch (NoSuchCatalogException err) { System.err.println(ErrorMessages.UNKNOWN_CATALOG); return; + } catch (NoSuchSchemaException err) { + System.err.println(ErrorMessages.UNKNOWN_TABLE); + return; } catch (NoSuchTableException err) { System.err.println(ErrorMessages.UNKNOWN_TABLE); return; @@ -95,6 +100,14 @@ public void handle() { return; } - System.out.println(entity + " untagged"); + StringBuilder all = new StringBuilder(); + for (int i = 0; i < tags.length; i++) { + if (i > 0) { + all.append(","); + } + all.append(tags[i]); + } + + System.out.println(entity + " untagged, tagged with " + all); } } From 29c9222fd08e8253b71f2e45c7c6645909a8279d Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 15 Oct 2024 13:03:48 -0700 Subject: [PATCH 26/83] update docs --- clients/cli/README.md | 90 ++++++++++++++++++- .../gravitino/cli/GravitinoOptions.java | 7 +- 2 files changed, 92 insertions(+), 5 deletions(-) diff --git a/clients/cli/README.md b/clients/cli/README.md index b4f7c2cfc88..3a7d6b1ea0a 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -74,13 +74,15 @@ Before you can build and run this project, it is suggested you have the followin To run the Gravitino CLI, use the following command structure: ```bash -usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update|set|remove|properties] [options] +usage: gcli [metalake|catalog|schema|table|user|group|tag] [list|details|create|delete|update|set|remove|properties] [options] + -a,--tag tag name -b,--bootstrap Kafka bootstrap servers -c,--catalog catalog name -C,--create create an entity -D,--details list details about an entity -d,--database database name -e,--entity entity type + -g,--group group name -h,--help command help information -j,--jdbcurl JDBC URL -L,--list list entity children @@ -88,15 +90,16 @@ usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update|s -n,--name full entity name (dot separated) -P,--properties show an entities properties -p,--password database password - -R,--delete delete an entity -r,--rename new entity name + -R,--delete delete an entity -s,--schema schema name -t,--table table name -u,--user database username -U,--update update an entity -v,--value property value -w,--warehouse warehouse name - -x,--command one of: list, details, create, delete, or update + -x,--command one of: list, details, create, delete, update, + set, remove or properties ``` The command line can be used in several ways to achieve the same results, depending on your preference. @@ -119,6 +122,9 @@ details: Show detailed information about an entity create: Create a new entity delete: Delete an existing entity update: Update an existing entity +set: Used to set properties and tags +remove: Used to remove properties and tags +properties: Used to list properties ### Examples List All Metalakes @@ -169,6 +175,84 @@ Update a Metalake's comment gcli metalake update -name metalake_demo -comment "new comment" ``` +List the properties of a Metalake + +```bash +gcli metalake properties --name metalake_demo +``` + +Set a Metalake's property + +```bash +gcli metalake set --name metalake_demo --property color --value red +``` + +Remove a Metalake's property + +```bash +gcli metalake remove --name metalake_demo --property color +``` + +Create a new User + +```bash +gcli user create --name metalake_demo --user new_user +``` + +Show a User's information + +```bash +gcli user details --name metalake_demo --user new_user +``` + +Show all Users + +```bash +gcli user list --name metalake_demo +``` + +Delete a User + +```bash +gcli user delete --name metalake_demo --user new_user +``` + +Create a Tag + +```bash +gcli tag create --name metalake_demo --tag tagA +``` + +List all Tags in a Metalake + +```bash +gcli tag list --name metalake_demo +``` + +Delete a Tag + +```bash +gcli tag delete --name metalake_demo --tag tagA +``` + +Add a Tag to a Schema + +```bash +gcli tag set --name metalake_demo.catalog_postgres.hr --tag hr +``` + +Remove a Tag from a Schema + +```bash +gcli tag remove --name metalake_demo.catalog_postgres.hr --tag hr +``` + +List all tags on a Schema + +```bash +gcli tag list --name metalake_demo.catalog_postgres.hr +``` + ### Setting Metalake name As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index 5d14f29f6ed..2a299caa15f 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -78,7 +78,10 @@ public Options options() { // One way of specifying the command options.addOption( - createArgOption("x", COMMAND, "one of: list, details, create, delete, or update")); + createArgOption( + "x", + COMMAND, + "one of: list, details, create, delete, update, set, remove or properties")); // Another way of specifying the command options.addOption(createSimpleOption("L", LIST, "list entity children")); @@ -104,7 +107,7 @@ public Options options() { options.addOption(createArgOption("p", PASSWORD, "database password")); options.addOption(createArgOption("d", DATABASE, "database name")); options.addOption(createArgOption("g", GROUP, "group name")); - options.addOption(createArgOption("t", TAG, "tag name")); + options.addOption(createArgOption("a", TAG, "tag name")); return options; } From f90a086c794b59e36cf723efcd81d58318f55097 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 15 Oct 2024 23:18:24 -0700 Subject: [PATCH 27/83] fix spelling error --- clients/cli/errors.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/clients/cli/errors.sh b/clients/cli/errors.sh index 9d0571742de..16ba3d49989 100644 --- a/clients/cli/errors.sh +++ b/clients/cli/errors.sh @@ -26,10 +26,10 @@ alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAP # No such command gcli unknown -# unknown command and entiry +# unknown command and entity gcli unknown unknown -# unknown command and entiry +# unknown command and entity gcli unknown unknown # unknown command From 3c87c3d236208695e0aad943887eda1a71619921 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 16 Oct 2024 08:49:41 -0700 Subject: [PATCH 28/83] add examples not using metalake --- clients/cli/README.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/clients/cli/README.md b/clients/cli/README.md index b4f7c2cfc88..58101f66a17 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -179,6 +179,26 @@ As dealing with one Metalake is a typical scenario, you can set the Metalake nam The command line option overrides the other options and the environment variable overrides the value in the configuration file. +Once the metalake name is set via one of the preceding methods, if no longer needs to be specified in the command line. + +Show Metalake details + +```bash +gcli metalake details +``` + +List all Catalogs in a Metalake + +```bash +gcli metalake list +``` + +List catalog schemas + +```bash +gcli catalog list --name catalog_iceberg +``` + ## Running Tests This project includes a suite of unit tests to verify its functionality. From 10af3d26d6900f7172aaeee57d4e3e9a177311dd Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 16 Oct 2024 08:52:59 -0700 Subject: [PATCH 29/83] remove duplication and clarify --- clients/cli/errors.sh | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/clients/cli/errors.sh b/clients/cli/errors.sh index bc67633c06a..de0ed3baef5 100644 --- a/clients/cli/errors.sh +++ b/clients/cli/errors.sh @@ -29,9 +29,6 @@ gcli unknown # unknown command and entiry gcli unknown unknown -# unknown command and entiry -gcli unknown unknown - # unknown command gcli metalake unknown @@ -47,5 +44,5 @@ gcli metalake details --name unknown # Unknown catalog name gcli catalog details --name metalake_demo.unknown -# Unknown catalog name +# Missing catalog name gcli catalog details --name metalake_demo From f955db2b5d21bbf3d80f60a7be94c6f80d30059d Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 16 Oct 2024 09:16:49 -0700 Subject: [PATCH 30/83] use client shadow jar --- integration-test-common/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-test-common/build.gradle.kts b/integration-test-common/build.gradle.kts index a25ad4cff8f..e0678b97d7a 100644 --- a/integration-test-common/build.gradle.kts +++ b/integration-test-common/build.gradle.kts @@ -27,7 +27,7 @@ repositories { dependencies { testImplementation(project(":api")) - testImplementation(project(":clients:client-java")) + testImplementation(project(":clients:client-java", configuration = "shadow")) testImplementation(project(":common")) testImplementation(project(":core")) testImplementation(project(":server")) From 80aef916100f86c0f0935edd2d2c890de03e9731 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 16 Oct 2024 09:53:04 -0700 Subject: [PATCH 31/83] wrong file --- integration-test-common/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integration-test-common/build.gradle.kts b/integration-test-common/build.gradle.kts index e0678b97d7a..a25ad4cff8f 100644 --- a/integration-test-common/build.gradle.kts +++ b/integration-test-common/build.gradle.kts @@ -27,7 +27,7 @@ repositories { dependencies { testImplementation(project(":api")) - testImplementation(project(":clients:client-java", configuration = "shadow")) + testImplementation(project(":clients:client-java")) testImplementation(project(":common")) testImplementation(project(":core")) testImplementation(project(":server")) From 6d897c050149e4ab4629a99f5a9b0148277204ca Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 16 Oct 2024 22:14:02 -0700 Subject: [PATCH 32/83] new -> 19 --- clients/cli/build.gradle.kts | 2 +- gradle/libs.versions.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts index 3b0434b64b8..6e6da9dae41 100644 --- a/clients/cli/build.gradle.kts +++ b/clients/cli/build.gradle.kts @@ -28,7 +28,7 @@ dependencies { implementation(project(":common")) implementation(libs.slf4j.api) implementation(libs.slf4j.simple) - implementation(libs.commons.cli.new) + implementation(libs.commons.cli.19) testImplementation(libs.junit.jupiter.api) testImplementation(libs.junit.jupiter.params) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 2888f220876..e19f189c0b5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -90,7 +90,7 @@ shadow-plugin = "8.1.1" kerby = "2.0.3" node-plugin = "7.0.1" commons-cli = "1.2" -commons-cli-new = "1.9.0" +commons-cli-19 = "1.9.0" sun-activation-version = "1.2.0" error-prone = "3.1.0" woodstox-core = "5.3.0" @@ -211,7 +211,7 @@ postgresql-driver = { group = "org.postgresql", name = "postgresql", version.ref minikdc = { group = "org.apache.hadoop", name = "hadoop-minikdc", version.ref = "hadoop-minikdc"} immutables-value = { module = "org.immutables:value", version.ref = "immutables-value" } commons-cli = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli" } -commons-cli-new = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli-new" } +commons-cli-19 = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli-19" } sun-activation = { group = "com.sun.activation", name = "javax.activation", version.ref = "sun-activation-version" } kafka-clients = { group = "org.apache.kafka", name = "kafka-clients", version.ref = "kafka" } kafka = { group = "org.apache.kafka", name = "kafka_2.12", version.ref = "kafka" } From 76aa1fe7f6b40cc695c8ad8b578c9c7ea457ed01 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 16 Oct 2024 22:16:38 -0700 Subject: [PATCH 33/83] fix example command --- clients/cli/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/cli/README.md b/clients/cli/README.md index fc61816fb68..265496bed53 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -119,7 +119,7 @@ gcli metalake details -name my-metalake List Tables in a Catalog ```bash -gcli metalake list -name my-metalake.my-catalog +gcli metalake list -name my-metalake ``` ## Running Tests From affd6ad3e0a9eadba3d4f43e95b9c22994dbad20 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 16 Oct 2024 22:28:32 -0700 Subject: [PATCH 34/83] revert as the suggested name is not value --- clients/cli/build.gradle.kts | 2 +- gradle/libs.versions.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts index 6e6da9dae41..3b0434b64b8 100644 --- a/clients/cli/build.gradle.kts +++ b/clients/cli/build.gradle.kts @@ -28,7 +28,7 @@ dependencies { implementation(project(":common")) implementation(libs.slf4j.api) implementation(libs.slf4j.simple) - implementation(libs.commons.cli.19) + implementation(libs.commons.cli.new) testImplementation(libs.junit.jupiter.api) testImplementation(libs.junit.jupiter.params) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index e19f189c0b5..2888f220876 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -90,7 +90,7 @@ shadow-plugin = "8.1.1" kerby = "2.0.3" node-plugin = "7.0.1" commons-cli = "1.2" -commons-cli-19 = "1.9.0" +commons-cli-new = "1.9.0" sun-activation-version = "1.2.0" error-prone = "3.1.0" woodstox-core = "5.3.0" @@ -211,7 +211,7 @@ postgresql-driver = { group = "org.postgresql", name = "postgresql", version.ref minikdc = { group = "org.apache.hadoop", name = "hadoop-minikdc", version.ref = "hadoop-minikdc"} immutables-value = { module = "org.immutables:value", version.ref = "immutables-value" } commons-cli = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli" } -commons-cli-19 = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli-19" } +commons-cli-new = { group = "commons-cli", name = "commons-cli", version.ref = "commons-cli-new" } sun-activation = { group = "com.sun.activation", name = "javax.activation", version.ref = "sun-activation-version" } kafka-clients = { group = "org.apache.kafka", name = "kafka-clients", version.ref = "kafka" } kafka = { group = "org.apache.kafka", name = "kafka_2.12", version.ref = "kafka" } From abc2da84c7de366879a5108d36a358b52595b1ea Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 17 Oct 2024 09:13:42 -0700 Subject: [PATCH 35/83] simplify command options --- clients/cli/{ => bin}/errors.sh | 14 +-- clients/cli/bin/examples.sh | 103 ++++++++++++++++ clients/cli/{ => docs}/README.md | 20 ++-- clients/cli/examples.sh | 111 ------------------ .../org/apache/gravitino/cli/FullName.java | 29 ++--- .../gravitino/cli/GravitinoOptions.java | 17 +-- .../java/org/apache/gravitino/cli/Main.java | 48 +------- .../apache/gravitino/cli/TestFulllName.java | 42 +------ .../org/apache/gravitino/cli/TestMain.java | 15 +-- 9 files changed, 138 insertions(+), 261 deletions(-) rename clients/cli/{ => bin}/errors.sh (83%) create mode 100755 clients/cli/bin/examples.sh rename clients/cli/{ => docs}/README.md (91%) delete mode 100755 clients/cli/examples.sh diff --git a/clients/cli/errors.sh b/clients/cli/bin/errors.sh similarity index 83% rename from clients/cli/errors.sh rename to clients/cli/bin/errors.sh index de0ed3baef5..38eb99e1f74 100644 --- a/clients/cli/errors.sh +++ b/clients/cli/bin/errors.sh @@ -27,22 +27,22 @@ alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAP gcli unknown # unknown command and entiry -gcli unknown unknown +gcli unknown --unknown # unknown command -gcli metalake unknown +gcli metalake --unknown # unknown entity -gcli unknown list +gcli unknown --list # Name not specified -gcli metalake details +gcli metalake --details # Unknown metalake name -gcli metalake details --name unknown +gcli metalake --details --name unknown # Unknown catalog name -gcli catalog details --name metalake_demo.unknown +gcli catalog --details --name metalake_demo.unknown # Missing catalog name -gcli catalog details --name metalake_demo +gcli catalog --details --name metalake_demo diff --git a/clients/cli/bin/examples.sh b/clients/cli/bin/examples.sh new file mode 100755 index 00000000000..bb8994e03eb --- /dev/null +++ b/clients/cli/bin/examples.sh @@ -0,0 +1,103 @@ +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +#!/bin/bash + +# These examples assume you have the Apache Gravitino playground running. + +unset GRAVITINO_METALAKE +alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' + +# display help +gcli --help + +# display version +gcli --version + +# metalake details +gcli --details + +# metalake list +gcli --list + +# list all catalogs in a metalake +gcli metalake --list --name metalake_demo + +# list catalog schema +gcli catalog --list --name metalake_demo.catalog_iceberg +gcli catalog --list --name metalake_demo.catalog_mysql +gcli catalog --list --name metalake_demo.catalog_postgres +gcli catalog --list --name metalake_demo.catalog_hive + +# list catalog details +gcli catalog --details --name metalake_demo.catalog_iceberg +gcli catalog --details --name metalake_demo.catalog_mysql +gcli catalog --details --name metalake_demo.catalog_postgres +gcli catalog --details --name metalake_demo.catalog_hive + +# list schema tables +gcli schema --list --name metalake_demo.catalog_postgres.hr +gcli schema --list --name metalake_demo.catalog_mysql.db +gcli schema --list --name metalake_demo.catalog_hive.sales + +# list schema details +gcli schema --details --name metalake_demo.catalog_postgres.hr +gcli schema --details --name metalake_demo.catalog_mysql.db +gcli schema --details --name metalake_demo.catalog_hive.sales + +# list table details +gcli table --list --name metalake_demo.catalog_postgres.hr.departments +gcli table --list --name metalake_demo.catalog_mysql.db.iceberg_tables +gcli table --list --name metalake_demo.catalog_hive.sales.products + +# Exmaples where metalake is set in an evironment variable +export GRAVITINO_METALAKE=metalake_demo + +# metalake details +gcli metalake --details + +# list all catalogs in a metalake +gcli metalake --list + +# list catalog schema +gcli catalog --list --name catalog_iceberg +gcli catalog --list --name catalog_mysql +gcli catalog --list --name catalog_postgres +gcli catalog --list --name catalog_hive + +# list catalog details +gcli catalog --details --name catalog_iceberg +gcli catalog --details --name catalog_mysql +gcli catalog --details --name catalog_postgres +gcli catalog --details --name catalog_hive + +# list schema tables +gcli schema --list --name catalog_postgres.hr +gcli schema --list --name catalog_mysql.db +gcli schema --list --name catalog_hive.sales + +# list schema details +gcli schema --details --name catalog_postgres.hr +gcli schema --details --name catalog_mysql.db +gcli schema --details --name catalog_hive.sales + +# list table details +gcli table --list --name catalog_postgres.hr.departments +gcli table --list --name catalog_mysql.db.iceberg_tables +gcli table --list --name catalog_hive.sales.products diff --git a/clients/cli/README.md b/clients/cli/docs/README.md similarity index 91% rename from clients/cli/README.md rename to clients/cli/docs/README.md index 265496bed53..da684bd5d36 100644 --- a/clients/cli/README.md +++ b/clients/cli/docs/README.md @@ -36,7 +36,7 @@ Apache Gravitino CLI is a command-line tool that interacts with the Gravitino se - Retrieve server version - Provide help on usage - Manage Gravitino entities such as Metalakes, Catalogs, Schemas, and Tables -- List details about Graviotino entities +- List details about Gravitino entities ## Installation @@ -44,7 +44,7 @@ Apache Gravitino CLI is a command-line tool that interacts with the Gravitino se Before you can build and run this project, it is suggested you have the following installed: -- Java 11 or higher +- Java 8 or higher ### Build the Project @@ -97,29 +97,29 @@ Options ## Commands The following commands are available for entity management: -list: List available entities -details: Show detailed information about an entity -create: Create a new entity -delete: Delete an existing entity -update: Update an existing entity +--list: List available entities +--details: Show detailed information about an entity +--create: Create a new entity +--delete: Delete an existing entity +--update: Update an existing entity ### Examples List All Metalakes ```bash -gcli list +gcli --list ``` Get Details of a Specific Metalake ```bash -gcli metalake details -name my-metalake +gcli metalake --details -name my-metalake ``` List Tables in a Catalog ```bash -gcli metalake list -name my-metalake +gcli metalake --list -name my-metalake ``` ## Running Tests diff --git a/clients/cli/examples.sh b/clients/cli/examples.sh deleted file mode 100755 index 757ef89f017..00000000000 --- a/clients/cli/examples.sh +++ /dev/null @@ -1,111 +0,0 @@ -# -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# - -#!/bin/bash - -# These examples assume you have the Apache Gravitino playground running. - -unset GRAVITINO_METALAKE -alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' - -# display help -gcli --help - -# display version -gcli --version - -# metalake details -gcli details - -# metalake list -gcli list - -# metalake details (all these command are equivalent) -gcli metalake details --name metalake_demo -gcli metalake details --metalake metalake_demo -gcli --command details --metalake metalake_demo -gcli metalake --name metalake_demo details -gcli details --name metalake_demo -gcli details --metalake metalake_demo - -# list all catalogs in a metalake -gcli metalake list --name metalake_demo - -# list catalog schema -gcli catalog list --name metalake_demo.catalog_iceberg -gcli catalog list --name metalake_demo.catalog_mysql -gcli catalog list --name metalake_demo.catalog_postgres -gcli catalog list --name metalake_demo.catalog_hive - -# list catalog details -gcli catalog details --name metalake_demo.catalog_iceberg -gcli catalog details --name metalake_demo.catalog_mysql -gcli catalog details --name metalake_demo.catalog_postgres -gcli catalog details --name metalake_demo.catalog_hive - -# list schema tables -gcli schema list --name metalake_demo.catalog_postgres.hr -gcli schema list --name metalake_demo.catalog_mysql.db -gcli schema list --name metalake_demo.catalog_hive.sales - -# list schema details -gcli schema details --name metalake_demo.catalog_postgres.hr -gcli schema details --name metalake_demo.catalog_mysql.db -gcli schema details --name metalake_demo.catalog_hive.sales - -# list table details -gcli table list --name metalake_demo.catalog_postgres.hr.departments -gcli table list --name metalake_demo.catalog_mysql.db.iceberg_tables -gcli table list --name metalake_demo.catalog_hive.sales.products - -# Exmaples where metalake is set in an evironment variable -export GRAVITINO_METALAKE=metalake_demo - -# metalake details -gcli metalake details - -# list all catalogs in a metalake -gcli metalake list - -# list catalog schema -gcli catalog list --name catalog_iceberg -gcli catalog list --name catalog_mysql -gcli catalog list --name catalog_postgres -gcli catalog list --name catalog_hive - -# list catalog details -gcli catalog details --name catalog_iceberg -gcli catalog details --name catalog_mysql -gcli catalog details --name catalog_postgres -gcli catalog details --name catalog_hive - -# list schema tables -gcli schema list --name catalog_postgres.hr -gcli schema list --name catalog_mysql.db -gcli schema list --name catalog_hive.sales - -# list schema details -gcli schema details --name catalog_postgres.hr -gcli schema details --name catalog_mysql.db -gcli schema details --name catalog_hive.sales - -# list table details -gcli table list --name catalog_postgres.hr.departments -gcli table list --name catalog_mysql.db.iceberg_tables -gcli table list --name catalog_hive.sales.products diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index a337a56b189..dcae8c1619a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -50,11 +50,8 @@ public String getMetalakeName() { metalakeEnv = System.getenv("GRAVITINO_METALAKE"); } - // Check if the metalake name is specified as a command line option - if (line.hasOption(GravitinoOptions.METALAKE)) { - return line.getOptionValue(GravitinoOptions.METALAKE); - // Check if the metalake name is set as an environment variable - } else if (metalakeEnv != null) { + // Check if the metalake name is set as an environment variable + if (metalakeEnv != null) { return metalakeEnv; // Extract the metalake name from the full name option } else if (line.hasOption(GravitinoOptions.NAME)) { @@ -65,46 +62,42 @@ public String getMetalakeName() { } /** - * Retrieves the catalog name from the command line or the second part of the full name option. + * Retrieves the catalog name from the second part of the full name option. * * @return The catalog name, or null if not found. */ public String getCatalogName() { - return getNamePart(GravitinoOptions.CATALOG, 1); + return getNamePart(1); } /** - * Retrieves the schema name from the command line or the third part of the full name option. + * Retrieves the schema name from the third part of the full name option. * * @return The schema name, or null if not found. */ public String getSchemaName() { - return getNamePart(GravitinoOptions.SCHEMA, 2); + return getNamePart(2); } /** - * Retrieves the table name from the command line or the fourth part of the full name option. + * Retrieves the table name from the fourth part of the full name option. * * @return The table name, or null if not found. */ public String getTableName() { - return getNamePart(GravitinoOptions.TABLE, 3); + return getNamePart(3); } /** * Helper method to retrieve a specific part of the full name based on the position of the part. * - * @param entity The part of the name to obtain. * @param position The position of the name part in the full name string. * @return The extracted part of the name, or {@code null} if the name part is missing or * malformed. */ - public String getNamePart(String entity, int position) { - /* Check if the name is specified as a command line option. */ - if (line.hasOption(entity)) { - return line.getOptionValue(entity); - /* Extract the name part from the full name if available. */ - } else if (line.hasOption(GravitinoOptions.NAME)) { + public String getNamePart(int position) { + /* Extract the name part from the full name if available. */ + if (line.hasOption(GravitinoOptions.NAME)) { String[] names = line.getOptionValue(GravitinoOptions.NAME).split("\\."); /* Adjust position if metalake is part of the full name. */ diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index 270e0b35637..bcb2a95abc7 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -28,13 +28,7 @@ public class GravitinoOptions { public static final String VERSION = "version"; public static final String SERVER = "server"; public static final String URL = "url"; - public static final String METALAKE = "metalake"; - public static final String CATALOG = "catalog"; - public static final String SCHEMA = "schema"; - public static final String TABLE = "table"; public static final String NAME = "name"; - public static final String ENTITY = "entity"; - public static final String COMMAND = "command"; public static final String LIST = "list"; public static final String DETAILS = "details"; public static final String CREATE = "create"; @@ -54,18 +48,9 @@ public Options options() { options.addOption(createSimpleOption("v", VERSION, "Gravitino client version")); options.addOption(createSimpleOption("r", SERVER, "Gravitino server version")); options.addOption(createArgOption("u", URL, "Gravitino URL (default: http://localhost:8090)")); - options.addOption(createArgOption("m", METALAKE, "metalake name")); - options.addOption(createArgOption("c", CATALOG, "catalog name")); - options.addOption(createArgOption("s", SCHEMA, "schema name")); - options.addOption(createArgOption("t", TABLE, "table name")); options.addOption(createArgOption("f", NAME, "full entity name (dot separated)")); - options.addOption(createArgOption("e", ENTITY, "entity type")); - // One way of specifying the command - options.addOption( - createArgOption("x", COMMAND, "one of: list, details, create, delete, or update")); - - // Another way of specifying the command + // specifying the command options.addOption(createSimpleOption("L", LIST, "list entity children")); options.addOption(createSimpleOption("D", DETAILS, "list details about an entity")); options.addOption(createSimpleOption("C", CREATE, "create an entity")); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 47a01a2a587..b36a57be147 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -51,15 +51,7 @@ public static void main(String[] args) { * @return The command, one of 'details', 'list', 'create', 'delete' or 'update'. */ protected static String resolveCommand(CommandLine line) { - /* Can be specified in the form --command XXX. */ - if (line.hasOption(GravitinoOptions.COMMAND)) { - String command = line.getOptionValue(GravitinoOptions.COMMAND); - if (CommandActions.isValidCommand(command)) { - return command; - } - } - - /* Or as --list, --details --create --delete or --update. */ + /* Passed as --list, --details --create --delete or --update. */ if (line.hasOption(GravitinoOptions.LIST)) { return CommandActions.LIST; } else if (line.hasOption(GravitinoOptions.DETAILS)) { @@ -72,20 +64,7 @@ protected static String resolveCommand(CommandLine line) { return CommandActions.UPDATE; } - /* Or as the bare second argument of two arguments. */ - String[] args = line.getArgs(); - - if (args.length == 1 || args.length == 2) { - String command = args[args.length - 1]; - if (CommandActions.isValidCommand(command)) { - return command; - } else { - System.err.println(ErrorMessages.UNSUPPORTED_COMMAND); - return null; - } - } else { - return CommandActions.DETAILS; /* Default to 'details' command. */ - } + return CommandActions.DETAILS; /* Default to 'details' command. */ } /** @@ -95,29 +74,10 @@ protected static String resolveCommand(CommandLine line) { * @return The entity, e.g. metakalake, catalog, schema, table, etc. */ protected static String resolveEntity(CommandLine line) { - /* Can be specified in the form --entity XXX. */ - if (line.hasOption(GravitinoOptions.ENTITY)) { - String entity = line.getOptionValue(GravitinoOptions.ENTITY); - if (CommandEntities.isValidEntity(entity)) { - return entity; - } - } - - /* Or as --metalake, --catalog, --schema, --table etc. */ - if (line.hasOption(GravitinoOptions.METALAKE)) { - return CommandEntities.METALAKE; - } else if (line.hasOption(GravitinoOptions.CATALOG)) { - return CommandEntities.CATALOG; - } else if (line.hasOption(GravitinoOptions.SCHEMA)) { - return CommandEntities.SCHEMA; - } else if (line.hasOption(GravitinoOptions.TABLE)) { - return CommandEntities.TABLE; - } - - /* Or as the bare first argument of two arguments. */ + /* As the bare first argument. */ String[] args = line.getArgs(); - if (args.length == 2) { + if (args.length > 0) { String entity = args[0]; if (CommandEntities.isValidEntity(entity)) { return entity; diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 6cc56249424..d360e5d473e 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -37,16 +37,6 @@ public void setUp() { options = new GravitinoOptions().options(); } - @Test - public void entityFromCommandLineOption() throws Exception { - String[] args = {"--metalake", "metalake_demo"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - String metalakeName = fullName.getMetalakeName(); - assertEquals("metalake_demo", metalakeName); - } - @Test public void entityFromFullNameOption() throws Exception { String[] args = {"--name", "metalakeA.catalogB.schemaC.tableD"}; @@ -73,36 +63,6 @@ public void entityNotFound() throws Exception { assertNull(metalakeName); } - @Test - public void catalogFromCommandLineOption() throws Exception { - String[] args = {"--catalog", "catalogA"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - String catalogName = fullName.getCatalogName(); - assertEquals("catalogA", catalogName); - } - - @Test - public void schemaFromCommandLineOption() throws Exception { - String[] args = {"--schema", "schemaA"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - String schemaName = fullName.getSchemaName(); - assertEquals("schemaA", schemaName); - } - - @Test - public void tableFromCommandLineOption() throws Exception { - String[] args = {"--table", "tableA"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - String tableName = fullName.getTableName(); - assertEquals("tableA", tableName); - } - @Test public void malformedName() throws Exception { String[] args = {"--name", "metalake.catalog"}; @@ -118,7 +78,7 @@ public void missingName() throws Exception { CommandLine commandLine = new DefaultParser().parse(options, args); FullName fullName = new FullName(commandLine); - String namePart = fullName.getNamePart(GravitinoOptions.TABLE, 3); + String namePart = fullName.getNamePart(3); assertNull(namePart); } } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index 425dd3f8b9d..304d50b3bc0 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -54,24 +54,11 @@ public void restoreStreams() { System.setErr(originalErr); } - @Test - public void withCommandParameters() throws ParseException { - Options options = new GravitinoOptions().options(); - CommandLineParser parser = new DefaultParser(); - String[] args = {"--entity", "metalake", "--command", "list"}; - CommandLine line = parser.parse(options, args); - - String command = Main.resolveCommand(line); - assertEquals(CommandActions.LIST, command); - String entity = Main.resolveEntity(line); - assertEquals(CommandEntities.METALAKE, entity); - } - @Test public void withTwoArgsOnly() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {"metalake", "details"}; + String[] args = {"metalake", "--details"}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); From 055678bafd33a140423a50a18ece6b312e2d817a Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 17 Oct 2024 09:45:13 -0700 Subject: [PATCH 36/83] fix merge issue and tests --- .../java/org/apache/gravitino/cli/Main.java | 5 +- .../apache/gravitino/cli/TestFulllName.java | 41 -------------- .../org/apache/gravitino/cli/TestMain.java | 53 ++----------------- 3 files changed, 7 insertions(+), 92 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 232919f7640..2a437684839 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -40,7 +40,7 @@ public static void main(String[] args) { return; } String command = resolveCommand(line); - String entity = resolveEntity(line, command != null); + String entity = resolveEntity(line); GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); commandLine.handleCommandLine(); } catch (ParseException exp) { @@ -76,13 +76,12 @@ protected static String resolveCommand(CommandLine line) { * Determines the entity to act upon based on the command line input. * * @param line Parsed command line object. - * @param command true if command is an argument * @return The entity, e.g. metakalake, catalog, schema, table, etc. */ protected static String resolveEntity(CommandLine line) { /* As the bare first argument. */ String[] args = line.getArgs(); - + if (args.length > 0) { String entity = args[0]; if (CommandEntities.isValidEntity(entity)) { diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index d873d2a2d58..c1bf5262b89 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -66,48 +66,7 @@ public void entityNotFound() throws Exception { } @Test -<<<<<<< HEAD - public void justName() throws Exception, MissingArgumentException { - String[] args = {"--name"}; - - assertThrows(MissingArgumentException.class, () -> new DefaultParser().parse(options, args)); - } - - @Test - public void catalogFromCommandLineOption() throws Exception { - String[] args = {"--catalog", "catalogA"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - String catalogName = fullName.getCatalogName(); - assertEquals("catalogA", catalogName); - } - - @Test - public void schemaFromCommandLineOption() throws Exception { - String[] args = {"--schema", "schemaA"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - String schemaName = fullName.getSchemaName(); - assertEquals("schemaA", schemaName); - } - - @Test - public void tableFromCommandLineOption() throws Exception { - String[] args = {"--table", "tableA"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - - String tableName = fullName.getTableName(); - assertEquals("tableA", tableName); - } - - @Test - public void malformedMissingEntityName() throws Exception { -======= public void malformedName() throws Exception { ->>>>>>> CLI String[] args = {"--name", "metalake.catalog"}; CommandLine commandLine = new DefaultParser().parse(options, args); FullName fullName = new FullName(commandLine); diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index 8c30b9ac6e6..3187c611706 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -62,7 +62,7 @@ public void withTwoArgsOnly() throws ParseException { String command = Main.resolveCommand(line); assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line, true); + String entity = Main.resolveEntity(line); assertEquals(CommandEntities.METALAKE, entity); } @@ -70,12 +70,12 @@ public void withTwoArgsOnly() throws ParseException { public void defaultToDetails() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {"--metalake", "metalake_demo"}; + String[] args = {"metalake", "--name", "metalake_demo"}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line, false); + String entity = Main.resolveEntity(line); assertEquals(CommandEntities.METALAKE, entity); } @@ -104,59 +104,16 @@ public void parseError() throws UnsupportedEncodingException { assertTrue(outContent.toString().contains("usage:")); // Expect help output } - @Test - public void catalogWithTwoArgs() throws ParseException { - Options options = new GravitinoOptions().options(); - CommandLineParser parser = new DefaultParser(); - String[] args = {"catalog", "details", "--name", "metalake_demo.catalog_postgres"}; - CommandLine line = parser.parse(options, args); - - String command = Main.resolveCommand(line); - assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line, true); - assertEquals(CommandEntities.CATALOG, entity); - } - @Test public void catalogWithOneArg() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {"catalog", "--command", "details", "--name", "metalake_demo.catalog_postgres"}; - CommandLine line = parser.parse(options, args); - - String command = Main.resolveCommand(line); - assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line, true); - assertEquals(CommandEntities.CATALOG, entity); - } - - @Test - public void catalogWithEntity() throws ParseException { - Options options = new GravitinoOptions().options(); - CommandLineParser parser = new DefaultParser(); - String[] args = { - "--entity", "catalog", "--command", "details", "--name", "metalake_demo.catalog_postgres" - }; - CommandLine line = parser.parse(options, args); - - String command = Main.resolveCommand(line); - assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line, false); - assertEquals(CommandEntities.CATALOG, entity); - } - - @Test - public void catalogWithNoName() throws ParseException { - Options options = new GravitinoOptions().options(); - CommandLineParser parser = new DefaultParser(); - String[] args = { - "catalog", "details", "--metalake", "metalake_demo", "--catalog", "catalog_postgres" - }; + String[] args = {"catalog", "--details", "--name", "metalake_demo.catalog_postgres"}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); assertEquals(CommandActions.DETAILS, command); - String entity = Main.resolveEntity(line, true); + String entity = Main.resolveEntity(line); assertEquals(CommandEntities.CATALOG, entity); } } From 9808022e03b48c2d351d01a76d91a49d042c0b07 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 17 Oct 2024 09:48:31 -0700 Subject: [PATCH 37/83] update command options --- clients/cli/docs/README.md | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/clients/cli/docs/README.md b/clients/cli/docs/README.md index da684bd5d36..b974051f79e 100644 --- a/clients/cli/docs/README.md +++ b/clients/cli/docs/README.md @@ -76,22 +76,16 @@ To run the Gravitino CLI, use the following command structure: ```bash usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] Options - -c,--catalog catalog name - -C,--create create an entity - -D,--details list details about an entity - -e,--entity entity type - -f,--name full entity name (dot separated) - -h,--help command help information - -L,--list list entity children - -m,--metalake metalake name - -R,--delete delete an entity - -s,--schema schema name - -t,--table table name - -u,--url Gravitino URL (default: http://localhost:8090) - -U,--update update an entity - -v,--version Gravitino client version - -r,--server Gravitino server version - -x,--command one of: list, details, create, delete, or update + -C,--create create an entity + -D,--details list details about an entity + -f,--name full entity name (dot separated) + -h,--help command help information + -L,--list list entity children + -r,--server Gravitino server version + -R,--delete delete an entity + -u,--url Gravitino URL (default: http://localhost:8090) + -U,--update update an entity + -v,--version Gravitino client version ``` ## Commands From 464a74b26d165520408b6cfff3565767718ef7b3 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 17 Oct 2024 09:51:08 -0700 Subject: [PATCH 38/83] fix imports --- .../src/test/java/org/apache/gravitino/cli/TestFulllName.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index c1bf5262b89..541c1e45f51 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -19,11 +19,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertThrows; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; -import org.apache.commons.cli.MissingArgumentException; import org.apache.commons.cli.Options; import org.apache.gravitino.cli.FullName; import org.apache.gravitino.cli.GravitinoOptions; From 05bc9ed4299dd5dc2391fe78db47646f8f9107e6 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 17 Oct 2024 09:52:11 -0700 Subject: [PATCH 39/83] update command options --- clients/cli/docs/README.md | 36 ++++++++++++++++++++---------------- 1 file changed, 20 insertions(+), 16 deletions(-) diff --git a/clients/cli/docs/README.md b/clients/cli/docs/README.md index fc61816fb68..f778615555c 100644 --- a/clients/cli/docs/README.md +++ b/clients/cli/docs/README.md @@ -76,22 +76,26 @@ To run the Gravitino CLI, use the following command structure: ```bash usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] Options - -c,--catalog catalog name - -C,--create create an entity - -D,--details list details about an entity - -e,--entity entity type - -f,--name full entity name (dot separated) - -h,--help command help information - -L,--list list entity children - -m,--metalake metalake name - -R,--delete delete an entity - -s,--schema schema name - -t,--table table name - -u,--url Gravitino URL (default: http://localhost:8090) - -U,--update update an entity - -v,--version Gravitino client version - -r,--server Gravitino server version - -x,--command one of: list, details, create, delete, or update + -b,--bootstrap Kafka bootstrap servers + -C,--create create an entity + -c,--comment entity comment + -D,--details list details about an entity + -d,--database database name + -h,--help command help information + -j,--jdbcurl JDBC URL + -L,--list list entity children + -l,--user database username + -m,--metastore Hive metastore URI + -n,--name full entity name (dot separated) + -P,--properties show an entities properties + -p,--provider provider one of hadoop, hive, mysql, postgres, iceberg, kafka + -r,--rename new entity name + -R,--delete delete an entity + -u,--url Gravitino URL (default: http://localhost:8090) + -U,--update update an entity + -v,--value property value + -w,--warehouse warehouse name + -z,--password database password ``` ## Commands From 954b351d2ec913f704c6c320a3874a629735b07b Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 22 Oct 2024 16:43:01 +1100 Subject: [PATCH 40/83] Make executable and runnable from bin directory. update command format. --- clients/cli/bin/errors.sh | 17 ++++---- clients/cli/bin/examples.sh | 87 +++++++++++++++++++------------------ 2 files changed, 54 insertions(+), 50 deletions(-) mode change 100644 => 100755 clients/cli/bin/errors.sh diff --git a/clients/cli/bin/errors.sh b/clients/cli/bin/errors.sh old mode 100644 new mode 100755 index 38eb99e1f74..ce3a18da848 --- a/clients/cli/bin/errors.sh +++ b/clients/cli/bin/errors.sh @@ -21,28 +21,29 @@ # Some of these examples assume you have the Apache Gravitino playground running. -alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' +shopt -s expand_aliases +alias gcli='java -jar ../../cli/build/libs/gravitino-cli-*-incubating-SNAPSHOT.jar' # No such command gcli unknown # unknown command and entiry -gcli unknown --unknown +gcli unknown unknown # unknown command -gcli metalake --unknown +gcli metalake unknown # unknown entity -gcli unknown --list +gcli unknown list # Name not specified -gcli metalake --details +gcli metalake details # Unknown metalake name -gcli metalake --details --name unknown +gcli metalake details --name unknown # Unknown catalog name -gcli catalog --details --name metalake_demo.unknown +gcli catalog details --name metalake_demo.unknown # Missing catalog name -gcli catalog --details --name metalake_demo +gcli catalog details --name metalake_demo diff --git a/clients/cli/bin/examples.sh b/clients/cli/bin/examples.sh index bb8994e03eb..00462cca380 100755 --- a/clients/cli/bin/examples.sh +++ b/clients/cli/bin/examples.sh @@ -1,3 +1,5 @@ +#!/bin/bash + # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -17,12 +19,11 @@ # under the License. # -#!/bin/bash - # These examples assume you have the Apache Gravitino playground running. unset GRAVITINO_METALAKE -alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' +shopt -s expand_aliases +alias gcli='java -jar ../../cli/build/libs/gravitino-cli-*-incubating-SNAPSHOT.jar' # display help gcli --help @@ -31,73 +32,75 @@ gcli --help gcli --version # metalake details -gcli --details +gcli details # metalake list -gcli --list +gcli list # list all catalogs in a metalake -gcli metalake --list --name metalake_demo +gcli metalake list --metalake metalake_demo # list catalog schema -gcli catalog --list --name metalake_demo.catalog_iceberg -gcli catalog --list --name metalake_demo.catalog_mysql -gcli catalog --list --name metalake_demo.catalog_postgres -gcli catalog --list --name metalake_demo.catalog_hive +gcli catalog list --metalake metalake_demo --name catalog_iceberg +gcli catalog list --metalake metalake_demo --name catalog_mysql +gcli catalog list --metalake metalake_demo --name catalog_postgres +gcli catalog list --metalake metalake_demo --name catalog_hive # list catalog details -gcli catalog --details --name metalake_demo.catalog_iceberg -gcli catalog --details --name metalake_demo.catalog_mysql -gcli catalog --details --name metalake_demo.catalog_postgres -gcli catalog --details --name metalake_demo.catalog_hive +gcli catalog details --metalake metalake_demo --name catalog_iceberg +gcli catalog details --metalake metalake_demo --name catalog_mysql +gcli catalog details --metalake metalake_demo --name catalog_postgres +gcli catalog details --metalake metalake_demo --name catalog_hive # list schema tables -gcli schema --list --name metalake_demo.catalog_postgres.hr -gcli schema --list --name metalake_demo.catalog_mysql.db -gcli schema --list --name metalake_demo.catalog_hive.sales +gcli schema list --metalake metalake_demo --name catalog_postgres.hr +gcli schema list --metalake metalake_demo --name catalog_mysql.db +gcli schema list --metalake metalake_demo --name catalog_hive.sales # list schema details -gcli schema --details --name metalake_demo.catalog_postgres.hr -gcli schema --details --name metalake_demo.catalog_mysql.db -gcli schema --details --name metalake_demo.catalog_hive.sales +gcli schema details --metalake metalake_demo --name catalog_postgres.hr +gcli schema details --metalake metalake_demo --name catalog_mysql.db +gcli schema details --metalake metalake_demo --name catalog_hive.sales # list table details -gcli table --list --name metalake_demo.catalog_postgres.hr.departments -gcli table --list --name metalake_demo.catalog_mysql.db.iceberg_tables -gcli table --list --name metalake_demo.catalog_hive.sales.products +gcli table list --metalake metalake_demo --name catalog_postgres.hr.departments +gcli table list --metalake metalake_demo --name catalog_mysql.db.iceberg_tables +gcli table list --metalake metalake_demo --name catalog_hive.sales.products # Exmaples where metalake is set in an evironment variable export GRAVITINO_METALAKE=metalake_demo # metalake details -gcli metalake --details +gcli metalake details # list all catalogs in a metalake -gcli metalake --list +gcli metalake list # list catalog schema -gcli catalog --list --name catalog_iceberg -gcli catalog --list --name catalog_mysql -gcli catalog --list --name catalog_postgres -gcli catalog --list --name catalog_hive +gcli catalog list --name catalog_iceberg +gcli catalog list --name catalog_mysql +gcli catalog list --name catalog_postgres +gcli catalog list --name catalog_hive # list catalog details -gcli catalog --details --name catalog_iceberg -gcli catalog --details --name catalog_mysql -gcli catalog --details --name catalog_postgres -gcli catalog --details --name catalog_hive +gcli catalog details --name catalog_iceberg +gcli catalog details --name catalog_mysql +gcli catalog details --name catalog_postgres +gcli catalog details --name catalog_hive # list schema tables -gcli schema --list --name catalog_postgres.hr -gcli schema --list --name catalog_mysql.db -gcli schema --list --name catalog_hive.sales +gcli schema list --name catalog_postgres.hr +gcli schema list --name catalog_mysql.db +gcli schema list --name catalog_hive.sales # list schema details -gcli schema --details --name catalog_postgres.hr -gcli schema --details --name catalog_mysql.db -gcli schema --details --name catalog_hive.sales +gcli schema details --name catalog_postgres.hr +gcli schema details --name catalog_mysql.db +gcli schema details --name catalog_hive.sales # list table details -gcli table --list --name catalog_postgres.hr.departments -gcli table --list --name catalog_mysql.db.iceberg_tables -gcli table --list --name catalog_hive.sales.products +gcli table list --name catalog_postgres.hr.departments +gcli table list --name catalog_mysql.db.iceberg_tables +gcli table list --name catalog_hive.sales.products + +unset GRAVITINO_METALAKE From 808fffc8d8fc656605705b3bb60c591793b99de2 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 22 Oct 2024 16:43:42 +1100 Subject: [PATCH 41/83] revert back to using two args and fix command format --- clients/cli/docs/README.md | 20 ++++++++------------ 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/clients/cli/docs/README.md b/clients/cli/docs/README.md index b974051f79e..fc9801bf5a9 100644 --- a/clients/cli/docs/README.md +++ b/clients/cli/docs/README.md @@ -76,44 +76,40 @@ To run the Gravitino CLI, use the following command structure: ```bash usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] Options - -C,--create create an entity - -D,--details list details about an entity -f,--name full entity name (dot separated) -h,--help command help information -L,--list list entity children -r,--server Gravitino server version - -R,--delete delete an entity -u,--url Gravitino URL (default: http://localhost:8090) - -U,--update update an entity -v,--version Gravitino client version ``` ## Commands The following commands are available for entity management: ---list: List available entities ---details: Show detailed information about an entity ---create: Create a new entity ---delete: Delete an existing entity ---update: Update an existing entity +- list: List available entities +- details: Show detailed information about an entity +- create: Create a new entity +- delete: Delete an existing entity +- update: Update an existing entity ### Examples List All Metalakes ```bash -gcli --list +gcli list ``` Get Details of a Specific Metalake ```bash -gcli metalake --details -name my-metalake +gcli metalake details --metalake my-metalake ``` List Tables in a Catalog ```bash -gcli metalake --list -name my-metalake +gcli metalake list --metalake my-metalake ``` ## Running Tests From 848a38187f882362f734dc1780be8caef585cb47 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 22 Oct 2024 16:44:55 +1100 Subject: [PATCH 42/83] remove meatlake form name and add back metalake option --- .../org/apache/gravitino/cli/FullName.java | 26 ++++++++----------- .../gravitino/cli/GravitinoOptions.java | 14 ++-------- .../java/org/apache/gravitino/cli/Main.java | 22 +++++++--------- .../apache/gravitino/cli/TestFulllName.java | 2 +- .../org/apache/gravitino/cli/TestMain.java | 2 +- 5 files changed, 25 insertions(+), 41 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index dcae8c1619a..5d8d9c1c258 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -39,12 +39,17 @@ public FullName(CommandLine line) { } /** - * Retrieves the metalake name from the command line options, environment variables, or the first - * part of the full name. + * Retrieves the metalake name from the command line options, the GRAVITINO_METALAKE environment + * variable. * * @return The metalake name, or null if not found. */ public String getMetalakeName() { + // If specified on the command line use that + if (line.hasOption(GravitinoOptions.METALAKE)) { + return line.getOptionValue(GravitinoOptions.METALAKE); + } + // Cache the metalake environment variable if (metalakeEnv == null) { metalakeEnv = System.getenv("GRAVITINO_METALAKE"); @@ -53,9 +58,6 @@ public String getMetalakeName() { // Check if the metalake name is set as an environment variable if (metalakeEnv != null) { return metalakeEnv; - // Extract the metalake name from the full name option - } else if (line.hasOption(GravitinoOptions.NAME)) { - return line.getOptionValue(GravitinoOptions.NAME).split("\\.")[0]; } return null; @@ -67,7 +69,7 @@ public String getMetalakeName() { * @return The catalog name, or null if not found. */ public String getCatalogName() { - return getNamePart(1); + return getNamePart(0); } /** @@ -76,7 +78,7 @@ public String getCatalogName() { * @return The schema name, or null if not found. */ public String getSchemaName() { - return getNamePart(2); + return getNamePart(1); } /** @@ -85,7 +87,7 @@ public String getSchemaName() { * @return The table name, or null if not found. */ public String getTableName() { - return getNamePart(3); + return getNamePart(2); } /** @@ -100,13 +102,7 @@ public String getNamePart(int position) { if (line.hasOption(GravitinoOptions.NAME)) { String[] names = line.getOptionValue(GravitinoOptions.NAME).split("\\."); - /* Adjust position if metalake is part of the full name. */ - String metalakeEnv = System.getenv("GRAVITINO_METALAKE"); - if (metalakeEnv != null) { - position = position - 1; - } - - if (names.length < position) { + if (names.length <= position) { System.err.println(ErrorMessages.MALFORMED_NAME); return null; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index bcb2a95abc7..1d96b1d298e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -29,11 +29,7 @@ public class GravitinoOptions { public static final String SERVER = "server"; public static final String URL = "url"; public static final String NAME = "name"; - public static final String LIST = "list"; - public static final String DETAILS = "details"; - public static final String CREATE = "create"; - public static final String UPDATE = "update"; - public static final String DELETE = "delete"; + public static final String METALAKE = "metalake"; /** * Builds and returns the CLI options for Gravitino. @@ -49,13 +45,7 @@ public Options options() { options.addOption(createSimpleOption("r", SERVER, "Gravitino server version")); options.addOption(createArgOption("u", URL, "Gravitino URL (default: http://localhost:8090)")); options.addOption(createArgOption("f", NAME, "full entity name (dot separated)")); - - // specifying the command - options.addOption(createSimpleOption("L", LIST, "list entity children")); - options.addOption(createSimpleOption("D", DETAILS, "list details about an entity")); - options.addOption(createSimpleOption("C", CREATE, "create an entity")); - options.addOption(createSimpleOption("U", UPDATE, "update an entity")); - options.addOption(createSimpleOption("R", DELETE, "delete an entity")); + options.addOption(createArgOption("m", METALAKE, "Metalake")); return options; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index b36a57be147..7ed1407cec9 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -51,17 +51,15 @@ public static void main(String[] args) { * @return The command, one of 'details', 'list', 'create', 'delete' or 'update'. */ protected static String resolveCommand(CommandLine line) { - /* Passed as --list, --details --create --delete or --update. */ - if (line.hasOption(GravitinoOptions.LIST)) { - return CommandActions.LIST; - } else if (line.hasOption(GravitinoOptions.DETAILS)) { - return CommandActions.DETAILS; - } else if (line.hasOption(GravitinoOptions.CREATE)) { - return CommandActions.CREATE; - } else if (line.hasOption(GravitinoOptions.DELETE)) { - return CommandActions.DELETE; - } else if (line.hasOption(GravitinoOptions.UPDATE)) { - return CommandActions.UPDATE; + + /* As the bare second argument. */ + String[] args = line.getArgs(); + + if (args.length >= 2) { + String action = args[1]; + if (CommandActions.isValidCommand(action)) { + return action; + } } return CommandActions.DETAILS; /* Default to 'details' command. */ @@ -77,7 +75,7 @@ protected static String resolveEntity(CommandLine line) { /* As the bare first argument. */ String[] args = line.getArgs(); - if (args.length > 0) { + if (args.length >= 1) { String entity = args[0]; if (CommandEntities.isValidEntity(entity)) { return entity; diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index d360e5d473e..a537784372b 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -39,7 +39,7 @@ public void setUp() { @Test public void entityFromFullNameOption() throws Exception { - String[] args = {"--name", "metalakeA.catalogB.schemaC.tableD"}; + String[] args = {"--metalake", "metalakeA", "--name", "catalogB.schemaC.tableD"}; CommandLine commandLine = new DefaultParser().parse(options, args); FullName fullName = new FullName(commandLine); diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index 304d50b3bc0..c70800232ee 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -58,7 +58,7 @@ public void restoreStreams() { public void withTwoArgsOnly() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {"metalake", "--details"}; + String[] args = {"metalake", "details"}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); From 2fe9a8075de9e0b8688b16d1efbdf8eef7e253bd Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 22 Oct 2024 16:45:28 +1100 Subject: [PATCH 43/83] add Gravitino URL as an environment variable --- .../gravitino/cli/GravitinoCommandLine.java | 28 +++++++++++++++---- 1 file changed, 22 insertions(+), 6 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 b72db743ef7..d2fbc216a40 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 @@ -42,6 +42,7 @@ public class GravitinoCommandLine { private Options options; private String entity; private String command; + private String urlEnv; public static final String CMD = "gcli"; // recommended name public static final String DEFAULT_URL = "http://localhost:8090"; @@ -182,13 +183,28 @@ protected void handleGeneralCommand() { } /** - * Gets the Gravitino URL from the command line options, or returns the default URL. + * Retrieves the Gravitinno URL from the command line options or the GRAVITINO_URL environment + * variable. * - * @return The Gravitino URL to be used. + * @return The Gravitinno URL, or null if not found. */ - protected String getUrl() { - return line.hasOption(GravitinoOptions.URL) - ? line.getOptionValue(GravitinoOptions.URL) - : DEFAULT_URL; + public String getUrl() { + // If specified on the command line use that + if (line.hasOption(GravitinoOptions.URL)) { + return line.getOptionValue(GravitinoOptions.URL); + } + + // Cache the Gravitino URL environment variable + if (urlEnv == null) { + urlEnv = System.getenv("GRAVITINO_URL"); + } + + // If set return the Gravitino URL environment variable + if (urlEnv != null) { + return urlEnv; + } + + // Return the default localhost URL + return DEFAULT_URL; } } From 526d305affd834f4ee29500532336e29f74f6c9d Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 22 Oct 2024 16:49:32 +1100 Subject: [PATCH 44/83] update README to mention environment variables --- clients/cli/docs/README.md | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/clients/cli/docs/README.md b/clients/cli/docs/README.md index fc9801bf5a9..cde73920c2b 100644 --- a/clients/cli/docs/README.md +++ b/clients/cli/docs/README.md @@ -17,7 +17,7 @@ under the License. --> -# Apache Gravitino CLI +# Apache Gravitino Command Line Interface Apache Gravitino CLI is a command-line tool that interacts with the Gravitino server to manage and query entities like metalakes, catalogs, schemas, and tables. The tool provides options for listing information about Gravitino entities and in future versions support creating, deleting, and updating these entities. @@ -112,6 +112,24 @@ List Tables in a Catalog gcli metalake list --metalake my-metalake ``` +### Setting the Metalake name + +As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways. + +1. Passed in on the command line via the `--metalake` parameter. +2. Set via the 'GRAVITINO_METALAKE' environment variable. + +The command line option overrides the environment variable. + +### Setting the Gravitino URL + +As you need to set the Gravitino URL for every command, you can set the URL in several ways. + +1. Passed in on the command line via the `--url` parameter. +2. Set via the 'GRAVITINO_URL' environment variable. + +The command line option overrides the environment variable. + ## Running Tests This project includes a suite of unit tests to verify its functionality. From d2ded4c98c2d3d238f014952fdc8aeee5078478f Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 22 Oct 2024 17:58:11 +1100 Subject: [PATCH 45/83] improved description of met lake name and add to options docs --- clients/cli/docs/README.md | 12 ++++++------ .../org/apache/gravitino/cli/GravitinoOptions.java | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/clients/cli/docs/README.md b/clients/cli/docs/README.md index cde73920c2b..8d382a9cbe4 100644 --- a/clients/cli/docs/README.md +++ b/clients/cli/docs/README.md @@ -76,12 +76,12 @@ To run the Gravitino CLI, use the following command structure: ```bash usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] Options - -f,--name full entity name (dot separated) - -h,--help command help information - -L,--list list entity children - -r,--server Gravitino server version - -u,--url Gravitino URL (default: http://localhost:8090) - -v,--version Gravitino client version + -f,--name full entity name (dot separated) + -h,--help command help information + -m,--metalake Metalake name + -r,--server Gravitino server version + -u,--url Gravitino URL (default: http://localhost:8090) + -v,--version Gravitino client version ``` ## Commands diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index 1d96b1d298e..cb3398e4015 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -45,7 +45,7 @@ public Options options() { options.addOption(createSimpleOption("r", SERVER, "Gravitino server version")); options.addOption(createArgOption("u", URL, "Gravitino URL (default: http://localhost:8090)")); options.addOption(createArgOption("f", NAME, "full entity name (dot separated)")); - options.addOption(createArgOption("m", METALAKE, "Metalake")); + options.addOption(createArgOption("m", METALAKE, "Metalake name")); return options; } From cb5a5d7934b91fe30ba7aa17248e35c4c2294b77 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Tue, 22 Oct 2024 18:12:29 +1100 Subject: [PATCH 46/83] remove version number from alias --- clients/cli/docs/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/clients/cli/docs/README.md b/clients/cli/docs/README.md index 8d382a9cbe4..9d9437377eb 100644 --- a/clients/cli/docs/README.md +++ b/clients/cli/docs/README.md @@ -62,7 +62,7 @@ Before you can build and run this project, it is suggested you have the followin 3. Create an alias: ```bash - alias gcli='java -jar clients/cli/build/libs/gravitino-cli-0.7.0-incubating-SNAPSHOT.jar' + alias gcli='java -jar clients/cli/build/libs/gravitino-cli-*-incubating-SNAPSHOT.jar' ``` 3. Test the command: ```bash From 71107fd503da81542c4e6015531513b9329d7298 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 09:56:41 +1100 Subject: [PATCH 47/83] order in alphabetical order --- clients/cli/build.gradle.kts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts index 3b0434b64b8..0dca3989448 100644 --- a/clients/cli/build.gradle.kts +++ b/clients/cli/build.gradle.kts @@ -23,12 +23,12 @@ plugins { } dependencies { - implementation(project(":clients:client-java")) - implementation(project(":api")) - implementation(project(":common")) + implementation(libs.commons.cli.new) implementation(libs.slf4j.api) implementation(libs.slf4j.simple) - implementation(libs.commons.cli.new) + implementation(project(":api")) + implementation(project(":clients:client-java")) + implementation(project(":common")) testImplementation(libs.junit.jupiter.api) testImplementation(libs.junit.jupiter.params) From a6aeb4220f9372d2946881773523e443570ea3bc Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 10:08:53 +1100 Subject: [PATCH 48/83] add final where needed --- .../main/java/org/apache/gravitino/cli/FullName.java | 6 ++++-- .../apache/gravitino/cli/GravitinoCommandLine.java | 12 +++++++----- .../gravitino/cli/commands/CatalogDetails.java | 4 ++-- .../apache/gravitino/cli/commands/ListCatalogs.java | 2 +- .../apache/gravitino/cli/commands/ListColumns.java | 4 ++-- .../apache/gravitino/cli/commands/ListSchema.java | 4 ++-- .../apache/gravitino/cli/commands/ListTables.java | 2 +- .../gravitino/cli/commands/MetalakeDetails.java | 2 +- .../apache/gravitino/cli/commands/SchemaDetails.java | 6 +++--- .../apache/gravitino/cli/commands/TableCommand.java | 4 ++-- .../apache/gravitino/cli/commands/TableDetails.java | 4 ++-- 11 files changed, 27 insertions(+), 23 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index 5d8d9c1c258..32df42f48c9 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -26,8 +26,9 @@ * metalake, catalog, schema, and table names. */ public class FullName { - private CommandLine line; + private final CommandLine line; private String metalakeEnv; + private boolean matalakeSet = false; /** * Constructor for the {@code FullName} class. @@ -51,8 +52,9 @@ public String getMetalakeName() { } // Cache the metalake environment variable - if (metalakeEnv == null) { + if (metalakeEnv == null && !matalakeSet) { metalakeEnv = System.getenv("GRAVITINO_METALAKE"); + matalakeSet = true; } // Check if the metalake name is set as an environment variable 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 d2fbc216a40..7229ebfd81a 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 @@ -38,11 +38,12 @@ /* Gravitino Command line */ public class GravitinoCommandLine { - private CommandLine line; - private Options options; - private String entity; - private String command; + private final CommandLine line; + private final Options options; + private final String entity; + private final String command; private String urlEnv; + private boolean urlSet = false; public static final String CMD = "gcli"; // recommended name public static final String DEFAULT_URL = "http://localhost:8090"; @@ -195,8 +196,9 @@ public String getUrl() { } // Cache the Gravitino URL environment variable - if (urlEnv == null) { + if (urlEnv == null && !urlSet) { urlEnv = System.getenv("GRAVITINO_URL"); + urlSet = true; } // If set return the Gravitino URL environment variable diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java index 408d3d81fe6..194f33250dc 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java @@ -27,8 +27,8 @@ public class CatalogDetails extends Command { - protected String metalake; - protected String catalog; + protected final String metalake; + protected final String catalog; /** * Displays the name and comment of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java index e00c79520b4..1e36879646b 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java @@ -26,7 +26,7 @@ /* Lists all catalogs in a metalake. */ public class ListCatalogs extends Command { - protected String metalake; + protected final String metalake; /** * Lists all catalogs in a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java index 3e7cbcf674f..ef1816937b3 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java @@ -25,8 +25,8 @@ /** Displays the details of a table's columns. */ public class ListColumns extends TableCommand { - protected String schema; - protected String table; + protected final String schema; + protected final String table; /** * Displays the details of a table's columns. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java index 00845836d5f..f1b32c75fba 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java @@ -27,8 +27,8 @@ /** List all schema names in a schema. */ public class ListSchema extends Command { - protected String metalake; - protected String catalog; + protected final String metalake; + protected final String catalog; /** * Lists all schemas in a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java index 22c1e1329d7..834919ddebd 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java @@ -25,7 +25,7 @@ /** List the names of all tables in a schema. */ public class ListTables extends TableCommand { - protected String schema; + protected final String schema; /** * List the names of all tables in a schema. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java index 575a11d8089..caaef188dec 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java @@ -25,7 +25,7 @@ /** Displays the details of a metalake. */ public class MetalakeDetails extends Command { - protected String metalake; + protected final String metalake; /** * Displays metalake details. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java index 255d540c3df..e2b9147b808 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java @@ -29,9 +29,9 @@ /** Displays the details of schema. */ public class SchemaDetails extends Command { - protected String metalake; - protected String catalog; - protected String schema; + protected final String metalake; + protected final String catalog; + protected final String schema; /** * Displays the details of a schema. 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 f4059ba508e..0c09086eaa4 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 @@ -30,8 +30,8 @@ /* Common code for all table commands. */ public class TableCommand extends Command { - protected String metalake; - protected String catalog; + protected final String metalake; + protected final String catalog; /** * Common code for all table commands. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java index 67679b7a0a5..43625fd77b3 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java @@ -25,8 +25,8 @@ /** Displays the details of a table. */ public class TableDetails extends TableCommand { - protected String schema; - protected String table; + protected final String schema; + protected final String table; /** * Displays the details of a table. From ce3ddc16ac505b12fc1f422f37595ef683926033 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 10:44:30 +1100 Subject: [PATCH 49/83] made private --- .../org/apache/gravitino/cli/GravitinoCommandLine.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 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 7229ebfd81a..263adfdd443 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 @@ -109,7 +109,7 @@ private void executeCommand() { /** * Handles the command execution for Metalakes based on command type and the command line options. */ - protected void handleMetalakeCommand() { + private void handleMetalakeCommand() { String url = getUrl(); FullName name = new FullName(line); String metalake = name.getMetalakeName(); @@ -124,7 +124,7 @@ protected void handleMetalakeCommand() { /** * Handles the command execution for Catalogs based on command type and the command line options. */ - protected void handleCatalogCommand() { + private void handleCatalogCommand() { String url = getUrl(); FullName name = new FullName(line); String metalake = name.getMetalakeName(); @@ -140,7 +140,7 @@ protected void handleCatalogCommand() { /** * Handles the command execution for Schemas based on command type and the command line options. */ - protected void handleSchemaCommand() { + private void handleSchemaCommand() { String url = getUrl(); FullName name = new FullName(line); String metalake = name.getMetalakeName(); @@ -157,7 +157,7 @@ protected void handleSchemaCommand() { /** * Handles the command execution for Tables based on command type and the command line options. */ - protected void handleTableCommand() { + private void handleTableCommand() { String url = getUrl(); FullName name = new FullName(line); String metalake = name.getMetalakeName(); @@ -173,7 +173,7 @@ protected void handleTableCommand() { } /** Handles the command execution based on command type and the command line options. */ - protected void handleGeneralCommand() { + private void handleGeneralCommand() { String url = getUrl(); if (CommandActions.DETAILS.equals(command)) { From 70aaaf99fc955b4a849c34dcfcb5fa433110ca4e Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 10:52:49 +1100 Subject: [PATCH 50/83] use Joiner instead of StringBuilder --- clients/cli/build.gradle.kts | 1 + .../gravitino/cli/commands/AllMetalakeDetails.java | 12 +++++++----- .../apache/gravitino/cli/commands/ListCatalogs.java | 9 ++------- .../apache/gravitino/cli/commands/ListMetalakes.java | 12 +++++++----- .../apache/gravitino/cli/commands/ListSchema.java | 9 ++------- .../apache/gravitino/cli/commands/ListTables.java | 12 +++++++----- 6 files changed, 26 insertions(+), 29 deletions(-) diff --git a/clients/cli/build.gradle.kts b/clients/cli/build.gradle.kts index 0dca3989448..9ce570ef88a 100644 --- a/clients/cli/build.gradle.kts +++ b/clients/cli/build.gradle.kts @@ -24,6 +24,7 @@ plugins { dependencies { implementation(libs.commons.cli.new) + implementation(libs.guava) implementation(libs.slf4j.api) implementation(libs.slf4j.simple) implementation(project(":api")) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java index 6884caf41d4..69b5b4f4f54 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java @@ -19,6 +19,9 @@ package org.apache.gravitino.cli.commands; +import com.google.common.base.Joiner; +import java.util.ArrayList; +import java.util.List; import org.apache.gravitino.Metalake; import org.apache.gravitino.client.GravitinoAdminClient; @@ -44,14 +47,13 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); + List metalakeDetails = new ArrayList<>(); for (int i = 0; i < metalakes.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(metalakes[i].name() + "," + metalakes[i].comment() + System.lineSeparator()); + metalakeDetails.add(metalakes[i].name() + "," + metalakes[i].comment()); } + String all = Joiner.on(System.lineSeparator()).join(metalakeDetails); + System.out.print(all.toString()); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java index 1e36879646b..87417f71cdb 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java @@ -19,6 +19,7 @@ package org.apache.gravitino.cli.commands; +import com.google.common.base.Joiner; import org.apache.gravitino.cli.ErrorMessages; import org.apache.gravitino.client.GravitinoClient; import org.apache.gravitino.exceptions.NoSuchMetalakeException; @@ -53,13 +54,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < catalogs.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(catalogs[i]); - } + String all = Joiner.on(",").join(catalogs); System.out.println(all.toString()); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java index 8f7a73a89d9..a85c9ff3207 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java @@ -19,6 +19,9 @@ package org.apache.gravitino.cli.commands; +import com.google.common.base.Joiner; +import java.util.ArrayList; +import java.util.List; import org.apache.gravitino.Metalake; import org.apache.gravitino.client.GravitinoAdminClient; @@ -45,14 +48,13 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); + List metalakeNames = new ArrayList<>(); for (int i = 0; i < metalakes.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(metalakes[i].name()); + metalakeNames.add(metalakes[i].name()); } + String all = Joiner.on(System.lineSeparator()).join(metalakeNames); + System.out.println(all.toString()); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java index f1b32c75fba..efe3e3136b4 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java @@ -19,6 +19,7 @@ package org.apache.gravitino.cli.commands; +import com.google.common.base.Joiner; import org.apache.gravitino.cli.ErrorMessages; import org.apache.gravitino.client.GravitinoClient; import org.apache.gravitino.exceptions.NoSuchCatalogException; @@ -60,13 +61,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < schemas.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(schemas[i]); - } + String all = Joiner.on(",").join(schemas); System.out.println(all.toString()); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java index 834919ddebd..9d83ba2c903 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java @@ -19,6 +19,9 @@ package org.apache.gravitino.cli.commands; +import com.google.common.base.Joiner; +import java.util.ArrayList; +import java.util.List; import org.apache.gravitino.NameIdentifier; import org.apache.gravitino.Namespace; @@ -51,14 +54,13 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); + List tableNames = new ArrayList<>(); for (int i = 0; i < tables.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(tables[i].name()); + tableNames.add(tables[i].name()); } + String all = Joiner.on(System.lineSeparator()).join(tableNames); + System.out.println(all.toString()); } } From 22ca1913281df71a38d703ba677a9adbe76fb1e8 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 11:18:39 +1100 Subject: [PATCH 51/83] update commands --- clients/cli/bin/errors.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clients/cli/bin/errors.sh b/clients/cli/bin/errors.sh index ce3a18da848..03690e89738 100755 --- a/clients/cli/bin/errors.sh +++ b/clients/cli/bin/errors.sh @@ -40,10 +40,10 @@ gcli unknown list gcli metalake details # Unknown metalake name -gcli metalake details --name unknown +gcli metalake details --metalake unknown # Unknown catalog name -gcli catalog details --name metalake_demo.unknown +gcli catalog details --metalake metalake_demo --name unknown # Missing catalog name -gcli catalog details --name metalake_demo +gcli catalog details --metalake metalake_demo From ab52cf20384405a3708ab4965c629aacc2cbdeb2 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 11:18:58 +1100 Subject: [PATCH 52/83] improve command line error handling --- .../java/org/apache/gravitino/cli/Main.java | 15 +++++++++++---- .../java/org/apache/gravitino/cli/TestMain.java | 17 +++++++++++++++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 7ed1407cec9..8e806319631 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -34,10 +34,12 @@ public static void main(String[] args) { try { CommandLine line = parser.parse(options, args); - String command = resolveCommand(line); String entity = resolveEntity(line); - GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); - commandLine.handleCommandLine(); + String command = resolveCommand(line); + if (entity != null && command != null) { + GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); + commandLine.handleCommandLine(); + } } catch (ParseException exp) { System.err.println("Error parsing command line: " + exp.getMessage()); GravitinoCommandLine.displayHelp(options); @@ -62,7 +64,12 @@ protected static String resolveCommand(CommandLine line) { } } - return CommandActions.DETAILS; /* Default to 'details' command. */ + if (args.length == 1) { + return CommandActions.DETAILS; /* Default to 'details' command. */ + } + + System.err.println(ErrorMessages.UNSUPPORTED_COMMAND); + return null; } /** diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index c70800232ee..967b2b36202 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -68,15 +68,28 @@ public void withTwoArgsOnly() throws ParseException { } @Test - public void defaultToDetails() throws ParseException { + public void defaultToDetailsOneArg() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {}; + String[] args = {"metalake"}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); assertEquals(CommandActions.DETAILS, command); String entity = Main.resolveEntity(line); + assertEquals(CommandEntities.METALAKE, entity); + } + + @Test + public void withNoArgs() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertNull(command); + String entity = Main.resolveEntity(line); assertNull(entity); } From bd579441bc76bf4b9d58d83ae039e4fbf410862a Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 11:28:28 +1100 Subject: [PATCH 53/83] add executable shell script --- clients/cli/bin/gcli.sh | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100755 clients/cli/bin/gcli.sh diff --git a/clients/cli/bin/gcli.sh b/clients/cli/bin/gcli.sh new file mode 100755 index 00000000000..f0b36c10746 --- /dev/null +++ b/clients/cli/bin/gcli.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# + +java -jar ../../cli/build/libs/gravitino-cli-*-incubating-SNAPSHOT.jar "$@" \ No newline at end of file From 445cd41afc236cea1951c87eed94ec33b4deb93f Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 11:29:45 +1100 Subject: [PATCH 54/83] put back README and make it developer focused --- clients/cli/{docs => }/README.md | 71 -------------------------------- 1 file changed, 71 deletions(-) rename clients/cli/{docs => }/README.md (54%) diff --git a/clients/cli/docs/README.md b/clients/cli/README.md similarity index 54% rename from clients/cli/docs/README.md rename to clients/cli/README.md index 9d9437377eb..38f5b03dd1c 100644 --- a/clients/cli/docs/README.md +++ b/clients/cli/README.md @@ -23,21 +23,11 @@ Apache Gravitino CLI is a command-line tool that interacts with the Gravitino se ## Table of Contents -- [Features](#features) - [Installation](#installation) -- [Usage](#usage) -- [Commands](#commands) - [Running Tests](#running-tests) - [Contributing](#contributing) - [License](#license) -## Features - -- Retrieve server version -- Provide help on usage -- Manage Gravitino entities such as Metalakes, Catalogs, Schemas, and Tables -- List details about Gravitino entities - ## Installation ### Prerequisites @@ -69,67 +59,6 @@ Before you can build and run this project, it is suggested you have the followin gcli --help ``` -## Usage - -To run the Gravitino CLI, use the following command structure: - -```bash -usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] -Options - -f,--name full entity name (dot separated) - -h,--help command help information - -m,--metalake Metalake name - -r,--server Gravitino server version - -u,--url Gravitino URL (default: http://localhost:8090) - -v,--version Gravitino client version -``` - -## Commands -The following commands are available for entity management: - -- list: List available entities -- details: Show detailed information about an entity -- create: Create a new entity -- delete: Delete an existing entity -- update: Update an existing entity - -### Examples -List All Metalakes - -```bash -gcli list -``` - -Get Details of a Specific Metalake - -```bash -gcli metalake details --metalake my-metalake -``` - -List Tables in a Catalog - -```bash -gcli metalake list --metalake my-metalake -``` - -### Setting the Metalake name - -As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways. - -1. Passed in on the command line via the `--metalake` parameter. -2. Set via the 'GRAVITINO_METALAKE' environment variable. - -The command line option overrides the environment variable. - -### Setting the Gravitino URL - -As you need to set the Gravitino URL for every command, you can set the URL in several ways. - -1. Passed in on the command line via the `--url` parameter. -2. Set via the 'GRAVITINO_URL' environment variable. - -The command line option overrides the environment variable. - ## Running Tests This project includes a suite of unit tests to verify its functionality. From 7ea71254c4725ae1699bafda61c377e5fcbe858b Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 12:40:14 +1100 Subject: [PATCH 55/83] support ignore option to ignore client/server version mismatch --- .../gravitino/cli/GravitinoCommandLine.java | 29 +++++++++++-------- .../gravitino/cli/GravitinoOptions.java | 2 ++ .../cli/commands/AllMetalakeDetails.java | 5 ++-- .../cli/commands/CatalogDetails.java | 5 ++-- .../gravitino/cli/commands/ClientVersion.java | 5 ++-- .../gravitino/cli/commands/Command.java | 18 ++++++++++-- .../gravitino/cli/commands/ListCatalogs.java | 5 ++-- .../gravitino/cli/commands/ListColumns.java | 11 +++++-- .../gravitino/cli/commands/ListMetalakes.java | 5 ++-- .../gravitino/cli/commands/ListSchema.java | 5 ++-- .../gravitino/cli/commands/ListTables.java | 6 ++-- .../cli/commands/MetalakeDetails.java | 5 ++-- .../gravitino/cli/commands/SchemaDetails.java | 6 ++-- .../gravitino/cli/commands/ServerVersion.java | 5 ++-- .../gravitino/cli/commands/TableCommand.java | 5 ++-- .../gravitino/cli/commands/TableDetails.java | 11 +++++-- 16 files changed, 87 insertions(+), 41 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 263adfdd443..23fc2acb65d 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 @@ -44,6 +44,7 @@ public class GravitinoCommandLine { private final String command; private String urlEnv; private boolean urlSet = false; + private boolean ignore = false; public static final String CMD = "gcli"; // recommended name public static final String DEFAULT_URL = "http://localhost:8090"; @@ -65,15 +66,19 @@ public GravitinoCommandLine(CommandLine line, Options options, String entity, St /** Handles the parsed command line arguments and executes the corresponding actions. */ public void handleCommandLine() { + if (line.hasOption(GravitinoOptions.IGNORE)) { + ignore = true; + } + /* Display command usage. */ if (line.hasOption(GravitinoOptions.HELP)) { GravitinoCommandLine.displayHelp(options); } /* Display Gravitino version. */ else if (line.hasOption(GravitinoOptions.VERSION)) { - new ClientVersion(getUrl()).handle(); + new ClientVersion(getUrl(), ignore).handle(); } else if (line.hasOption(GravitinoOptions.SERVER)) { - new ServerVersion(getUrl()).handle(); + new ServerVersion(getUrl(), ignore).handle(); } else { executeCommand(); } @@ -115,9 +120,9 @@ private void handleMetalakeCommand() { String metalake = name.getMetalakeName(); if (CommandActions.DETAILS.equals(command)) { - new MetalakeDetails(url, metalake).handle(); + new MetalakeDetails(url, ignore, metalake).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListCatalogs(url, metalake).handle(); + new ListCatalogs(url, ignore, metalake).handle(); } } @@ -131,9 +136,9 @@ private void handleCatalogCommand() { String catalog = name.getCatalogName(); if (CommandActions.DETAILS.equals(command)) { - new CatalogDetails(url, metalake, catalog).handle(); + new CatalogDetails(url, ignore, metalake, catalog).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListSchema(url, metalake, catalog).handle(); + new ListSchema(url, ignore, metalake, catalog).handle(); } } @@ -148,9 +153,9 @@ private void handleSchemaCommand() { String schema = name.getSchemaName(); if (CommandActions.DETAILS.equals(command)) { - new SchemaDetails(url, metalake, catalog, schema).handle(); + new SchemaDetails(url, ignore, metalake, catalog, schema).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListTables(url, metalake, catalog, schema).handle(); + new ListTables(url, ignore, metalake, catalog, schema).handle(); } } @@ -166,9 +171,9 @@ private void handleTableCommand() { String table = name.getTableName(); if (CommandActions.DETAILS.equals(command)) { - new TableDetails(url, metalake, catalog, schema, table).handle(); + new TableDetails(url, ignore, metalake, catalog, schema, table).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListColumns(url, metalake, catalog, schema, table).handle(); + new ListColumns(url, ignore, metalake, catalog, schema, table).handle(); } } @@ -177,9 +182,9 @@ private void handleGeneralCommand() { String url = getUrl(); if (CommandActions.DETAILS.equals(command)) { - new AllMetalakeDetails(url).handle(); + new AllMetalakeDetails(url, ignore).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListMetalakes(url).handle(); + new ListMetalakes(url, ignore).handle(); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index cb3398e4015..9f8d1579a8a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -30,6 +30,7 @@ public class GravitinoOptions { public static final String URL = "url"; public static final String NAME = "name"; public static final String METALAKE = "metalake"; + public static final String IGNORE = "ignore"; /** * Builds and returns the CLI options for Gravitino. @@ -46,6 +47,7 @@ public Options options() { options.addOption(createArgOption("u", URL, "Gravitino URL (default: http://localhost:8090)")); options.addOption(createArgOption("f", NAME, "full entity name (dot separated)")); options.addOption(createArgOption("m", METALAKE, "Metalake name")); + options.addOption(createSimpleOption("i", IGNORE, "Ignore client/sever version check")); return options; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java index 69b5b4f4f54..91d5b1c1bc9 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/AllMetalakeDetails.java @@ -31,9 +31,10 @@ public class AllMetalakeDetails extends Command { * Parameters needed to list all metalakes. * * @param url The URL of the Gravitino server. + * @param ignoreVersions If true don't check the client/server versions match. */ - public AllMetalakeDetails(String url) { - super(url); + public AllMetalakeDetails(String url, boolean ignoreVersions) { + super(url, ignoreVersions); } /** Displays the name and comment of all metalakes. */ diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java index 194f33250dc..6df117d0c90 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CatalogDetails.java @@ -34,11 +34,12 @@ public class CatalogDetails extends Command { * Displays the name and comment 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 CatalogDetails(String url, String metalake, String catalog) { - super(url); + public CatalogDetails(String url, boolean ignoreVersions, String metalake, String catalog) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java index e8cdc55b666..6bfa41be415 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ClientVersion.java @@ -28,9 +28,10 @@ public class ClientVersion extends Command { * Displays the client version. * * @param url The URL of the Gravitino server. + * @param ignoreVersions If true don't check the client/server versions match. */ - public ClientVersion(String url) { - super(url); + public ClientVersion(String url, boolean ignoreVersions) { + super(url, ignoreVersions); } /** Displays the client version. */ diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java index 8dd84bf41b2..040bd71417d 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/Command.java @@ -26,15 +26,19 @@ /* The base for all commands. */ public abstract class Command { private final String url; + private final boolean ignoreVersions; /** * Command constructor. * * @param url The URL of the Gravitino server. + * @param ignoreVersions If true don't check the client/server versions match. */ - protected Command(String url) { + public Command(String url, boolean ignoreVersions) { this.url = url; + this.ignoreVersions = ignoreVersions; } + /** All commands have a handle method to handle and run the required command. */ public abstract void handle(); @@ -46,7 +50,11 @@ protected Command(String url) { * @throws NoSuchMetalakeException if the specified metalake does not exist. */ protected GravitinoClient buildClient(String metalake) throws NoSuchMetalakeException { - return GravitinoClient.builder(url).withMetalake(metalake).withVersionCheckDisabled().build(); + if (ignoreVersions) { + return GravitinoClient.builder(url).withMetalake(metalake).withVersionCheckDisabled().build(); + } else { + return GravitinoClient.builder(url).withMetalake(metalake).build(); + } } /** @@ -55,6 +63,10 @@ protected GravitinoClient buildClient(String metalake) throws NoSuchMetalakeExce * @return A configured {@link GravitinoAdminClient} instance. */ protected GravitinoAdminClient buildAdminClient() { - return GravitinoAdminClient.builder(url).withVersionCheckDisabled().build(); + if (ignoreVersions) { + return GravitinoAdminClient.builder(url).withVersionCheckDisabled().build(); + } else { + return GravitinoAdminClient.builder(url).build(); + } } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java index 87417f71cdb..48c27e8220c 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogs.java @@ -33,10 +33,11 @@ public class ListCatalogs extends Command { * Lists all catalogs in a metalake. * * @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 ListCatalogs(String url, String metalake) { - super(url); + public ListCatalogs(String url, boolean ignoreVersions, String metalake) { + super(url, ignoreVersions); this.metalake = metalake; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java index ef1816937b3..4b352b5576c 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListColumns.java @@ -32,13 +32,20 @@ public class ListColumns extends TableCommand { * Displays the details of a table's columns. * * @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 ListColumns(String url, String metalake, String catalog, String schema, String table) { - super(url, metalake, catalog); + public ListColumns( + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String schema, + String table) { + super(url, ignoreVersions, metalake, catalog); this.schema = schema; this.table = table; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java index a85c9ff3207..e218bea2af1 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakes.java @@ -32,9 +32,10 @@ public class ListMetalakes extends Command { * List all metalakes. * * @param url The URL of the Gravitino server. + * @param ignoreVersions If true don't check the client/server versions match. */ - public ListMetalakes(String url) { - super(url); + public ListMetalakes(String url, boolean ignoreVersions) { + super(url, ignoreVersions); } /** Lists all metalakes. */ diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java index efe3e3136b4..a4d18a924b6 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchema.java @@ -35,11 +35,12 @@ public class ListSchema extends Command { * Lists all schemas in 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 ListSchema(String url, String metalake, String catalog) { - super(url); + public ListSchema(String url, boolean ignoreVersions, String metalake, String catalog) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java index 9d83ba2c903..d1124c48b07 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTables.java @@ -34,12 +34,14 @@ public class ListTables extends TableCommand { * List the names of all tables in 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 ListTables(String url, String metalake, String catalog, String schema) { - super(url, metalake, catalog); + public ListTables( + String url, boolean ignoreVersions, String metalake, String catalog, String schema) { + super(url, ignoreVersions, metalake, catalog); this.schema = schema; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java index caaef188dec..46d61de8c42 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/MetalakeDetails.java @@ -31,10 +31,11 @@ public class MetalakeDetails extends Command { * Displays metalake details. * * @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 MetalakeDetails(String url, String metalake) { - super(url); + public MetalakeDetails(String url, boolean ignoreVersions, String metalake) { + super(url, ignoreVersions); this.metalake = metalake; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java index e2b9147b808..9229d152d3d 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SchemaDetails.java @@ -37,12 +37,14 @@ public class SchemaDetails extends Command { * Displays the details 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 SchemaDetails(String url, String metalake, String catalog, String schema) { - super(url); + public SchemaDetails( + String url, boolean ignoreVersions, String metalake, String catalog, String schema) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.schema = schema; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ServerVersion.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ServerVersion.java index f9da822d49d..456226732f9 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ServerVersion.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ServerVersion.java @@ -28,9 +28,10 @@ public class ServerVersion extends Command { * Displays the server version. * * @param url The URL of the Gravitino server. + * @param ignoreVersions If true don't check the client/server versions match. */ - public ServerVersion(String url) { - super(url); + public ServerVersion(String url, boolean ignoreVersions) { + super(url, ignoreVersions); } /** Displays the server version. */ 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 0c09086eaa4..cecff12f4e9 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 @@ -37,11 +37,12 @@ public class TableCommand extends Command { * Common code for all table commands. * * @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 TableCommand(String url, String metalake, String catalog) { - super(url); + public TableCommand(String url, boolean ignoreVersions, String metalake, String catalog) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java index 43625fd77b3..fb31585292c 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TableDetails.java @@ -32,13 +32,20 @@ public class TableDetails extends TableCommand { * Displays the details 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 TableDetails(String url, String metalake, String catalog, String schema, String table) { - super(url, metalake, catalog); + public TableDetails( + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String schema, + String table) { + super(url, ignoreVersions, metalake, catalog); this.schema = schema; this.table = table; } From 0a8844ea784f40b43881e0685258bca2cd9fa1cd Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 13:13:12 +1100 Subject: [PATCH 56/83] move list commands up one entity --- .../apache/gravitino/cli/CommandEntities.java | 2 + .../gravitino/cli/GravitinoCommandLine.java | 48 ++++++++++--------- .../gravitino/cli/TestCommandEntities.java | 2 + 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java index b177acf6c20..66e67930469 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java @@ -30,6 +30,7 @@ public class CommandEntities { public static final String CATALOG = "catalog"; public static final String SCHEMA = "schema"; public static final String TABLE = "table"; + public static final String COLUMN = "column"; private static final HashSet VALID_ENTITIES = new HashSet<>(); @@ -38,6 +39,7 @@ public class CommandEntities { VALID_ENTITIES.add(CATALOG); VALID_ENTITIES.add(SCHEMA); VALID_ENTITIES.add(TABLE); + VALID_ENTITIES.add(COLUMN); } /** 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 23fc2acb65d..dacf811b4e3 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 @@ -22,7 +22,6 @@ import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.HelpFormatter; import org.apache.commons.cli.Options; -import org.apache.gravitino.cli.commands.AllMetalakeDetails; import org.apache.gravitino.cli.commands.CatalogDetails; import org.apache.gravitino.cli.commands.ClientVersion; import org.apache.gravitino.cli.commands.ListCatalogs; @@ -96,18 +95,16 @@ public static void displayHelp(Options options) { /** Executes the appropriate command based on the command type. */ private void executeCommand() { - if (entity != null) { - if (entity.equals(CommandEntities.TABLE)) { - handleTableCommand(); - } else if (entity.equals(CommandEntities.SCHEMA)) { - handleSchemaCommand(); - } else if (entity.equals(CommandEntities.CATALOG)) { - handleCatalogCommand(); - } else if (entity.equals(CommandEntities.METALAKE)) { - handleMetalakeCommand(); - } - } else { - handleGeneralCommand(); + if (entity.equals(CommandEntities.COLUMN)) { + handleColumnCommand(); + } else if (entity.equals(CommandEntities.TABLE)) { + handleTableCommand(); + } else if (entity.equals(CommandEntities.SCHEMA)) { + handleSchemaCommand(); + } else if (entity.equals(CommandEntities.CATALOG)) { + handleCatalogCommand(); + } else if (entity.equals(CommandEntities.METALAKE)) { + handleMetalakeCommand(); } } @@ -122,7 +119,7 @@ private void handleMetalakeCommand() { if (CommandActions.DETAILS.equals(command)) { new MetalakeDetails(url, ignore, metalake).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListCatalogs(url, ignore, metalake).handle(); + new ListMetalakes(url, ignore).handle(); } } @@ -138,7 +135,7 @@ private void handleCatalogCommand() { if (CommandActions.DETAILS.equals(command)) { new CatalogDetails(url, ignore, metalake, catalog).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListSchema(url, ignore, metalake, catalog).handle(); + new ListCatalogs(url, ignore, metalake).handle(); } } @@ -155,7 +152,7 @@ private void handleSchemaCommand() { if (CommandActions.DETAILS.equals(command)) { new SchemaDetails(url, ignore, metalake, catalog, schema).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListTables(url, ignore, metalake, catalog, schema).handle(); + new ListSchema(url, ignore, metalake, catalog).handle(); } } @@ -173,18 +170,23 @@ private void handleTableCommand() { if (CommandActions.DETAILS.equals(command)) { new TableDetails(url, ignore, metalake, catalog, schema, table).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListColumns(url, ignore, metalake, catalog, schema, table).handle(); + new ListTables(url, ignore, metalake, catalog, schema).handle(); } } - /** Handles the command execution based on command type and the command line options. */ - private void handleGeneralCommand() { + /** + * Handles the command execution for Columns based on command type and the command line options. + */ + private void handleColumnCommand() { String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + String table = name.getTableName(); - if (CommandActions.DETAILS.equals(command)) { - new AllMetalakeDetails(url, ignore).handle(); - } else if (CommandActions.LIST.equals(command)) { - new ListMetalakes(url, ignore).handle(); + if (CommandActions.LIST.equals(command)) { + new ListColumns(url, ignore, metalake, catalog, schema, table).handle(); } } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java index 1ce61cd6f3f..423834bfcc0 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java @@ -37,6 +37,8 @@ public void validEntities() { CommandEntities.isValidEntity(CommandEntities.SCHEMA), "SCHEMA should be a valid entity"); assertTrue( CommandEntities.isValidEntity(CommandEntities.TABLE), "TABLE should be a valid entity"); + assertTrue( + CommandEntities.isValidEntity(CommandEntities.COLUMN), "COLUMN should be a valid entity"); } @Test From c342d7ec39894216a4cd5ac9b9afdea14b8425fc Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 13:17:49 +1100 Subject: [PATCH 57/83] add comment --- .../main/java/org/apache/gravitino/cli/GravitinoCommandLine.java | 1 + 1 file changed, 1 insertion(+) 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 dacf811b4e3..5f5be22dd0c 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 @@ -65,6 +65,7 @@ public GravitinoCommandLine(CommandLine line, Options options, String entity, St /** Handles the parsed command line arguments and executes the corresponding actions. */ public void handleCommandLine() { + /* Check if you should ignore client/version versions */ if (line.hasOption(GravitinoOptions.IGNORE)) { ignore = true; } From d2b28afbd7a8cad18860328dba8732f7472a75e2 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 13:32:39 +1100 Subject: [PATCH 58/83] no need for class --- .../java/org/apache/gravitino/cli/GravitinoCommandLine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 5f5be22dd0c..3876d14bd2b 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 @@ -72,7 +72,7 @@ public void handleCommandLine() { /* Display command usage. */ if (line.hasOption(GravitinoOptions.HELP)) { - GravitinoCommandLine.displayHelp(options); + displayHelp(options); } /* Display Gravitino version. */ else if (line.hasOption(GravitinoOptions.VERSION)) { From 038e1f66f85484623b6c0681c750259b6a3a0543 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 15:43:13 +1100 Subject: [PATCH 59/83] fix command error handling and unwanted output --- .../gravitino/cli/GravitinoCommandLine.java | 23 +++++++++++-------- .../java/org/apache/gravitino/cli/Main.java | 13 +++++++---- .../org/apache/gravitino/cli/TestMain.java | 2 +- 3 files changed, 23 insertions(+), 15 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 3876d14bd2b..e60c7662dc5 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 @@ -65,22 +65,27 @@ public GravitinoCommandLine(CommandLine line, Options options, String entity, St /** Handles the parsed command line arguments and executes the corresponding actions. */ public void handleCommandLine() { - /* Check if you should ignore client/version versions */ + /* Check if you should ignore client/version versions */ if (line.hasOption(GravitinoOptions.IGNORE)) { ignore = true; } + executeCommand(); + } + + /** Handles the parsed command line arguments and executes the corresponding actions. */ + public void handleSimpleLine() { /* Display command usage. */ if (line.hasOption(GravitinoOptions.HELP)) { displayHelp(options); } - /* Display Gravitino version. */ + /* Display Gravitino client version. */ else if (line.hasOption(GravitinoOptions.VERSION)) { new ClientVersion(getUrl(), ignore).handle(); - } else if (line.hasOption(GravitinoOptions.SERVER)) { + } + /* Display Gravitino server version. */ + else if (line.hasOption(GravitinoOptions.SERVER)) { new ServerVersion(getUrl(), ignore).handle(); - } else { - executeCommand(); } } @@ -131,9 +136,9 @@ private void handleCatalogCommand() { String url = getUrl(); FullName name = new FullName(line); String metalake = name.getMetalakeName(); - 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(); @@ -148,9 +153,9 @@ private void handleSchemaCommand() { FullName name = new FullName(line); String metalake = name.getMetalakeName(); String catalog = name.getCatalogName(); - 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(); @@ -166,9 +171,9 @@ private void handleTableCommand() { String metalake = name.getMetalakeName(); String catalog = name.getCatalogName(); String schema = name.getSchemaName(); - 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(); @@ -184,9 +189,9 @@ 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(); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 8e806319631..68db676c587 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -36,9 +36,12 @@ public static void main(String[] args) { CommandLine line = parser.parse(options, args); String entity = resolveEntity(line); String command = resolveCommand(line); + GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); + if (entity != null && command != null) { - GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); commandLine.handleCommandLine(); + } else { + commandLine.handleSimpleLine(); } } catch (ParseException exp) { System.err.println("Error parsing command line: " + exp.getMessage()); @@ -57,15 +60,15 @@ protected static String resolveCommand(CommandLine line) { /* As the bare second argument. */ String[] args = line.getArgs(); - if (args.length >= 2) { + if (args.length == 2) { String action = args[1]; if (CommandActions.isValidCommand(action)) { return action; } - } - - if (args.length == 1) { + } else if (args.length == 1) { return CommandActions.DETAILS; /* Default to 'details' command. */ + } else if (args.length == 0) { + return null; } System.err.println(ErrorMessages.UNSUPPORTED_COMMAND); diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index 967b2b36202..388d5da7396 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -102,7 +102,7 @@ public void withHelpOption() throws ParseException, UnsupportedEncodingException CommandLine line = parser.parse(options, args); GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, null, "help"); - commandLine.handleCommandLine(); + commandLine.handleSimpleLine(); assertTrue(outContent.toString().contains("usage:")); // Expected help output } From ce5fa18a8b1084f5357bd3972caeb3d8508d9664 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 16:20:03 +1100 Subject: [PATCH 60/83] remove example scripts --- clients/cli/bin/examples.sh | 66 ++++++++++++++++++------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/clients/cli/bin/examples.sh b/clients/cli/bin/examples.sh index 00462cca380..45b331c5a84 100755 --- a/clients/cli/bin/examples.sh +++ b/clients/cli/bin/examples.sh @@ -31,20 +31,14 @@ gcli --help # display version gcli --version -# metalake details -gcli details +# list all metalakes +gcli metalake list -# metalake list -gcli list +# metalake details +gcli metlake details --metalake metalake_demo -# list all catalogs in a metalake -gcli metalake list --metalake metalake_demo - -# list catalog schema -gcli catalog list --metalake metalake_demo --name catalog_iceberg -gcli catalog list --metalake metalake_demo --name catalog_mysql -gcli catalog list --metalake metalake_demo --name catalog_postgres -gcli catalog list --metalake metalake_demo --name catalog_hive +# list all catalogs +gcli catalog list --metalake metalake_demo # list catalog details gcli catalog details --metalake metalake_demo --name catalog_iceberg @@ -52,20 +46,26 @@ gcli catalog details --metalake metalake_demo --name catalog_mysql gcli catalog details --metalake metalake_demo --name catalog_postgres gcli catalog details --metalake metalake_demo --name catalog_hive -# list schema tables -gcli schema list --metalake metalake_demo --name catalog_postgres.hr -gcli schema list --metalake metalake_demo --name catalog_mysql.db -gcli schema list --metalake metalake_demo --name catalog_hive.sales +# list catalog schemas +gcli schema list --metalake metalake_demo --name catalog_iceberg +gcli schema list --metalake metalake_demo --name catalog_mysql +gcli schema list --metalake metalake_demo --name catalog_postgres +gcli schema list --metalake metalake_demo --name catalog_hive # list schema details gcli schema details --metalake metalake_demo --name catalog_postgres.hr gcli schema details --metalake metalake_demo --name catalog_mysql.db gcli schema details --metalake metalake_demo --name catalog_hive.sales +# list schema tables +gcli table list --metalake metalake_demo --name catalog_postgres.hr +gcli table list --metalake metalake_demo --name catalog_mysql.db +gcli table list --metalake metalake_demo --name catalog_hive.sales + # list table details -gcli table list --metalake metalake_demo --name catalog_postgres.hr.departments -gcli table list --metalake metalake_demo --name catalog_mysql.db.iceberg_tables -gcli table list --metalake metalake_demo --name catalog_hive.sales.products +gcli column list --metalake metalake_demo --name catalog_postgres.hr.departments +gcli column list --metalake metalake_demo --name catalog_mysql.db.iceberg_tables +gcli column list --metalake metalake_demo --name catalog_hive.sales.products # Exmaples where metalake is set in an evironment variable export GRAVITINO_METALAKE=metalake_demo @@ -73,34 +73,34 @@ export GRAVITINO_METALAKE=metalake_demo # metalake details gcli metalake details -# list all catalogs in a metalake +# list all catalogs in a metalake gcli metalake list -# list catalog schema -gcli catalog list --name catalog_iceberg -gcli catalog list --name catalog_mysql -gcli catalog list --name catalog_postgres -gcli catalog list --name catalog_hive - # list catalog details gcli catalog details --name catalog_iceberg gcli catalog details --name catalog_mysql gcli catalog details --name catalog_postgres gcli catalog details --name catalog_hive -# list schema tables -gcli schema list --name catalog_postgres.hr -gcli schema list --name catalog_mysql.db -gcli schema list --name catalog_hive.sales +# list catalog schema +gcli schema list --name catalog_iceberg +gcli schema list --name catalog_mysql +gcli schema list --name catalog_postgres +gcli schema list --name catalog_hive # list schema details gcli schema details --name catalog_postgres.hr gcli schema details --name catalog_mysql.db gcli schema details --name catalog_hive.sales +# list schema tables +gcli table list --name catalog_postgres.hr +gcli table list --name catalog_mysql.db +gcli table list --name catalog_hive.sales + # list table details -gcli table list --name catalog_postgres.hr.departments -gcli table list --name catalog_mysql.db.iceberg_tables -gcli table list --name catalog_hive.sales.products +gcli column list --name catalog_postgres.hr.departments +gcli column list --name catalog_mysql.db.iceberg_tables +gcli column list --name catalog_hive.sales.products unset GRAVITINO_METALAKE From 069f425535230ab93b0d2a8d550be1cd9b368745 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Wed, 23 Oct 2024 16:20:42 +1100 Subject: [PATCH 61/83] add CLI documentation --- docs/cli.md | 155 ++++++++++++++++++++++++++++++++++++++++++++++++++ docs/index.md | 5 +- 2 files changed, 159 insertions(+), 1 deletion(-) create mode 100644 docs/cli.md diff --git a/docs/cli.md b/docs/cli.md new file mode 100644 index 00000000000..98a311fefed --- /dev/null +++ b/docs/cli.md @@ -0,0 +1,155 @@ +--- +title: 'Apache Gravitino Command Line Interface' +slug: /cli +keyword: cli +last_update: + date: 2024-10-23 + author: justinmclean +license: 'This software is licensed under the Apache License version 2.' +--- + +This document primarily outlines how users can manage metadata within Apache Gravitino using the Command Line Interface (CLI). The CLI is accessible via a terminal window as an alternative to writing code or using the REST interface. + +Currently, you can view basic metadata information for metalakes, catalogs, schema, and tables. The ability to create, update, and delete metalakes and support additional entities in planned in the near future. + +## Running the CLI + +You can set up an alias for the command like so: + +```bash +alias gcli='java -jar ../../cli/build/libs/gravitino-cli-*-incubating-SNAPSHOT.jar' +``` + +Or use the `gcli.sh` script found in the `clients/cli/bin/` directory to run the CLI. + +## Usage + + To run the Gravitino CLI, use the following command structure: + + ```bash + usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] + Options + -f,--name full entity name (dot separated) + -h,--help command help information + -i,--ignore Ignore client/sever version check + -m,--metalake Metalake name + -r,--server Gravitino server version + -u,--url Gravitino URL (default: http://localhost:8090) + -v,--version Gravitino client version + ``` + +## Commands + +The following commands are available for entity management: + +- list: List available entities +- details: Show detailed information about an entity +- create: Create a new entity +- delete: Delete an existing entity +- update: Update an existing entity + +### Setting the Metalake name + +As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways. + +1. Passed in on the command line via the `--metalake` parameter. +2. Set via the `GRAVITINO_METALAKE` environment variable. + +The command line option overrides the environment variable. + +## Setting the Gravitino URL + +As you need to set the Gravitino URL for every command, you can set the URL in several ways. + +1. Passed in on the command line via the `--url` parameter. +2. Set via the 'GRAVITINO_URL' environment variable. + +The command line option overrides the environment variable. + +## Manage metadata + +All the commands are performed by using the [Java API](api/java-api) internally. + +### Display help + +To display help on command usage: + +```bash +gcli --help +``` + +### Display client version + +To display the client version: + +```bash +gcli --version +``` + +### Display server version + +To display the server version: + +```bash +gcli --server +``` + +### Client/server version mismatch + +If the client and server are running different versions of the Gravitino software then you need an additional `--ignore` option for the command to run. + +### Metalake + +#### Show all metalakes + +```bash +gcli metalake list +``` + +#### Show a metalake details + +```bash +gcli metalake details --metalake metalake_demo +``` + +### Catalog + +#### Show all catalogs in a metalake + +```bash +gcli catalog list --metalake metalake_demo +``` + +#### Show a catalogs details + +```bash +gcli catalog details --metalake metalake_demo --name catalog_postgres +``` + +### Schema + +#### Show all schemas in a catalog + +```bash +gcli schema list --metalake metalake_demo --name catalog_postgres +``` + +#### Show a schema details + +```bash +gcli schema details --metalake metalake_demo --name catalog_postgres.hr +``` + +### Table + +#### Show all tables + +```bash +gcli table list --metalake metalake_demo --name catalog_postgres.hr +``` + +#### Show tables details + +```bash +gcli column list --metalake metalake_demo --name catalog_postgres.hr.departments +``` diff --git a/docs/index.md b/docs/index.md index f2d7584e134..2e683453b8b 100644 --- a/docs/index.md +++ b/docs/index.md @@ -61,7 +61,10 @@ Also, you can find the complete REST API definition in [Gravitino Open API](./api/rest/gravitino-rest-api), Java SDK definition in [Gravitino Java doc](pathname:///docs/0.7.0-incubating-SNAPSHOT/api/java/index.html). -Gravitino provides a web UI to manage the metadata. Visit the web UI in the browser via `http://:8090`. See [Gravitino web UI](./webui.md) for details. +Gravitino also provides a web UI to manage the metadata. Visit the web UI in the browser via `http://:8090`. +See [Gravitino web UI](./webui.md) for details. + +Gravitino also provides a Command Line Interface (CLI) to manage the metadata. See [Gravitino CLI](./cli.md) for details. Gravitino currently supports the following catalogs: From 4d68055cfdef7bc8cd7a6fcf709e938c0c8f8356 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 10:26:50 +1100 Subject: [PATCH 62/83] update tests --- .../apache/gravitino/cli/TestFulllName.java | 15 ++++++------- .../org/apache/gravitino/cli/TestMain.java | 22 +++++++++++++++---- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 164d19c0758..201609b7592 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -19,9 +19,11 @@ import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.apache.commons.cli.CommandLine; import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.MissingArgumentException; import org.apache.commons.cli.Options; import org.apache.gravitino.cli.FullName; import org.apache.gravitino.cli.GravitinoOptions; @@ -65,7 +67,7 @@ public void entityNotFound() throws Exception { @Test public void malformedName() throws Exception { - String[] args = {"--name", "metalake.catalog"}; + String[] args = {"--name", "catalog.schema"}; CommandLine commandLine = new DefaultParser().parse(options, args); FullName fullName = new FullName(commandLine); String tableName = fullName.getTableName(); @@ -73,16 +75,13 @@ public void malformedName() throws Exception { } @Test - public void malformedMissingdName() throws Exception { - String[] args = {"catalog", "--name", "metalake"}; - CommandLine commandLine = new DefaultParser().parse(options, args); - FullName fullName = new FullName(commandLine); - String catalogName = fullName.getCatalogName(); - assertNull(catalogName); + public void missingName() throws Exception { + String[] args = {"catalog", "--name"}; + assertThrows(MissingArgumentException.class, () -> new DefaultParser().parse(options, args)); } @Test - public void missingName() throws Exception { + public void missingArgs() throws Exception { String[] args = {}; // No name provided CommandLine commandLine = new DefaultParser().parse(options, args); FullName fullName = new FullName(commandLine); diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index 551722e2797..c6d1bacdb17 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -20,6 +20,7 @@ package org.apache.gravitino.cli; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; import java.io.ByteArrayOutputStream; @@ -54,7 +55,7 @@ public void restoreStreams() { } @Test - public void withTwoArgsOnly() throws ParseException { + public void withTwoArgs() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); String[] args = {"metalake", "details"}; @@ -83,13 +84,26 @@ public void defaultToDetailsOneArg() throws ParseException { public void withNoArgs() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {"metalake", "--name", "metalake_demo"}; + String[] args = {}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); assertNull(command); String entity = Main.resolveEntity(line); - assertEquals(CommandEntities.METALAKE, entity); + assertNull(entity); + } + + @Test + public void withNoArgsAndOptions() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"--name", "metalake_demo"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertNull(command); + String entity = Main.resolveEntity(line); + assertNull(entity); } @Test @@ -121,7 +135,7 @@ public void parseError() throws UnsupportedEncodingException { public void catalogWithOneArg() throws ParseException { Options options = new GravitinoOptions().options(); CommandLineParser parser = new DefaultParser(); - String[] args = {"catalog", "--details", "--name", "metalake_demo.catalog_postgres"}; + String[] args = {"catalog", "--name", "catalog_postgres"}; CommandLine line = parser.parse(options, args); String command = Main.resolveCommand(line); From f8c1f9b6fb6daa05de2678a3aa61bf29fa7aff77 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 10:27:29 +1100 Subject: [PATCH 63/83] update commands to use ignore parameter --- .../gravitino/cli/GravitinoCommandLine.java | 79 ++++++++----------- .../gravitino/cli/commands/CreateCatalog.java | 10 ++- .../cli/commands/CreateHadoopCatalog.java | 10 ++- .../cli/commands/CreateHiveCatalog.java | 4 +- .../cli/commands/CreateIcebergCatalog.java | 4 +- .../cli/commands/CreateKafkaCatalog.java | 4 +- .../cli/commands/CreateMetalake.java | 5 +- .../cli/commands/CreateMySQLCatalog.java | 4 +- .../cli/commands/CreatePostgresCatalog.java | 4 +- .../gravitino/cli/commands/CreateSchema.java | 11 ++- .../gravitino/cli/commands/DeleteCatalog.java | 5 +- .../cli/commands/DeleteMetalake.java | 5 +- .../gravitino/cli/commands/DeleteSchema.java | 6 +- .../gravitino/cli/commands/DeleteTable.java | 11 ++- .../cli/commands/ListCatalogProperties.java | 6 +- .../cli/commands/ListMetalakeProperties.java | 5 +- .../cli/commands/ListProperties.java | 5 +- .../cli/commands/ListSchemaProperties.java | 6 +- .../cli/commands/RemoveCatalogProperty.java | 6 +- .../cli/commands/RemoveMetalakeProperty.java | 6 +- .../cli/commands/RemoveSchemaProperty.java | 10 ++- .../cli/commands/SetCatalogProperty.java | 10 ++- .../cli/commands/SetMetalakeProperty.java | 6 +- .../cli/commands/SetSchemaProperty.java | 11 ++- .../cli/commands/UpdateCatalogComment.java | 6 +- .../cli/commands/UpdateCatalogName.java | 6 +- .../cli/commands/UpdateMetalakeComment.java | 6 +- .../cli/commands/UpdateMetalakeName.java | 5 +- 28 files changed, 162 insertions(+), 94 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 7fa2eeeed9c..60c69169ce6 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 @@ -153,26 +153,26 @@ private void handleMetalakeCommand() { new ListMetalakes(url, ignore).handle(); } else if (CommandActions.CREATE.equals(command)) { String comment = line.getOptionValue(GravitinoOptions.COMMENT); - new CreateMetalake(url, metalake, comment).handle(); + new CreateMetalake(url, ignore, metalake, comment).handle(); } else if (CommandActions.DELETE.equals(command)) { - new DeleteMetalake(url, metalake).handle(); + 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, metalake, property, value).handle(); + new SetMetalakeProperty(url, ignore, metalake, property, value).handle(); } else if (CommandActions.REMOVE.equals(command)) { String property = line.getOptionValue(GravitinoOptions.PROPERTY); - new RemoveMetalakeProperty(url, metalake, property).handle(); + new RemoveMetalakeProperty(url, ignore, metalake, property).handle(); } else if (CommandActions.PROPERTIES.equals(command)) { - new ListMetalakeProperties(url, metalake).handle(); + 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, metalake, comment).handle(); + new UpdateMetalakeComment(url, ignore, metalake, comment).handle(); } if (line.hasOption(GravitinoOptions.RENAME)) { String newName = line.getOptionValue(GravitinoOptions.RENAME); - new UpdateMetalakeName(url, metalake, newName).handle(); + new UpdateMetalakeName(url, ignore, metalake, newName).handle(); } } } @@ -184,9 +184,9 @@ private void handleCatalogCommand() { String url = getUrl(); FullName name = new FullName(line); String metalake = name.getMetalakeName(); + 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(); @@ -195,17 +195,20 @@ private void handleCatalogCommand() { String comment = line.getOptionValue(GravitinoOptions.COMMENT); if (provider.equals(Providers.HIVE)) { String metastore = line.getOptionValue(GravitinoOptions.METASTORE); - new CreateHiveCatalog(url, metalake, catalog, provider, comment, metastore).handle(); + new CreateHiveCatalog(url, ignore, metalake, catalog, provider, comment, metastore) + .handle(); } else if (provider.equals(Providers.ICEBERG)) { String metastore = line.getOptionValue(GravitinoOptions.METASTORE); String warehouse = line.getOptionValue(GravitinoOptions.WAREHOUSE); - new CreateIcebergCatalog(url, metalake, catalog, provider, comment, metastore, warehouse) + new CreateIcebergCatalog( + url, ignore, metalake, catalog, provider, comment, metastore, warehouse) .handle(); } else if (provider.equals(Providers.MYSQL)) { String jdbcurl = line.getOptionValue(GravitinoOptions.JDBCURL); String user = line.getOptionValue(GravitinoOptions.USER); String password = line.getOptionValue(GravitinoOptions.PASSWORD); - new CreateMySQLCatalog(url, metalake, catalog, provider, comment, jdbcurl, user, password) + new CreateMySQLCatalog( + url, ignore, metalake, catalog, provider, comment, jdbcurl, user, password) .handle(); } else if (provider.equals(Providers.POSTGRES)) { String jdbcurl = line.getOptionValue(GravitinoOptions.JDBCURL); @@ -213,33 +216,35 @@ private void handleCatalogCommand() { String password = line.getOptionValue(GravitinoOptions.PASSWORD); String database = line.getOptionValue(GravitinoOptions.DATABASE); new CreatePostgresCatalog( - url, metalake, catalog, provider, comment, jdbcurl, user, password, database) + url, ignore, metalake, catalog, provider, comment, jdbcurl, user, password, + database) .handle(); } else if (provider.equals(Providers.HADOOP)) { - new CreateHadoopCatalog(url, metalake, catalog, provider, comment).handle(); + new CreateHadoopCatalog(url, ignore, metalake, catalog, provider, comment).handle(); } else if (provider.equals(Providers.KAFKA)) { String bootstrap = line.getOptionValue(GravitinoOptions.BOOTSTRAP); - new CreateKafkaCatalog(url, metalake, catalog, provider, comment, bootstrap).handle(); + new CreateKafkaCatalog(url, ignore, metalake, catalog, provider, comment, bootstrap) + .handle(); } } else if (CommandActions.DELETE.equals(command)) { - new DeleteCatalog(url, metalake, catalog).handle(); + 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, metalake, catalog, property, value).handle(); + new SetCatalogProperty(url, ignore, metalake, catalog, property, value).handle(); } else if (CommandActions.REMOVE.equals(command)) { String property = line.getOptionValue(GravitinoOptions.PROPERTY); - new RemoveCatalogProperty(url, metalake, catalog, property).handle(); + new RemoveCatalogProperty(url, ignore, metalake, catalog, property).handle(); } else if (CommandActions.PROPERTIES.equals(command)) { - new ListCatalogProperties(url, metalake, catalog).handle(); + 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, metalake, catalog, comment).handle(); + new UpdateCatalogComment(url, ignore, metalake, catalog, comment).handle(); } if (line.hasOption(GravitinoOptions.RENAME)) { String newName = line.getOptionValue(GravitinoOptions.RENAME); - new UpdateCatalogName(url, metalake, catalog, newName).handle(); + new UpdateCatalogName(url, ignore, metalake, catalog, newName).handle(); } } } @@ -252,26 +257,26 @@ private void handleSchemaCommand() { FullName name = new FullName(line); String metalake = name.getMetalakeName(); String catalog = name.getCatalogName(); + 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, metalake, catalog, schema, comment).handle(); + new CreateSchema(url, ignore, metalake, catalog, schema, comment).handle(); } else if (CommandActions.DELETE.equals(command)) { - new DeleteSchema(url, metalake, catalog, schema).handle(); + 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, metalake, catalog, schema, property, value).handle(); + 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, metalake, catalog, schema, property).handle(); + new RemoveSchemaProperty(url, ignore, metalake, catalog, schema, property).handle(); } else if (CommandActions.PROPERTIES.equals(command)) { - new ListSchemaProperties(url, metalake, catalog, schema).handle(); + new ListSchemaProperties(url, ignore, metalake, catalog, schema).handle(); } } @@ -284,16 +289,16 @@ private void handleTableCommand() { String metalake = name.getMetalakeName(); String catalog = name.getCatalogName(); String schema = name.getSchemaName(); + 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, metalake, catalog, schema, table).handle(); + new DeleteTable(url, ignore, metalake, catalog, schema, table).handle(); } } @@ -306,25 +311,9 @@ 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(); - } - } - - /** - * Handles the command execution for Columns based on command type and the command line options. - */ - private void handleColumnCommand() { - String url = getUrl(); - FullName name = new FullName(line); - String metalake = name.getMetalakeName(); - String catalog = name.getCatalogName(); - String schema = name.getSchemaName(); - - if (CommandActions.LIST.equals(command)) { - String table = name.getTableName(); new ListColumns(url, ignore, metalake, catalog, schema, table).handle(); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java index 815a5944c87..1e7a12e2b23 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java @@ -38,14 +38,20 @@ public class CreateCatalog extends Command { * Create a new 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. * @param provider The provider/type of catalog. * @param comment The catalog's comment. */ public CreateCatalog( - String url, String metalake, String catalog, String provider, String comment) { - super(url); + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String provider, + String comment) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.provider = provider; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java index 6a1102270fa..464cdc0887c 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHadoopCatalog.java @@ -25,13 +25,19 @@ public class CreateHadoopCatalog extends CreateCatalog { * Create a new Hadoop 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. * @param provider The provider/type of catalog. * @param comment The catalog's comment. */ public CreateHadoopCatalog( - String url, String metalake, String catalog, String provider, String comment) { - super(url, metalake, catalog, provider, comment); + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String provider, + String comment) { + super(url, ignoreVersions, metalake, catalog, provider, comment); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java index e14e8aee9a6..da75532da0b 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateHiveCatalog.java @@ -25,6 +25,7 @@ public class CreateHiveCatalog extends CreateCatalog { * Create a new Hive 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. * @param provider The provider/type of catalog. @@ -33,12 +34,13 @@ public class CreateHiveCatalog extends CreateCatalog { */ public CreateHiveCatalog( String url, + boolean ignoreVersions, String metalake, String catalog, String provider, String comment, String metastore) { - super(url, metalake, catalog, provider, comment); + super(url, ignoreVersions, metalake, catalog, provider, comment); properties.put("metastore.uris", metastore); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java index 99f1a084d3c..d608ffa3f36 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateIcebergCatalog.java @@ -25,6 +25,7 @@ public class CreateIcebergCatalog extends CreateCatalog { * Create a new Iceberg 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. * @param provider The provider/type of catalog. @@ -34,13 +35,14 @@ public class CreateIcebergCatalog extends CreateCatalog { */ public CreateIcebergCatalog( String url, + boolean ignoreVersions, String metalake, String catalog, String provider, String comment, String metastore, String warehouse) { - super(url, metalake, catalog, provider, comment); + super(url, ignoreVersions, metalake, catalog, provider, comment); properties.put("uri", metastore); properties.put("catalog-backend", "hive"); properties.put("warehouse", warehouse); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java index f0780ecc9cd..043ec3d11ac 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateKafkaCatalog.java @@ -25,6 +25,7 @@ public class CreateKafkaCatalog extends CreateCatalog { * Create a new Kafka 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. * @param provider The provider/type of catalog. @@ -33,12 +34,13 @@ public class CreateKafkaCatalog extends CreateCatalog { */ public CreateKafkaCatalog( String url, + boolean ignoreVersions, String metalake, String catalog, String provider, String comment, String bootstrap) { - super(url, metalake, catalog, provider, comment); + super(url, ignoreVersions, metalake, catalog, provider, comment); properties.put("bootstrap.servers", bootstrap); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java index f032e7d7462..908fc83caad 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java @@ -31,11 +31,12 @@ public class CreateMetalake extends Command { * Create a new metalake. * * @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 comment The metalake's comment. */ - public CreateMetalake(String url, String metalake, String comment) { - super(url); + public CreateMetalake(String url, boolean ignoreVersions, String metalake, String comment) { + super(url, ignoreVersions); this.metalake = metalake; this.comment = comment; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java index d76a5a53658..a7e7af52c26 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMySQLCatalog.java @@ -25,6 +25,7 @@ public class CreateMySQLCatalog extends CreateCatalog { * Create a new MySQL 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. * @param provider The provider/type of catalog. @@ -35,6 +36,7 @@ public class CreateMySQLCatalog extends CreateCatalog { */ public CreateMySQLCatalog( String url, + boolean ignoreVersions, String metalake, String catalog, String provider, @@ -42,7 +44,7 @@ public CreateMySQLCatalog( String jdbcurl, String user, String password) { - super(url, metalake, catalog, provider, comment); + super(url, ignoreVersions, metalake, catalog, provider, comment); properties.put("jdbc-url", jdbcurl); properties.put("jdbc-user", user); properties.put("jdbc-password", password); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java index f47dc924507..3c793463797 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreatePostgresCatalog.java @@ -25,6 +25,7 @@ public class CreatePostgresCatalog extends CreateCatalog { * Create a new Postgres 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. * @param provider The provider/type of catalog. @@ -36,6 +37,7 @@ public class CreatePostgresCatalog extends CreateCatalog { */ public CreatePostgresCatalog( String url, + boolean ignoreVersions, String metalake, String catalog, String provider, @@ -44,7 +46,7 @@ public CreatePostgresCatalog( String user, String password, String database) { - super(url, metalake, catalog, provider, comment); + super(url, ignoreVersions, metalake, catalog, provider, comment); properties.put("jdbc-url", jdbcurl); properties.put("jdbc-user", user); properties.put("jdbc-password", password); diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java index ee05d31bf57..adb39bcb470 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java @@ -35,13 +35,20 @@ public class CreateSchema extends Command { * Create a new 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 schema. * @param comment The schema's comment. */ - public CreateSchema(String url, String metalake, String catalog, String schema, String comment) { - super(url); + public CreateSchema( + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String schema, + String comment) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.schema = schema; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java index c6e83563ab0..00768a8b144 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java @@ -33,11 +33,12 @@ public class DeleteCatalog extends Command { * Delete 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 DeleteCatalog(String url, String metalake, String catalog) { - super(url); + public DeleteCatalog(String url, boolean ignoreVersions, String metalake, String catalog) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java index 1791a08d83b..0ca0092de7c 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java @@ -30,10 +30,11 @@ public class DeleteMetalake extends Command { * Delete a metalake. * * @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 DeleteMetalake(String url, String metalake) { - super(url); + public DeleteMetalake(String url, boolean ignoreVersions, String metalake) { + super(url, ignoreVersions); this.metalake = metalake; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java index 430ec8ec35f..0295266a63e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java @@ -35,12 +35,14 @@ public class DeleteSchema extends Command { * Delete 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 schema. */ - public DeleteSchema(String url, String metalake, String catalog, String schema) { - super(url); + public DeleteSchema( + String url, boolean ignoreVersions, String metalake, String catalog, String schema) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.schema = schema; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java index 78d9ea32838..69958476982 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java @@ -38,13 +38,20 @@ public class DeleteTable extends Command { * Delete 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 schema. * @param table The name of the table. */ - public DeleteTable(String url, String metalake, String catalog, String schema, String table) { - super(url); + public DeleteTable( + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String schema, + String table) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.schema = schema; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java index 0782cbfebab..9c488d4c404 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java @@ -36,11 +36,13 @@ public class ListCatalogProperties extends ListProperties { * List the properties 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 ListCatalogProperties(String url, String metalake, String catalog) { - super(url); + public ListCatalogProperties( + String url, boolean ignoreVersions, String metalake, String catalog) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java index 9d387a1734c..773289c167a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java @@ -34,10 +34,11 @@ public class ListMetalakeProperties extends ListProperties { * List the properties of a metalake. * * @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 ListMetalakeProperties(String url, String metalake) { - super(url); + public ListMetalakeProperties(String url, boolean ignoreVersions, String metalake) { + super(url, ignoreVersions); this.metalake = metalake; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java index 44a474d0cda..5ace9e602c0 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListProperties.java @@ -28,9 +28,10 @@ public class ListProperties extends Command { * List the properties of an entity. * * @param url The URL of the Gravitino server. + * @param ignoreVersions If true don't check the client/server versions match. */ - public ListProperties(String url) { - super(url); + public ListProperties(String url, boolean ignoreVersions) { + super(url, ignoreVersions); } public void handle() { diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java index d7ea8696d62..5ef5591004e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java @@ -38,12 +38,14 @@ public class ListSchemaProperties extends ListProperties { * List the properties 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. * @param schema The name of the schema. */ - public ListSchemaProperties(String url, String metalake, String catalog, String schema) { - super(url); + public ListSchemaProperties( + String url, boolean ignoreVersions, String metalake, String catalog, String schema) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.schema = schema; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java index 0d0ac66f54f..6b2d990ab59 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java @@ -36,12 +36,14 @@ public class RemoveCatalogProperty extends Command { * Remove a property 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. * @param property The name of the property. */ - public RemoveCatalogProperty(String url, String metalake, String catalog, String property) { - super(url); + public RemoveCatalogProperty( + String url, boolean ignoreVersions, String metalake, String catalog, String property) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.property = property; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java index af61c180e20..c334cb66424 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java @@ -34,11 +34,13 @@ public class RemoveMetalakeProperty extends Command { * Remove a property of a metalake. * * @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 property The name of the property. */ - public RemoveMetalakeProperty(String url, String metalake, String property) { - super(url); + public RemoveMetalakeProperty( + String url, boolean ignoreVersions, String metalake, String property) { + super(url, ignoreVersions); this.metalake = metalake; this.property = property; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java index 1533ede653a..6dca9a8c5bb 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java @@ -38,14 +38,20 @@ public class RemoveSchemaProperty extends Command { * Remove a property 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 schema. * @param property The name of the property. */ public RemoveSchemaProperty( - String url, String metalake, String catalog, String schema, String property) { - super(url); + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String schema, + String property) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.schema = schema; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java index e78d7462adb..bcd130a9c41 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java @@ -37,14 +37,20 @@ public class SetCatalogProperty extends Command { * Set a property 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. * @param property The name of the property. * @param value The value of the property. */ public SetCatalogProperty( - String url, String metalake, String catalog, String property, String value) { - super(url); + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String property, + String value) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.property = property; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java index d3b835e6238..8aff84cb228 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java @@ -35,12 +35,14 @@ public class SetMetalakeProperty extends Command { * Set a property of a metalake. * * @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 property The name of the property. * @param value The value of the property. */ - public SetMetalakeProperty(String url, String metalake, String property, String value) { - super(url); + public SetMetalakeProperty( + String url, boolean ignoreVersions, String metalake, String property, String value) { + super(url, ignoreVersions); this.metalake = metalake; this.property = property; this.value = value; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java index b22671a316d..0066464d029 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java @@ -39,6 +39,7 @@ public class SetSchemaProperty extends Command { * Set a property 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 schema. @@ -46,8 +47,14 @@ public class SetSchemaProperty extends Command { * @param value The value of the property. */ public SetSchemaProperty( - String url, String metalake, String catalog, String schema, String property, String value) { - super(url); + String url, + boolean ignoreVersions, + String metalake, + String catalog, + String schema, + String property, + String value) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.schema = schema; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java index 06fde701694..08b12abc08e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java @@ -36,12 +36,14 @@ public class UpdateCatalogComment extends Command { * Update the comment 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. * @param comment New metalake comment. */ - public UpdateCatalogComment(String url, String metalake, String catalog, String comment) { - super(url); + public UpdateCatalogComment( + String url, boolean ignoreVersions, String metalake, String catalog, String comment) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.comment = comment; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java index 34722b19b6f..b5fbc726fdb 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java @@ -35,12 +35,14 @@ public class UpdateCatalogName extends Command { * Update the name 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. * @param name The new metalake name. */ - public UpdateCatalogName(String url, String metalake, String catalog, String name) { - super(url); + public UpdateCatalogName( + String url, boolean ignoreVersions, String metalake, String catalog, String name) { + super(url, ignoreVersions); this.metalake = metalake; this.catalog = catalog; this.name = name; diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java index b9358f8e298..4bb87b913bf 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java @@ -34,11 +34,13 @@ public class UpdateMetalakeComment extends Command { * Update the comment of a metalake. * * @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 comment New metalake comment. */ - public UpdateMetalakeComment(String url, String metalake, String comment) { - super(url); + public UpdateMetalakeComment( + String url, boolean ignoreVersions, String metalake, String comment) { + super(url, ignoreVersions); this.metalake = metalake; this.comment = comment; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java index 24aab90574b..38984d5c532 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java @@ -34,11 +34,12 @@ public class UpdateMetalakeName extends Command { * Update the name of a metalake. * * @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 name The new metalake name. */ - public UpdateMetalakeName(String url, String metalake, String name) { - super(url); + public UpdateMetalakeName(String url, boolean ignoreVersions, String metalake, String name) { + super(url, ignoreVersions); this.metalake = metalake; this.name = name; } From 33efd6eea44ce49a44e33010759d5d53c8f62ee7 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 10:34:12 +1100 Subject: [PATCH 64/83] made variables final --- .../apache/gravitino/cli/commands/CreateCatalog.java | 10 +++++----- .../apache/gravitino/cli/commands/CreateMetalake.java | 4 ++-- .../apache/gravitino/cli/commands/CreateSchema.java | 8 ++++---- .../apache/gravitino/cli/commands/DeleteCatalog.java | 4 ++-- .../apache/gravitino/cli/commands/DeleteMetalake.java | 2 +- .../apache/gravitino/cli/commands/DeleteSchema.java | 6 +++--- .../org/apache/gravitino/cli/commands/DeleteTable.java | 8 ++++---- .../gravitino/cli/commands/ListCatalogProperties.java | 4 ++-- .../gravitino/cli/commands/ListMetalakeProperties.java | 2 +- .../gravitino/cli/commands/ListSchemaProperties.java | 6 +++--- .../gravitino/cli/commands/RemoveCatalogProperty.java | 6 +++--- .../gravitino/cli/commands/RemoveMetalakeProperty.java | 4 ++-- .../gravitino/cli/commands/RemoveSchemaProperty.java | 8 ++++---- .../gravitino/cli/commands/SetCatalogProperty.java | 8 ++++---- .../gravitino/cli/commands/SetMetalakeProperty.java | 6 +++--- .../gravitino/cli/commands/SetSchemaProperty.java | 10 +++++----- .../gravitino/cli/commands/UpdateCatalogComment.java | 6 +++--- .../gravitino/cli/commands/UpdateCatalogName.java | 6 +++--- .../gravitino/cli/commands/UpdateMetalakeComment.java | 4 ++-- .../gravitino/cli/commands/UpdateMetalakeName.java | 4 ++-- 20 files changed, 58 insertions(+), 58 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java index 1e7a12e2b23..972e50c1a5f 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateCatalog.java @@ -28,11 +28,11 @@ import org.apache.gravitino.exceptions.NoSuchMetalakeException; public class CreateCatalog extends Command { - protected String metalake; - protected String catalog; - protected String provider; - protected String comment; - Map properties; + protected final String metalake; + protected final String catalog; + protected final String provider; + protected final String comment; + protected final Map properties; /** * Create a new catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java index 908fc83caad..cb46c91a819 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateMetalake.java @@ -24,8 +24,8 @@ import org.apache.gravitino.exceptions.MetalakeAlreadyExistsException; public class CreateMetalake extends Command { - protected String metalake; - protected String comment; + protected final String metalake; + protected final String comment; /** * Create a new metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java index adb39bcb470..4a55e83ac0a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateSchema.java @@ -26,10 +26,10 @@ import org.apache.gravitino.exceptions.SchemaAlreadyExistsException; public class CreateSchema extends Command { - protected String metalake; - protected String catalog; - protected String schema; - protected String comment; + protected final String metalake; + protected final String catalog; + protected final String schema; + protected final String comment; /** * Create a new schema. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java index 00768a8b144..f70e916f539 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteCatalog.java @@ -26,8 +26,8 @@ public class DeleteCatalog extends Command { - protected String metalake; - protected String catalog; + protected final String metalake; + protected final String catalog; /** * Delete a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java index 0ca0092de7c..d86f1acaa63 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteMetalake.java @@ -24,7 +24,7 @@ import org.apache.gravitino.exceptions.NoSuchMetalakeException; public class DeleteMetalake extends Command { - protected String metalake; + protected final String metalake; /** * Delete a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java index 0295266a63e..461e25a40ed 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteSchema.java @@ -27,9 +27,9 @@ public class DeleteSchema extends Command { - protected String metalake; - protected String catalog; - protected String schema; + protected final String metalake; + protected final String catalog; + protected final String schema; /** * Delete a schema. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java index 69958476982..fe485b329fd 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTable.java @@ -29,10 +29,10 @@ public class DeleteTable extends Command { - protected String metalake; - protected String catalog; - protected String schema; - protected String table; + protected final String metalake; + protected final String catalog; + protected final String schema; + protected final String table; /** * Delete a table. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java index 9c488d4c404..3aa9cfb7dd2 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListCatalogProperties.java @@ -29,8 +29,8 @@ /** List the properties of a catalog. */ public class ListCatalogProperties extends ListProperties { - protected String metalake; - protected String catalog; + protected final String metalake; + protected final String catalog; /** * List the properties of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java index 773289c167a..2114e792241 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListMetalakeProperties.java @@ -28,7 +28,7 @@ /** List the properties of a metalake. */ public class ListMetalakeProperties extends ListProperties { - protected String metalake; + protected final String metalake; /** * List the properties of a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java index 5ef5591004e..bbd71c516eb 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListSchemaProperties.java @@ -30,9 +30,9 @@ /** List the properties of a catalog. */ public class ListSchemaProperties extends ListProperties { - protected String metalake; - protected String catalog; - protected String schema; + protected final String metalake; + protected final String catalog; + protected final String schema; /** * List the properties of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java index 6b2d990ab59..4651baeceed 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveCatalogProperty.java @@ -28,9 +28,9 @@ /** Remove a property of a catalog. */ public class RemoveCatalogProperty extends Command { - protected String metalake; - protected String catalog; - protected String property; + protected final String metalake; + protected final String catalog; + protected final String property; /** * Remove a property of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java index c334cb66424..0ac14f202f3 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveMetalakeProperty.java @@ -27,8 +27,8 @@ /** Remove a property of a metalake. */ public class RemoveMetalakeProperty extends Command { - protected String metalake; - protected String property; + protected final String metalake; + protected final String property; /** * Remove a property of a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java index 6dca9a8c5bb..9cccf983d22 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveSchemaProperty.java @@ -29,10 +29,10 @@ /** Remove a property of a schema. */ public class RemoveSchemaProperty extends Command { - protected String metalake; - protected String catalog; - protected String schema; - protected String property; + protected final String metalake; + protected final String catalog; + protected final String schema; + protected final String property; /** * Remove a property of a schema. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java index bcd130a9c41..54dd5bae66e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetCatalogProperty.java @@ -28,10 +28,10 @@ /** Set a property of a catalog. */ public class SetCatalogProperty extends Command { - protected String metalake; - protected String catalog; - protected String property; - protected String value; + protected final String metalake; + protected final String catalog; + protected final String property; + protected final String value; /** * Set a property of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java index 8aff84cb228..5ed69fd4a06 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetMetalakeProperty.java @@ -27,9 +27,9 @@ /** Set a property of a metalake. */ public class SetMetalakeProperty extends Command { - protected String metalake; - protected String property; - protected String value; + protected final String metalake; + protected final String property; + protected final String value; /** * Set a property of a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java index 0066464d029..f311f6c87c2 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetSchemaProperty.java @@ -29,11 +29,11 @@ /** Set a property of a schema. */ public class SetSchemaProperty extends Command { - protected String metalake; - protected String catalog; - protected String schema; - protected String property; - protected String value; + protected final String metalake; + protected final String catalog; + protected final String schema; + protected final String property; + protected final String value; /** * Set a property of a schema. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java index 08b12abc08e..1adcabafc0a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogComment.java @@ -28,9 +28,9 @@ /** Update the comment of a catalog. */ public class UpdateCatalogComment extends Command { - protected String metalake; - protected String catalog; - protected String comment; + protected final String metalake; + protected final String catalog; + protected final String comment; /** * Update the comment of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java index b5fbc726fdb..e6aa6d70015 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateCatalogName.java @@ -27,9 +27,9 @@ /** Update the name of a catalog. */ public class UpdateCatalogName extends Command { - protected String metalake; - protected String catalog; - protected String name; + protected final String metalake; + protected final String catalog; + protected final String name; /** * Update the name of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java index 4bb87b913bf..7ad58da734d 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeComment.java @@ -27,8 +27,8 @@ /** Update the comment of a metalake. */ public class UpdateMetalakeComment extends Command { - protected String metalake; - protected String comment; + protected final String metalake; + protected final String comment; /** * Update the comment of a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java index 38984d5c532..0cb76e3642a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateMetalakeName.java @@ -27,8 +27,8 @@ /** Update the name of a metalake. */ public class UpdateMetalakeName extends Command { - protected String metalake; - protected String name; + protected final String metalake; + protected final String name; /** * Update the name of a metalake. From 82ba035bfc4a4405e91efd849498cba6bab2791e Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 10:39:48 +1100 Subject: [PATCH 65/83] remove user-facing content --- clients/cli/README.md | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/clients/cli/README.md b/clients/cli/README.md index 038acea1be1..07a9695ac97 100644 --- a/clients/cli/README.md +++ b/clients/cli/README.md @@ -23,21 +23,11 @@ Apache Gravitino CLI is a command-line tool that interacts with the Gravitino se ## Table of Contents -- [Features](#features) - [Installation](#installation) -- [Usage](#usage) -- [Commands](#commands) - [Running Tests](#running-tests) - [Contributing](#contributing) - [License](#license) -## Features - -- Retrieve server version -- Provide help on usage -- Manage Gravitino entities such as Metalakes, Catalogs, Schemas, and Tables -- List details about Gravitino entities - ## Installation ### Prerequisites @@ -69,25 +59,6 @@ Before you can build and run this project, it is suggested you have the followin gcli --help ``` -### Examples -List All Metalakes - -```bash -gcli --list -``` - -Get Details of a Specific Metalake - -```bash -gcli metalake --details -name my-metalake -``` - -List Tables in a Catalog - -```bash -gcli metalake --list -name my-metalake -``` - ## Running Tests This project includes a suite of unit tests to verify its functionality. From a4ac180c1dd85e93f0890344510df1831753ab83 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 12:51:29 +1100 Subject: [PATCH 66/83] add URL to config file --- .../org/apache/gravitino/cli/FullName.java | 4 ++-- .../gravitino/cli/GravitinoCommandLine.java | 11 ++++++++- .../apache/gravitino/cli/GravitinoConfig.java | 15 +++++++++--- .../apache/gravitino/cli/TestFulllName.java | 4 ++-- .../gravitino/cli/TestGravitinoConfig.java | 23 +++++++++++++++++++ 5 files changed, 49 insertions(+), 8 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java index efec9b8b252..a56fdc29992 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/FullName.java @@ -41,7 +41,7 @@ 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. */ @@ -67,7 +67,7 @@ public String getMetalakeName() { config.read(); String configName = config.getMetalakeName(); if (configName != null) { - return config.getMetalakeName(); + return configName; } } 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 60c69169ce6..0bff884e01d 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 @@ -320,11 +320,13 @@ private void handleColumnCommand() { /** * 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); @@ -334,6 +336,13 @@ public String getUrl() { if (urlEnv == null && !urlSet) { urlEnv = System.getenv("GRAVITINO_URL"); urlSet = true; + // Check if the metalake name is specified in the configuration file + } else if (config.fileExists()) { + config.read(); + String configURL = config.getGravitinoURL(); + if (configURL != null) { + return configURL; + } } // If set return the Gravitino URL environment variable diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java index 80ecf5cc048..a54321868c0 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java @@ -31,6 +31,7 @@ public class GravitinoConfig { private String configFile; private String metalake; + private String url; public GravitinoConfig(String file) { if (file == null) { @@ -46,7 +47,8 @@ public boolean fileExists() { } public void read() { - String key = "metalake"; + String metalakeKey = "metalake"; + String urlKey = "URL"; Properties prop = new Properties(); try (FileInputStream stream = new FileInputStream(configFile)) { @@ -58,8 +60,11 @@ public void read() { System.err.println(exp.getMessage()); } - if (prop.containsKey(key)) { - metalake = prop.getProperty(key); + if (prop.containsKey(metalakeKey)) { + metalake = prop.getProperty(metalakeKey); + } + if (prop.containsKey(urlKey)) { + url = prop.getProperty(urlKey); } } @@ -67,6 +72,10 @@ public String getMetalakeName() { return metalake; } + public String getGravitinoURL() { + return url; + } + public String getConfigFile() { return configFile; } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 201609b7592..27108fd67e7 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -17,6 +17,8 @@ * under the License. */ +package org.apache.gravitino.cli; + import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -25,8 +27,6 @@ import org.apache.commons.cli.DefaultParser; import org.apache.commons.cli.MissingArgumentException; import org.apache.commons.cli.Options; -import org.apache.gravitino.cli.FullName; -import org.apache.gravitino.cli.GravitinoOptions; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java index 6561fa25ab1..c755e676865 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java @@ -41,6 +41,8 @@ public class TestGravitinoConfig { System.getProperty("java.io.tmpdir") + "/non_existent.properties"; private static final String METALAKE_KEY = "metalake"; private static final String METALAKE_VALUE = "metalake_demo"; + private static final String URL_KEY = "URL"; + private static final String URL_VALUE = "http://10.0.0.1:8090"; @BeforeEach public void setUp() throws IOException { @@ -52,6 +54,7 @@ public void setUp() throws IOException { Properties props = new Properties(); props.setProperty(METALAKE_KEY, METALAKE_VALUE); + props.setProperty(URL_KEY, URL_VALUE); try (Writer writer = Files.newBufferedWriter(tempFile.toPath(), StandardCharsets.UTF_8)) { props.store(writer, "Test Config"); @@ -88,6 +91,8 @@ public void validConfigFile() { METALAKE_VALUE, config.getMetalakeName(), "Should read the metalake value from the config file"); + assertEquals( + URL_VALUE, config.getGravitinoURL(), "Should read the URL value from the config file"); } @Test @@ -116,6 +121,23 @@ public void configFileMissingMetalake() throws IOException { tempFileWithoutMetalake.delete(); } + @Test + public void configFileMissingURL() throws IOException { + // Create a config file without the "url" key + File tempFileWithoutURL = new File(System.getProperty("java.io.tmpdir") + "/no_url.properties"); + try (Writer writer = + Files.newBufferedWriter(tempFileWithoutURL.toPath(), StandardCharsets.UTF_8)) { + writer.write("# This config file has no url key\n"); + } + + GravitinoConfig config = new GravitinoConfig(tempFileWithoutURL.getAbsolutePath()); + config.read(); + assertNull( + config.getGravitinoURL(), "URL should be null if the key is missing in the config file"); + + tempFileWithoutURL.delete(); + } + @Test public void invalidConfigFile() throws IOException { // Create a corrupt config file @@ -137,5 +159,6 @@ public void invalidConfigFile() throws IOException { public void withoutReadingConfig() { GravitinoConfig config = new GravitinoConfig(TEMP_FILE_PATH); assertNull(config.getMetalakeName(), "Metalake should be null before reading the config file"); + assertNull(config.getGravitinoURL(), "URL should be null before reading the config file"); } } From 1ea9e1225a88206215985a2a8c20ee3e1451d0e4 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 14:51:54 +1100 Subject: [PATCH 67/83] list commands need to run first or warning in output occurs --- .../gravitino/cli/GravitinoCommandLine.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 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 0bff884e01d..8af2935ee13 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 @@ -184,12 +184,16 @@ private void handleCatalogCommand() { String url = getUrl(); 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)) { 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 provider = line.getOptionValue(GravitinoOptions.PROVIDER); String comment = line.getOptionValue(GravitinoOptions.COMMENT); @@ -257,12 +261,16 @@ private void handleSchemaCommand() { FullName name = new FullName(line); 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)) { 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(); @@ -289,12 +297,16 @@ private void handleTableCommand() { String metalake = name.getMetalakeName(); 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)) { 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)) { From c3fc55c42c2120d8a530ab5d0e455c296f091602 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 16:08:17 +1100 Subject: [PATCH 68/83] add javadocs --- .../apache/gravitino/cli/GravitinoConfig.java | 37 ++++++++++++++++++- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java index a54321868c0..3e81fcaf780 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java @@ -25,14 +25,23 @@ import java.io.IOException; import java.util.Properties; +/** + * GravitinoConfig is a configuration class used to read and manage Gravitino settings. It supports + * setting a configuration file, reading properties like 'metalake' and 'URL', and verifying if the + * config file exists. + */ public class GravitinoConfig { - private static String defaultFile = ".gravitino"; - private String configFile; private String metalake; private String url; + /** + * Creates a GravitinoConfig object with a specified config file. If no file is provided, it + * defaults to `.gravitino` the user's home directory. + * + * @param file The path to the config file or null to use the default. + */ public GravitinoConfig(String file) { if (file == null) { configFile = System.getProperty("user.home") + "/" + defaultFile; @@ -41,11 +50,20 @@ public GravitinoConfig(String file) { } } + /** + * Checks if the configuration file exists. + * + * @return true if the config file exists, false otherwise. + */ public boolean fileExists() { File file = new File(configFile); return file.exists(); } + /** + * Reads the configuration file and loads the 'metalake' and 'URL' properties. If the file is not + * found, it is ignored as the config file is optional. + */ public void read() { String metalakeKey = "metalake"; String urlKey = "URL"; @@ -68,14 +86,29 @@ public void read() { } } + /** + * Retrieves the metalake name stored in the configuration. + * + * @return The metalake name or null if not set. + */ public String getMetalakeName() { return metalake; } + /** + * Retrieves the Gravitino URL stored in the configuration. + * + * @return The Gravitino URL or null if not set. + */ public String getGravitinoURL() { return url; } + /** + * Retrieves the path to the configuration file being used. + * + * @return The config file path. + */ public String getConfigFile() { return configFile; } From 50edda645b547c6f488b472cba8f905e542e1abc Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 16:44:50 +1100 Subject: [PATCH 69/83] add ignore to commands --- .../gravitino/cli/GravitinoCommandLine.java | 16 ++++++++-------- .../gravitino/cli/commands/CreateGroup.java | 5 +++-- .../gravitino/cli/commands/CreateUser.java | 5 +++-- .../gravitino/cli/commands/DeleteGroup.java | 5 +++-- .../gravitino/cli/commands/DeleteUser.java | 5 +++-- .../gravitino/cli/commands/GroupDetails.java | 5 +++-- .../gravitino/cli/commands/ListGroups.java | 5 +++-- .../apache/gravitino/cli/commands/ListUsers.java | 5 +++-- .../gravitino/cli/commands/UserDetails.java | 5 +++-- 9 files changed, 32 insertions(+), 24 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 13282641312..faf36ac34d6 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 @@ -330,13 +330,13 @@ protected void handleUserCommand() { String user = line.getOptionValue(GravitinoOptions.USER); if (CommandActions.DETAILS.equals(command)) { - new UserDetails(url, metalake, user).handle(); + new UserDetails(url, ignore, metalake, user).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListUsers(url, metalake).handle(); + new ListUsers(url, ignore, metalake).handle(); } else if (CommandActions.CREATE.equals(command)) { - new CreateUser(url, metalake, user).handle(); + new CreateUser(url, ignore, metalake, user).handle(); } else if (CommandActions.DELETE.equals(command)) { - new DeleteUser(url, metalake, user).handle(); + new DeleteUser(url, ignore, metalake, user).handle(); } } @@ -348,13 +348,13 @@ protected void handleGroupCommand() { String group = line.getOptionValue(GravitinoOptions.GROUP); if (CommandActions.DETAILS.equals(command)) { - new GroupDetails(url, metalake, group).handle(); + new GroupDetails(url, ignore, metalake, group).handle(); } else if (CommandActions.LIST.equals(command)) { - new ListGroups(url, metalake).handle(); + new ListGroups(url, ignore, metalake).handle(); } else if (CommandActions.CREATE.equals(command)) { - new CreateGroup(url, metalake, group).handle(); + new CreateGroup(url, ignore, metalake, group).handle(); } else if (CommandActions.DELETE.equals(command)) { - new DeleteGroup(url, metalake, group).handle(); + new DeleteGroup(url, ignore, metalake, group).handle(); } } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java index 885d97a84bc..0f6f0f5dacb 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java @@ -32,11 +32,12 @@ public class CreateGroup extends Command { * Create a new group. * * @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 group The name of the group. */ - public CreateGroup(String url, String metalake, String group) { - super(url); + public CreateGroup(String url, boolean ignoreVersions, String metalake, String group) { + super(url, ignoreVersions); this.metalake = metalake; this.group = group; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java index 0a4061f81d1..169d28c1e10 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java @@ -32,11 +32,12 @@ public class CreateUser extends Command { * Create a new User. * * @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 user The name of the user. */ - public CreateUser(String url, String metalake, String user) { - super(url); + public CreateUser(String url, boolean ignoreVersions, String metalake, String user) { + super(url, ignoreVersions); this.metalake = metalake; this.user = user; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java index 1b563822c44..3ac8d13333d 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java @@ -33,11 +33,12 @@ public class DeleteGroup extends Command { * Delete a group. * * @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 group The name of the group. */ - public DeleteGroup(String url, String metalake, String group) { - super(url); + public DeleteGroup(String url, boolean ignoreVersions, String metalake, String group) { + super(url, ignoreVersions); this.metalake = metalake; this.group = group; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java index 9da3b55662d..d8905d4c913 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java @@ -33,11 +33,12 @@ public class DeleteUser extends Command { * Delete a user. * * @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 user The name of the user. */ - public DeleteUser(String url, String metalake, String user) { - super(url); + public DeleteUser(String url, boolean ignoreVersions, String metalake, String user) { + super(url, ignoreVersions); this.metalake = metalake; this.user = user; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java index 0cafe886808..4b07276d6fc 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java @@ -34,11 +34,12 @@ public class GroupDetails extends Command { * Displays the users in a group. * * @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 group The name of the group. */ - public GroupDetails(String url, String metalake, String group) { - super(url); + public GroupDetails(String url, boolean ignoreVersions, String metalake, String group) { + super(url, ignoreVersions); this.metalake = metalake; this.group = group; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java index e33c4909bd8..02b2664de02 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java @@ -32,10 +32,11 @@ public class ListGroups extends Command { * Lists all groups in a metalake. * * @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 ListGroups(String url, String metalake) { - super(url); + public ListGroups(String url, boolean ignoreVersions, String metalake) { + super(url, ignoreVersions); this.metalake = metalake; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java index 3cd1a46921f..d5606a336c2 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java @@ -32,10 +32,11 @@ public class ListUsers extends Command { * Lists all users in a metalake. * * @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 ListUsers(String url, String metalake) { - super(url); + public ListUsers(String url, boolean ignoreVersions, String metalake) { + super(url, ignoreVersions); this.metalake = metalake; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java index e7b6f68430b..06d4ca5875f 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java @@ -34,11 +34,12 @@ public class UserDetails extends Command { * Displays the roles of a user. * * @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 user The name of the user. */ - public UserDetails(String url, String metalake, String user) { - super(url); + public UserDetails(String url, boolean ignoreVersions, String metalake, String user) { + super(url, ignoreVersions); this.metalake = metalake; this.user = user; } From cb3101904d2c0ba76b9b209362d3a7e28bb9f89b Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 16:47:20 +1100 Subject: [PATCH 70/83] make fields final --- .../java/org/apache/gravitino/cli/commands/CreateGroup.java | 4 ++-- .../java/org/apache/gravitino/cli/commands/CreateUser.java | 4 ++-- .../java/org/apache/gravitino/cli/commands/DeleteGroup.java | 4 ++-- .../java/org/apache/gravitino/cli/commands/DeleteUser.java | 4 ++-- .../java/org/apache/gravitino/cli/commands/GroupDetails.java | 4 ++-- .../java/org/apache/gravitino/cli/commands/ListGroups.java | 2 +- .../java/org/apache/gravitino/cli/commands/ListUsers.java | 2 +- .../java/org/apache/gravitino/cli/commands/UserDetails.java | 4 ++-- 8 files changed, 14 insertions(+), 14 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java index 0f6f0f5dacb..da65e295a4a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateGroup.java @@ -25,8 +25,8 @@ import org.apache.gravitino.exceptions.NoSuchMetalakeException; public class CreateGroup extends Command { - protected String metalake; - protected String group; + protected final String metalake; + protected final String group; /** * Create a new group. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java index 169d28c1e10..02c9d975151 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateUser.java @@ -25,8 +25,8 @@ import org.apache.gravitino.exceptions.UserAlreadyExistsException; public class CreateUser extends Command { - protected String metalake; - protected String user; + protected final String metalake; + protected final String user; /** * Create a new User. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java index 3ac8d13333d..d025cd64cc0 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteGroup.java @@ -26,8 +26,8 @@ public class DeleteGroup extends Command { - protected String metalake; - protected String group; + protected final String metalake; + protected final String group; /** * Delete a group. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java index d8905d4c913..49e9929d3fe 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteUser.java @@ -26,8 +26,8 @@ public class DeleteUser extends Command { - protected String metalake; - protected String user; + protected final String metalake; + protected final String user; /** * Delete a user. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java index 4b07276d6fc..9c210940ff9 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java @@ -27,8 +27,8 @@ public class GroupDetails extends Command { - protected String metalake; - protected String group; + protected final String metalake; + protected final String group; /** * Displays the users in a group. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java index 02b2664de02..bfda59912f0 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java @@ -26,7 +26,7 @@ /* Lists all groups in a metalake. */ public class ListGroups extends Command { - protected String metalake; + protected final String metalake; /** * Lists all groups in a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java index d5606a336c2..cce01c56124 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java @@ -26,7 +26,7 @@ /* Lists all users in a metalake. */ public class ListUsers extends Command { - protected String metalake; + protected final String metalake; /** * Lists all users in a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java index 06d4ca5875f..a06a4aaec14 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java @@ -27,8 +27,8 @@ public class UserDetails extends Command { - protected String metalake; - protected String user; + protected final String metalake; + protected final String user; /** * Displays the roles of a user. From dd97d26b6a058096e563201018d7a757e6b8d76e Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 16:52:42 +1100 Subject: [PATCH 71/83] simplify output --- .../org/apache/gravitino/cli/commands/GroupDetails.java | 8 +------- .../org/apache/gravitino/cli/commands/ListGroups.java | 8 +------- .../java/org/apache/gravitino/cli/commands/ListUsers.java | 8 +------- .../org/apache/gravitino/cli/commands/UserDetails.java | 8 +------- 4 files changed, 4 insertions(+), 28 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java index 9c210940ff9..fb32963edfb 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/GroupDetails.java @@ -62,13 +62,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < roles.size(); i++) { - if (i > 0) { - all.append(","); - } - all.append(roles.get(i)); - } + String all = String.join(",", roles); System.out.println(all.toString()); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java index bfda59912f0..f9c2ff1c465 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListGroups.java @@ -54,13 +54,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < groups.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(groups[i]); - } + String all = String.join(",", groups); System.out.println(all.toString()); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java index cce01c56124..d6f6c232992 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListUsers.java @@ -54,13 +54,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < users.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(users[i]); - } + String all = String.join(",", users); System.out.println(all.toString()); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java index a06a4aaec14..f038a8948e1 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UserDetails.java @@ -62,13 +62,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < roles.size(); i++) { - if (i > 0) { - all.append(","); - } - all.append(roles.get(i)); - } + String all = String.join(",", roles); System.out.println(all.toString()); } From 43546f84f55a8404f304c3c5e6282a0534391870 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 17:22:17 +1100 Subject: [PATCH 72/83] add final --- .../java/org/apache/gravitino/cli/commands/CreateTag.java | 6 +++--- .../java/org/apache/gravitino/cli/commands/DeleteTag.java | 4 ++-- .../org/apache/gravitino/cli/commands/ListAllTags.java | 2 +- .../apache/gravitino/cli/commands/ListTagProperties.java | 4 ++-- .../apache/gravitino/cli/commands/RemoveTagProperty.java | 6 +++--- .../org/apache/gravitino/cli/commands/SetTagProperty.java | 8 ++++---- .../org/apache/gravitino/cli/commands/TagDetails.java | 4 ++-- .../java/org/apache/gravitino/cli/commands/TagEntity.java | 6 +++--- .../org/apache/gravitino/cli/commands/UntagEntity.java | 6 +++--- .../org/apache/gravitino/cli/commands/UpdateTagName.java | 6 +++--- 10 files changed, 26 insertions(+), 26 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java index 19a967326f2..7adc9cc257a 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/CreateTag.java @@ -25,9 +25,9 @@ import org.apache.gravitino.exceptions.TagAlreadyExistsException; public class CreateTag extends Command { - protected String metalake; - protected String tag; - protected String comment; + protected final String metalake; + protected final String tag; + protected final String comment; /** * Create a new tag. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java index 5e4bc2f2eda..92ace6fdc8b 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/DeleteTag.java @@ -26,8 +26,8 @@ public class DeleteTag extends Command { - protected String metalake; - protected String tag; + protected final String metalake; + protected final String tag; /** * Delete a tag. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java index 9cb559f1752..481ede9a1b5 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java @@ -26,7 +26,7 @@ /* Lists all tags in a metalake. */ public class ListAllTags extends Command { - protected String metalake; + protected final String metalake; /** * Lists all tags in a metalake. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java index efb8e8da78a..a438ee41687 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListTagProperties.java @@ -29,8 +29,8 @@ /** List the properties of a tag. */ public class ListTagProperties extends ListProperties { - protected String metalake; - protected String tag; + protected final String metalake; + protected final String tag; /** * List the properties of a tag. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java index 1d90bdebd69..3d2745768d1 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/RemoveTagProperty.java @@ -28,9 +28,9 @@ /** Remove a property of a tag. */ public class RemoveTagProperty extends Command { - protected String metalake; - protected String tag; - protected String property; + protected final String metalake; + protected final String tag; + protected final String property; /** * Remove a property of a tag. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java index f22006219f9..975d020374f 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetTagProperty.java @@ -28,10 +28,10 @@ /** Set a property of a tag. */ public class SetTagProperty extends Command { - protected String metalake; - protected String tag; - protected String property; - protected String value; + protected final String metalake; + protected final String tag; + protected final String property; + protected final String value; /** * Set a property of a tag. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java index fd393d6add7..0211c50cec8 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagDetails.java @@ -27,8 +27,8 @@ public class TagDetails extends Command { - protected String metalake; - protected String tag; + protected final String metalake; + protected final String tag; /** * Displays the name and comment of a catalog. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java index 925fe3eb188..a95e84b3d8d 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java @@ -32,9 +32,9 @@ import org.apache.gravitino.rel.Table; public class TagEntity extends Command { - protected String metalake; - protected FullName name; - protected String tag; + protected final String metalake; + protected final FullName name; + protected final String tag; /** * Tag an entity with an existing tag. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java index 1158a3e63bb..488ae18438e 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java @@ -32,9 +32,9 @@ import org.apache.gravitino.rel.Table; public class UntagEntity extends Command { - protected String metalake; - protected FullName name; - protected String tag; + protected final String metalake; + protected final FullName name; + protected final String tag; /** * Untag an entity with an existing tag. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java index 4292e41b36d..28e652776b8 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagName.java @@ -28,9 +28,9 @@ /** Update the name of a tag. */ public class UpdateTagName extends Command { - protected String metalake; - protected String tag; - protected String name; + protected final String metalake; + protected final String tag; + protected final String name; /** * Update the name of a tag. From 2d268a65787582f9ce31c2ebcd9baeee7849be35 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 17:22:49 +1100 Subject: [PATCH 73/83] missed one --- .../org/apache/gravitino/cli/commands/UpdateTagComment.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java index 4a6e4d2230c..5e8aad9ddab 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UpdateTagComment.java @@ -28,9 +28,9 @@ /** Update the comment of a tag. */ public class UpdateTagComment extends Command { - protected String metalake; - protected String tag; - protected String comment; + protected final String metalake; + protected final String tag; + protected final String comment; /** * Update the comment of a tag. From 6ad0af574521141825ca32545485145d4ad08b49 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 17:25:06 +1100 Subject: [PATCH 74/83] simplify output --- .../org/apache/gravitino/cli/commands/ListAllTags.java | 8 +------- .../java/org/apache/gravitino/cli/commands/TagEntity.java | 8 +------- .../org/apache/gravitino/cli/commands/UntagEntity.java | 8 +------- 3 files changed, 3 insertions(+), 21 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java index 481ede9a1b5..b983293f959 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/ListAllTags.java @@ -54,13 +54,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < tags.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(tags[i]); - } + String all = String.join(",", tags); System.out.println(all.toString()); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java index a95e84b3d8d..d1cee3d95ac 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/TagEntity.java @@ -101,13 +101,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < tags.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(tags[i]); - } + String all = String.join(",", tags); System.out.println(entity + " tagged with " + all); } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java index 488ae18438e..52fb31ec8ed 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/UntagEntity.java @@ -102,13 +102,7 @@ public void handle() { return; } - StringBuilder all = new StringBuilder(); - for (int i = 0; i < tags.length; i++) { - if (i > 0) { - all.append(","); - } - all.append(tags[i]); - } + String all = String.join(",", tags); System.out.println(entity + " untagged, tagged with " + all); } From 20e550f975ec17fce24996a4b843be490ac3ff66 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 17:57:46 +1100 Subject: [PATCH 75/83] reset files --- .../gravitino/cli/GravitinoCommandLine.java | 367 ++++++++++++++++++ .../java/org/apache/gravitino/cli/Main.java | 104 +++++ 2 files changed, 471 insertions(+) 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 8b137891791..8af2935ee13 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 @@ -1 +1,368 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.gravitino.cli; + +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.CreateHadoopCatalog; +import org.apache.gravitino.cli.commands.CreateHiveCatalog; +import org.apache.gravitino.cli.commands.CreateIcebergCatalog; +import org.apache.gravitino.cli.commands.CreateKafkaCatalog; +import org.apache.gravitino.cli.commands.CreateMetalake; +import org.apache.gravitino.cli.commands.CreateMySQLCatalog; +import org.apache.gravitino.cli.commands.CreatePostgresCatalog; +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.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 { + + private final CommandLine line; + private final Options options; + private final String entity; + private final String command; + private String urlEnv; + private boolean urlSet = false; + private boolean ignore = false; + + public static final String CMD = "gcli"; // recommended name + public static final String DEFAULT_URL = "http://localhost:8090"; + + /** + * Gravitino Command line. + * + * @param line Parsed command line object. + * @param options Available options for the CLI. + * @param entity The entity to apply the command to e.g. metlake, catalog, schema, table etc etc. + * @param command The type of command to run i.e. list, details, update, delete, or create. + */ + public GravitinoCommandLine(CommandLine line, Options options, String entity, String command) { + this.line = line; + this.options = options; + this.entity = entity; + this.command = command; + } + + /** Handles the parsed command line arguments and executes the corresponding actions. */ + public void handleCommandLine() { + /* Check if you should ignore client/version versions */ + if (line.hasOption(GravitinoOptions.IGNORE)) { + ignore = true; + } + + executeCommand(); + } + + /** Handles the parsed command line arguments and executes the corresponding actions. */ + public void handleSimpleLine() { + /* Display command usage. */ + if (line.hasOption(GravitinoOptions.HELP)) { + displayHelp(options); + } + /* Display Gravitino client version. */ + else if (line.hasOption(GravitinoOptions.VERSION)) { + new ClientVersion(getUrl(), ignore).handle(); + } + /* Display Gravitino server version. */ + else if (line.hasOption(GravitinoOptions.SERVER)) { + new ServerVersion(getUrl(), ignore).handle(); + } + } + + /** + * Displays the help message for the command line tool. + * + * @param options The command options. + */ + public static void displayHelp(Options options) { + HelpFormatter formatter = new HelpFormatter(); + formatter.printHelp(CMD, options); + } + + /** Executes the appropriate command based on the command type. */ + private void executeCommand() { + if (entity.equals(CommandEntities.COLUMN)) { + handleColumnCommand(); + } else if (entity.equals(CommandEntities.TABLE)) { + handleTableCommand(); + } else if (entity.equals(CommandEntities.SCHEMA)) { + handleSchemaCommand(); + } else if (entity.equals(CommandEntities.CATALOG)) { + handleCatalogCommand(); + } else if (entity.equals(CommandEntities.METALAKE)) { + handleMetalakeCommand(); + } + } + + /** + * Handles the command execution for Metalakes based on command type and the command line options. + */ + private void handleMetalakeCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + + if (CommandActions.DETAILS.equals(command)) { + new MetalakeDetails(url, ignore, metalake).handle(); + } 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(); + } + } + } + + /** + * Handles the command execution for Catalogs based on command type and the command line options. + */ + private void handleCatalogCommand() { + String url = getUrl(); + 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)) { + new CatalogDetails(url, ignore, metalake, catalog).handle(); + } else if (CommandActions.CREATE.equals(command)) { + String provider = line.getOptionValue(GravitinoOptions.PROVIDER); + String comment = line.getOptionValue(GravitinoOptions.COMMENT); + if (provider.equals(Providers.HIVE)) { + String metastore = line.getOptionValue(GravitinoOptions.METASTORE); + new CreateHiveCatalog(url, ignore, metalake, catalog, provider, comment, metastore) + .handle(); + } else if (provider.equals(Providers.ICEBERG)) { + String metastore = line.getOptionValue(GravitinoOptions.METASTORE); + String warehouse = line.getOptionValue(GravitinoOptions.WAREHOUSE); + new CreateIcebergCatalog( + url, ignore, metalake, catalog, provider, comment, metastore, warehouse) + .handle(); + } else if (provider.equals(Providers.MYSQL)) { + String jdbcurl = line.getOptionValue(GravitinoOptions.JDBCURL); + String user = line.getOptionValue(GravitinoOptions.USER); + String password = line.getOptionValue(GravitinoOptions.PASSWORD); + new CreateMySQLCatalog( + url, ignore, metalake, catalog, provider, comment, jdbcurl, user, password) + .handle(); + } else if (provider.equals(Providers.POSTGRES)) { + String jdbcurl = line.getOptionValue(GravitinoOptions.JDBCURL); + String user = line.getOptionValue(GravitinoOptions.USER); + String password = line.getOptionValue(GravitinoOptions.PASSWORD); + String database = line.getOptionValue(GravitinoOptions.DATABASE); + new CreatePostgresCatalog( + url, ignore, metalake, catalog, provider, comment, jdbcurl, user, password, + database) + .handle(); + } else if (provider.equals(Providers.HADOOP)) { + new CreateHadoopCatalog(url, ignore, metalake, catalog, provider, comment).handle(); + } else if (provider.equals(Providers.KAFKA)) { + String bootstrap = line.getOptionValue(GravitinoOptions.BOOTSTRAP); + new CreateKafkaCatalog(url, ignore, metalake, catalog, provider, comment, bootstrap) + .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(); + } + } + } + + /** + * Handles the command execution for Schemas based on command type and the command line options. + */ + private void handleSchemaCommand() { + String url = getUrl(); + FullName name = new FullName(line); + 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)) { + 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(); + } 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(); + } + } + + /** + * Handles the command execution for Tables based on command type and the command line options. + */ + private void handleTableCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + 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)) { + new TableDetails(url, ignore, metalake, catalog, schema, table).handle(); + } else if (CommandActions.CREATE.equals(command)) { + // TODO + } else if (CommandActions.DELETE.equals(command)) { + new DeleteTable(url, ignore, metalake, catalog, schema, table).handle(); + } + } + + /** + * Handles the command execution for Columns based on command type and the command line options. + */ + private void handleColumnCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String catalog = name.getCatalogName(); + String schema = name.getSchemaName(); + String table = name.getTableName(); + + if (CommandActions.LIST.equals(command)) { + new ListColumns(url, ignore, metalake, catalog, schema, table).handle(); + } + } + + /** + * Retrieves the Gravitinno URL from the command line options or the GRAVITINO_URL environment + * 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); + } + + // Cache the Gravitino URL environment variable + if (urlEnv == null && !urlSet) { + urlEnv = System.getenv("GRAVITINO_URL"); + urlSet = true; + // Check if the metalake name is specified in the configuration file + } else if (config.fileExists()) { + config.read(); + String configURL = config.getGravitinoURL(); + if (configURL != null) { + return configURL; + } + } + + // If set return the Gravitino URL environment variable + if (urlEnv != null) { + return urlEnv; + } + + // Return the default localhost URL + return DEFAULT_URL; + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 8b137891791..0d0eaddf752 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -1 +1,105 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.gravitino.cli; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; + +/* Entry point for teh Gravitino command line. */ +public class Main { + + public static void main(String[] args) { + CommandLineParser parser = new DefaultParser(); + Options options = new GravitinoOptions().options(); + + try { + CommandLine line = parser.parse(options, args); + String entity = resolveEntity(line); + String[] extra = line.getArgs(); + if (extra.length > 2) { + System.err.println(ErrorMessages.TOO_MANY_ARGUMENTS); + return; + } + String command = resolveCommand(line); + GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, entity, command); + + if (entity != null && command != null) { + commandLine.handleCommandLine(); + } else { + commandLine.handleSimpleLine(); + } + } catch (ParseException exp) { + System.err.println("Error parsing command line: " + exp.getMessage()); + GravitinoCommandLine.displayHelp(options); + } + } + + /** + * Determines the command based on the command line input. + * + * @param line Parsed command line object. + * @return The command, one of 'details', 'list', 'create', 'delete' or 'update'. + */ + protected static String resolveCommand(CommandLine line) { + + /* As the bare second argument. */ + String[] args = line.getArgs(); + + if (args.length == 2) { + String action = args[1]; + if (CommandActions.isValidCommand(action)) { + return action; + } + } else if (args.length == 1) { + return CommandActions.DETAILS; /* Default to 'details' command. */ + } else if (args.length == 0) { + return null; + } + + System.err.println(ErrorMessages.UNSUPPORTED_COMMAND); + return null; + } + + /** + * Determines the entity to act upon based on the command line input. + * + * @param line Parsed command line object. + * @return The entity, e.g. metakalake, catalog, schema, table, etc. + */ + protected static String resolveEntity(CommandLine line) { + /* As the bare first argument. */ + String[] args = line.getArgs(); + + if (args.length >= 1) { + String entity = args[0]; + if (CommandEntities.isValidEntity(entity)) { + return entity; + } else { + System.err.println(ErrorMessages.UNKNOWN_ENTITY); + return null; + } + } + + return null; + } +} From eeefccc46be4370c69b8a4635da4a63aaee1faa4 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Thu, 24 Oct 2024 18:03:01 +1100 Subject: [PATCH 76/83] restore test files --- .../apache/gravitino/cli/TestFulllName.java | 91 +++++++++++ .../org/apache/gravitino/cli/TestMain.java | 145 ++++++++++++++++++ 2 files changed, 236 insertions(+) diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java index 8b137891791..27108fd67e7 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestFulllName.java @@ -1 +1,92 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertThrows; + +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.MissingArgumentException; +import org.apache.commons.cli.Options; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class TestFulllName { + + private Options options; + + @BeforeEach + public void setUp() { + options = new GravitinoOptions().options(); + } + + @Test + public void entityFromFullNameOption() throws Exception { + String[] args = {"--metalake", "metalakeA", "--name", "catalogB.schemaC.tableD"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String metalakeName = fullName.getMetalakeName(); + assertEquals("metalakeA", metalakeName); + String catalogName = fullName.getCatalogName(); + assertEquals("catalogB", catalogName); + String schemaName = fullName.getSchemaName(); + assertEquals("schemaC", schemaName); + String tableName = fullName.getTableName(); + assertEquals("tableD", tableName); + } + + @Test + public void entityNotFound() throws Exception { + String[] args = {}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String metalakeName = fullName.getMetalakeName(); + assertNull(metalakeName); + } + + @Test + public void malformedName() throws Exception { + String[] args = {"--name", "catalog.schema"}; + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + String tableName = fullName.getTableName(); + assertNull(tableName); + } + + @Test + public void missingName() throws Exception { + String[] args = {"catalog", "--name"}; + assertThrows(MissingArgumentException.class, () -> new DefaultParser().parse(options, args)); + } + + @Test + public void missingArgs() throws Exception { + String[] args = {}; // No name provided + CommandLine commandLine = new DefaultParser().parse(options, args); + FullName fullName = new FullName(commandLine); + + String namePart = fullName.getNamePart(3); + assertNull(namePart); + } +} diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java index 8b137891791..c6d1bacdb17 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestMain.java @@ -1 +1,146 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.gravitino.cli; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import org.apache.commons.cli.CommandLine; +import org.apache.commons.cli.CommandLineParser; +import org.apache.commons.cli.DefaultParser; +import org.apache.commons.cli.Options; +import org.apache.commons.cli.ParseException; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + +public class TestMain { + + private final ByteArrayOutputStream outContent = new ByteArrayOutputStream(); + private final ByteArrayOutputStream errContent = new ByteArrayOutputStream(); + private final PrintStream originalOut = System.out; + private final PrintStream originalErr = System.err; + + @BeforeEach + public void setUpStreams() { + System.setOut(new PrintStream(outContent)); + System.setErr(new PrintStream(errContent)); + } + + @AfterEach + public void restoreStreams() { + System.setOut(originalOut); + System.setErr(originalErr); + } + + @Test + public void withTwoArgs() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"metalake", "details"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line); + assertEquals(CommandEntities.METALAKE, entity); + } + + @Test + public void defaultToDetailsOneArg() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"metalake"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line); + assertEquals(CommandEntities.METALAKE, entity); + } + + @Test + public void withNoArgs() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertNull(command); + String entity = Main.resolveEntity(line); + assertNull(entity); + } + + @Test + public void withNoArgsAndOptions() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"--name", "metalake_demo"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertNull(command); + String entity = Main.resolveEntity(line); + assertNull(entity); + } + + @Test + @SuppressWarnings("DefaultCharset") + public void withHelpOption() throws ParseException, UnsupportedEncodingException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"--help"}; + CommandLine line = parser.parse(options, args); + + GravitinoCommandLine commandLine = new GravitinoCommandLine(line, options, null, "help"); + commandLine.handleSimpleLine(); + + assertTrue(outContent.toString().contains("usage:")); // Expected help output + } + + @Test + @SuppressWarnings("DefaultCharset") + public void parseError() throws UnsupportedEncodingException { + String[] args = {"--invalidOption"}; + + Main.main(args); + + assertTrue(errContent.toString().contains("Error parsing command line")); // Expect error + assertTrue(outContent.toString().contains("usage:")); // Expect help output + } + + @Test + public void catalogWithOneArg() throws ParseException { + Options options = new GravitinoOptions().options(); + CommandLineParser parser = new DefaultParser(); + String[] args = {"catalog", "--name", "catalog_postgres"}; + CommandLine line = parser.parse(options, args); + + String command = Main.resolveCommand(line); + assertEquals(CommandActions.DETAILS, command); + String entity = Main.resolveEntity(line); + assertEquals(CommandEntities.CATALOG, entity); + } +} From 9f073acac5ef5df70ba967d6b2cfe67c4d3dd1e9 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 25 Oct 2024 10:33:23 +1100 Subject: [PATCH 77/83] add ignore to the config file --- .../gravitino/cli/GravitinoCommandLine.java | 35 +++++++++++++++---- .../apache/gravitino/cli/GravitinoConfig.java | 16 ++++++++- .../gravitino/cli/TestGravitinoConfig.java | 23 ++++++++++++ 3 files changed, 66 insertions(+), 8 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 8af2935ee13..79444e9dc59 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 @@ -69,6 +69,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"; @@ -90,9 +92,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(); @@ -348,13 +367,6 @@ public String getUrl() { if (urlEnv == null && !urlSet) { urlEnv = System.getenv("GRAVITINO_URL"); urlSet = true; - // Check if the metalake name is specified in the configuration file - } else if (config.fileExists()) { - config.read(); - String configURL = config.getGravitinoURL(); - if (configURL != null) { - return configURL; - } } // If set return the Gravitino URL environment variable @@ -362,6 +374,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; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java index 3e81fcaf780..da837c21e56 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoConfig.java @@ -32,9 +32,10 @@ */ public class GravitinoConfig { private static String defaultFile = ".gravitino"; - private String configFile; + private final String configFile; private String metalake; private String url; + private boolean ignore; /** * Creates a GravitinoConfig object with a specified config file. If no file is provided, it @@ -67,6 +68,7 @@ public boolean fileExists() { public void read() { String metalakeKey = "metalake"; String urlKey = "URL"; + String ignoreKey = "ignore"; Properties prop = new Properties(); try (FileInputStream stream = new FileInputStream(configFile)) { @@ -84,6 +86,9 @@ public void read() { if (prop.containsKey(urlKey)) { url = prop.getProperty(urlKey); } + if (prop.containsKey(ignoreKey)) { + ignore = prop.getProperty(ignoreKey).equals("true"); + } } /** @@ -104,6 +109,15 @@ public String getGravitinoURL() { return url; } + /** + * Retrieves the ignore options stored in the configuration. + * + * @return The config file path. + */ + public boolean getIgnore() { + return ignore; + } + /** * Retrieves the path to the configuration file being used. * diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java index c755e676865..b2c1ce7d5f7 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestGravitinoConfig.java @@ -43,6 +43,8 @@ public class TestGravitinoConfig { private static final String METALAKE_VALUE = "metalake_demo"; private static final String URL_KEY = "URL"; private static final String URL_VALUE = "http://10.0.0.1:8090"; + private static final String IGNORE_KEY = "ignore"; + private static final String IGNORE_VALUE = "true"; @BeforeEach public void setUp() throws IOException { @@ -55,6 +57,7 @@ public void setUp() throws IOException { Properties props = new Properties(); props.setProperty(METALAKE_KEY, METALAKE_VALUE); props.setProperty(URL_KEY, URL_VALUE); + props.setProperty(IGNORE_KEY, IGNORE_VALUE); try (Writer writer = Files.newBufferedWriter(tempFile.toPath(), StandardCharsets.UTF_8)) { props.store(writer, "Test Config"); @@ -93,6 +96,7 @@ public void validConfigFile() { "Should read the metalake value from the config file"); assertEquals( URL_VALUE, config.getGravitinoURL(), "Should read the URL value from the config file"); + assertTrue(config.getIgnore(), "Should read the ignore value from the config file"); } @Test @@ -138,6 +142,24 @@ public void configFileMissingURL() throws IOException { tempFileWithoutURL.delete(); } + @Test + public void configFileMissingIgnore() throws IOException { + // Create a config file without the "ignore" key + File tempFileWithoutIgnore = + new File(System.getProperty("java.io.tmpdir") + "/no_url.properties"); + try (Writer writer = + Files.newBufferedWriter(tempFileWithoutIgnore.toPath(), StandardCharsets.UTF_8)) { + writer.write("# This config file has no ignore key\n"); + } + + GravitinoConfig config = new GravitinoConfig(tempFileWithoutIgnore.getAbsolutePath()); + config.read(); + assertFalse( + config.getIgnore(), "Ignore should be false if the key is missing in the config file"); + + tempFileWithoutIgnore.delete(); + } + @Test public void invalidConfigFile() throws IOException { // Create a corrupt config file @@ -160,5 +182,6 @@ public void withoutReadingConfig() { GravitinoConfig config = new GravitinoConfig(TEMP_FILE_PATH); assertNull(config.getMetalakeName(), "Metalake should be null before reading the config file"); assertNull(config.getGravitinoURL(), "URL should be null before reading the config file"); + assertFalse(config.getIgnore(), "Ignore should be null before reading the config file"); } } From 64f18ef28c052d555244ed12a6db7797232a53b7 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 25 Oct 2024 10:51:44 +1100 Subject: [PATCH 78/83] update documentation --- docs/cli.md | 210 +++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 192 insertions(+), 18 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index 98a311fefed..11c6ca944a0 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -8,52 +8,65 @@ last_update: license: 'This software is licensed under the Apache License version 2.' --- -This document primarily outlines how users can manage metadata within Apache Gravitino using the Command Line Interface (CLI). The CLI is accessible via a terminal window as an alternative to writing code or using the REST interface. +This document provides guidance on managing metadata within Apache Gravitino using the Command Line Interface (CLI). The CLI offers a terminal based alternative to using code or the REST interface for metadata management. -Currently, you can view basic metadata information for metalakes, catalogs, schema, and tables. The ability to create, update, and delete metalakes and support additional entities in planned in the near future. +At present, the CLI allows users to view metadata information for metalakes, catalogs, schemas, and tables. Future updates will expand on these capabilities to include entities such as roles, users and tags. ## Running the CLI -You can set up an alias for the command like so: +You can configure an alias for the CLI for ease of use, with the following command: ```bash alias gcli='java -jar ../../cli/build/libs/gravitino-cli-*-incubating-SNAPSHOT.jar' ``` -Or use the `gcli.sh` script found in the `clients/cli/bin/` directory to run the CLI. +Or you use the `gcli.sh` script found in the `clients/cli/bin/` directory to run the CLI. ## Usage - To run the Gravitino CLI, use the following command structure: +The general structure for running commands with the Gravitino CLI is `gcli entity command [options]`. ```bash - usage: gcli [metalake|catalog|schema|table] [list|details|create|delete|update] [options] + usage: gcli [metalake|catalog|schema|table|column] [list|details|create|delete|update|set|remove|properties] [options] Options - -f,--name full entity name (dot separated) - -h,--help command help information - -i,--ignore Ignore client/sever version check - -m,--metalake Metalake name - -r,--server Gravitino server version - -u,--url Gravitino URL (default: http://localhost:8090) - -v,--version Gravitino client version + -b,--bootstrap Kafka bootstrap servers + -c,--comment entity comment + -d,--database database name + -h,--help command help information + -i,--ignore Ignore client/sever version check + -j,--jdbcurl JDBC URL + -l,--user database username + -m,--metastore Hive metastore URI + -n,--name full entity name (dot separated) + -p,--provider provider one of hadoop, hive, mysql, postgres, + iceberg, kafka + -r,--rename new entity name + -u,--url Gravitino URL (default: http://localhost:8090) + -v,--value property value + -w,--warehouse warehouse name + -z,--password database password ``` ## Commands -The following commands are available for entity management: +The following commands are used for entity management: - list: List available entities - details: Show detailed information about an entity - create: Create a new entity - delete: Delete an existing entity - update: Update an existing entity +- set: Set an entities property +- remove: Remove an entities property +- properties: Display an entities properties ### Setting the Metalake name -As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways. +As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways so that it doesn't need to passed on the command line. 1. Passed in on the command line via the `--metalake` parameter. 2. Set via the `GRAVITINO_METALAKE` environment variable. +3. Stored in the Gravitino CLI configuration file. The command line option overrides the environment variable. @@ -63,9 +76,31 @@ As you need to set the Gravitino URL for every command, you can set the URL in s 1. Passed in on the command line via the `--url` parameter. 2. Set via the 'GRAVITINO_URL' environment variable. +3. Stored in the Gravitino CLI configuration file. The command line option overrides the environment variable. +## Gravitino CLI configuration file + +The gravitino CLI can read commonly used CLI options from a configuration file. By default the file is `.gravitino` in the users home directory. The metalake, URL and ignore parameters can be set in this file. + +```text +# +# Gravitino CLI configuration file +# + +# Metalake to use +metalake=metalake_demo + +# Gravitino server to connect to +URL=http://localhost:8090 + +# Ignore client/server version mismatch +ignore=true + +``` + + ## Manage metadata All the commands are performed by using the [Java API](api/java-api) internally. @@ -96,9 +131,13 @@ gcli --server ### Client/server version mismatch -If the client and server are running different versions of the Gravitino software then you need an additional `--ignore` option for the command to run. +If the client and server are running different versions of the Gravitino software then you may need to ignore the client/server version check for the command to run. This can be done in several ways: + +1. Passed in on the command line via the `--ignore` parameter. +2. Set via the `GRAVITINO_IGNORE` environment variable. +3. Stored in the Gravitino CLI configuration file. -### Metalake +### Metalake commands #### Show all metalakes @@ -109,7 +148,49 @@ gcli metalake list #### Show a metalake details ```bash -gcli metalake details --metalake metalake_demo +gcli metalake details --metalake metalake_demo +``` + +#### Create a metalake + +```bash +gcli metalake create --metalake my_metalake --comment "This is my metalake" +``` + +#### Delete a metalake + +```bash +gcli metalake delete --metalake my_metalake +``` + +#### Rename a metalake + +```bash +gcli metalake update --metalake metalake_demo --rename demo +``` + +#### Update a metalake's comment + +```bash +gcli metalake update --metalake metalake_demo --comment "new comment" +``` + +#### Display a metalake's properties + +```bash +gcli metalake properties --metalake metalake_demo +``` + +#### Set a metalake's property + +```bash +gcli metalake set --metalake metalake_demo --property test --value value +``` + +#### Remove a metalake's property + +```bash +gcli metalake remove --metalake metalake_demo --property test ``` ### Catalog @@ -126,6 +207,77 @@ gcli catalog list --metalake metalake_demo gcli catalog details --metalake metalake_demo --name catalog_postgres ``` +#### Creating a catalog + +The type of catalog to be created is specified by the `--provider` option. Different catalogs require different options, for example a Hive catalog requires a metastore URI to be passed in as an option. + +##### Create a Hive catalog + +```bash +gcli catalog create --metalake metalake_demo --name hive --provider hive --metastore thrift://hive-host:9083 +``` + +##### Create an Iceberg catalog + +```bash +gcli catalog create --metalake metalake_demo --name iceberg --provider iceberg --metastore thrift://hive-host:9083 --warehouse hdfs://hdfs-host:9000/user/iceberg/warehouse +``` + +##### Create a MySQL catalog + +```bash +gcli catalog create --metalake metalake_demo --name mysql --provider mysql --jdbcurl "jdbc:mysql://mysql-host:3306?useSSL=false" --user user --password password +``` + +##### Create a Postgres catalog + +```bash +gcli catalog create --metalake metalake_demo --name postgres --provider postgres --jdbcurl jdbc:postgresql://postgresql-host/mydb --user user --password password -database db +``` + +##### Create a Kafka catalog + +```bash +gcli catalog create --metalake metalake_demo --name kafka --provider kafka --bootstrap 127.0.0.1:9092,127.0.0.2:9092 +``` + +#### Delete a catalog + +```bash +gcli catalog delete --metalake metalake_demo --name hive +``` + +#### Rename a catalog + +```bash +gcli catalog update --metalake metalake_demo --name catalog_mysql --rename mysql +``` + +#### Change a catalog comment + +```bash +gcli catalog update --metalake metalake_demo --name catalog_mysql --comment "new comment" +``` + + +#### Display a catalog's properties + +```bash +gcli catalog properties --metalake metalake_demo --name catalog_mysql +``` + +#### Set a catalog's property + +```bash +gcli catalog set --metalake metalake_demo --name catalog_mysql --property test --value value +``` + +#### Remove a catalog's property + +```bash +gcli catalog remove --metalake metalake_demo --name catalog_mysql --property test +``` + ### Schema #### Show all schemas in a catalog @@ -140,6 +292,21 @@ gcli schema list --metalake metalake_demo --name catalog_postgres gcli schema details --metalake metalake_demo --name catalog_postgres.hr ``` +#### Create a schema + +```bash +gcli schema create --metalake metalake_demo --name catalog_postgres.new_db +``` + +#### Display a schema properties + +```bash +gcli schema properties --metalake metalake_demo --name catalog_postgres.hr -i +``` + +Setting and removing schema properties is not currently supported by the Java API or the Gravitino CLI. + + ### Table #### Show all tables @@ -153,3 +320,10 @@ gcli table list --metalake metalake_demo --name catalog_postgres.hr ```bash gcli column list --metalake metalake_demo --name catalog_postgres.hr.departments ``` + +#### Delete a table + +```bash +gcli table delete --metalake metalake_demo --name catalog_postgres.hr.salaries +``` + From 74452c929143b3989ce79f2f7a9ee783e5a6cb55 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Fri, 25 Oct 2024 11:09:52 +1100 Subject: [PATCH 79/83] minor English updates --- docs/cli.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/docs/cli.md b/docs/cli.md index 11c6ca944a0..66525d8a810 100644 --- a/docs/cli.md +++ b/docs/cli.md @@ -10,7 +10,7 @@ license: 'This software is licensed under the Apache License version 2.' This document provides guidance on managing metadata within Apache Gravitino using the Command Line Interface (CLI). The CLI offers a terminal based alternative to using code or the REST interface for metadata management. -At present, the CLI allows users to view metadata information for metalakes, catalogs, schemas, and tables. Future updates will expand on these capabilities to include entities such as roles, users and tags. +Currently, the CLI allows users to view metadata information for metalakes, catalogs, schemas, and tables. Future updates will expand on these capabilities to include roles, users, and tags. ## Running the CLI @@ -62,7 +62,7 @@ The following commands are used for entity management: ### Setting the Metalake name -As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways so that it doesn't need to passed on the command line. +As dealing with one Metalake is a typical scenario, you can set the Metalake name in several ways so it doesn't need to be passed on the command line. 1. Passed in on the command line via the `--metalake` parameter. 2. Set via the `GRAVITINO_METALAKE` environment variable. @@ -82,7 +82,7 @@ The command line option overrides the environment variable. ## Gravitino CLI configuration file -The gravitino CLI can read commonly used CLI options from a configuration file. By default the file is `.gravitino` in the users home directory. The metalake, URL and ignore parameters can be set in this file. +The gravitino CLI can read commonly used CLI options from a configuration file. By default, the file is `.gravitino` in the user's home directory. The metalake, URL and ignore parameters can be set in this file. ```text # @@ -201,7 +201,7 @@ gcli metalake remove --metalake metalake_demo --property test gcli catalog list --metalake metalake_demo ``` -#### Show a catalogs details +#### Show a catalog details ```bash gcli catalog details --metalake metalake_demo --name catalog_postgres @@ -209,7 +209,7 @@ gcli catalog details --metalake metalake_demo --name catalog_postgres #### Creating a catalog -The type of catalog to be created is specified by the `--provider` option. Different catalogs require different options, for example a Hive catalog requires a metastore URI to be passed in as an option. +The type of catalog to be created is specified by the `--provider` option. Different catalogs require different options, for example, a Hive catalog requires a metastore URI to be passed in as an option. ##### Create a Hive catalog @@ -259,7 +259,6 @@ gcli catalog update --metalake metalake_demo --name catalog_mysql --rename mysql gcli catalog update --metalake metalake_demo --name catalog_mysql --comment "new comment" ``` - #### Display a catalog's properties ```bash @@ -286,7 +285,7 @@ gcli catalog remove --metalake metalake_demo --name catalog_mysql --property tes gcli schema list --metalake metalake_demo --name catalog_postgres ``` -#### Show a schema details +#### Show schema details ```bash gcli schema details --metalake metalake_demo --name catalog_postgres.hr @@ -298,7 +297,7 @@ gcli schema details --metalake metalake_demo --name catalog_postgres.hr gcli schema create --metalake metalake_demo --name catalog_postgres.new_db ``` -#### Display a schema properties +#### Display schema properties ```bash gcli schema properties --metalake metalake_demo --name catalog_postgres.hr -i @@ -306,7 +305,6 @@ gcli schema properties --metalake metalake_demo --name catalog_postgres.hr -i Setting and removing schema properties is not currently supported by the Java API or the Gravitino CLI. - ### Table #### Show all tables @@ -326,4 +324,3 @@ gcli column list --metalake metalake_demo --name catalog_postgres.hr.departments ```bash gcli table delete --metalake metalake_demo --name catalog_postgres.hr.salaries ``` - From 3d09940005cf959d7069994295eccf5cf8ce0556 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Mon, 28 Oct 2024 13:42:54 +1100 Subject: [PATCH 80/83] add entity and options --- .../main/java/org/apache/gravitino/cli/CommandEntities.java | 2 ++ .../main/java/org/apache/gravitino/cli/GravitinoOptions.java | 2 ++ .../java/org/apache/gravitino/cli/TestCommandEntities.java | 3 ++- 3 files changed, 6 insertions(+), 1 deletion(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java index 12d869c429c..0f826b4f8bd 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/CommandEntities.java @@ -34,6 +34,7 @@ public class CommandEntities { public static final String USER = "user"; public static final String GROUP = "group"; public static final String TAG = "tag"; + public static final String OWNER = "owner"; private static final HashSet VALID_ENTITIES = new HashSet<>(); @@ -46,6 +47,7 @@ public class CommandEntities { VALID_ENTITIES.add(USER); VALID_ENTITIES.add(GROUP); VALID_ENTITIES.add(TAG); + VALID_ENTITIES.add(OWNER); } /** diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index eba0e06750a..b9e1e22a9db 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -46,6 +46,7 @@ public class GravitinoOptions { public static final String BOOTSTRAP = "bootstrap"; public static final String GROUP = "group"; public static final String TAG = "tag"; + public static final String OWNER = "owner"; /** * Builds and returns the CLI options for Gravitino. @@ -81,6 +82,7 @@ public Options options() { options.addOption(createArgOption("d", DATABASE, "database name")); options.addOption(createArgOption("g", GROUP, "group name")); options.addOption(createArgOption("a", TAG, "tag name")); + options.addOption(createArgOption("o", OWNER, "owner name or group name")); return options; } diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java index cd2a55e2a3b..4ea4ee5fe84 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java @@ -37,7 +37,8 @@ public void validEntities() { CommandEntities.isValidEntity(CommandEntities.SCHEMA), "SCHEMA should be a valid entity"); assertTrue( CommandEntities.isValidEntity(CommandEntities.TABLE), "TABLE should be a valid entity"); - assertTrue(CommandEntities.isValidEntity(CommandEntities.TAG), "TAG should be a valid entity"); + assertTrue(CommandEntities.isValidEntity(CommandEntities.TAG), "TAG should be a valid entity"); + assertTrue(CommandEntities.isValidEntity(CommandEntities.OWNER), "OWNER should be a valid entity"); } @Test From 5c2e6c180a3817eaff0b9d9fd52d59d808ef3ca9 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Mon, 28 Oct 2024 17:01:12 +1100 Subject: [PATCH 81/83] set and display owners --- .../apache/gravitino/cli/ErrorMessages.java | 1 + .../gravitino/cli/GravitinoCommandLine.java | 32 ++++++++++++++++++- .../gravitino/cli/GravitinoOptions.java | 2 +- .../java/org/apache/gravitino/cli/Main.java | 2 +- .../gravitino/cli/TestCommandEntities.java | 5 +-- 5 files changed, 37 insertions(+), 5 deletions(-) diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java index 6a6d4e5bbe8..7cedd9436ca 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/ErrorMessages.java @@ -39,4 +39,5 @@ public class ErrorMessages { public static final String GROUP_EXISTS = "Group already exists."; public static final String UNKNOWN_TAG = "Unknown tag."; public static final String TAG_EXISTS = "Tag already exists."; + public static final String UNKNOWN_ROLE = "Unknown role."; } 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 2beec34b52e..fe5816e477a 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 @@ -57,6 +57,7 @@ import org.apache.gravitino.cli.commands.ListTagProperties; import org.apache.gravitino.cli.commands.ListUsers; import org.apache.gravitino.cli.commands.MetalakeDetails; +import org.apache.gravitino.cli.commands.OwnerDetails; import org.apache.gravitino.cli.commands.RemoveCatalogProperty; import org.apache.gravitino.cli.commands.RemoveMetalakeProperty; import org.apache.gravitino.cli.commands.RemoveSchemaProperty; @@ -65,6 +66,7 @@ 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.SetOwner; import org.apache.gravitino.cli.commands.SetSchemaProperty; import org.apache.gravitino.cli.commands.SetTagProperty; import org.apache.gravitino.cli.commands.TableDetails; @@ -165,7 +167,9 @@ public static void displayHelp(Options options) { /** Executes the appropriate command based on the command type. */ private void executeCommand() { - if (entity.equals(CommandEntities.COLUMN)) { + if (line.hasOption(GravitinoOptions.OWNER)) { + handleOwnerCommand(); + } else if (entity.equals(CommandEntities.COLUMN)) { handleColumnCommand(); } else if (entity.equals(CommandEntities.TABLE)) { handleTableCommand(); @@ -175,6 +179,10 @@ private void executeCommand() { handleCatalogCommand(); } else if (entity.equals(CommandEntities.METALAKE)) { handleMetalakeCommand(); + } else if (entity.equals(CommandEntities.USER)) { + handleUserCommand(); + } else if (entity.equals(CommandEntities.GROUP)) { + handleGroupCommand(); } } @@ -454,6 +462,28 @@ private void handleColumnCommand() { } } + /** + * Handles the command execution for Objects based on command type and the command line options. + */ + private void handleOwnerCommand() { + String url = getUrl(); + FullName name = new FullName(line); + String metalake = name.getMetalakeName(); + String entityName = line.getOptionValue(GravitinoOptions.NAME); + + if (CommandActions.DETAILS.equals(command)) { + new OwnerDetails(url, ignore, metalake, entityName, entity).handle(); + } else if (CommandActions.UPDATE.equals(command)) { + String owner = line.getOptionValue(GravitinoOptions.USER); + String group = line.getOptionValue(GravitinoOptions.GROUP); + if (owner != null) { + new SetOwner(url, ignore, metalake, entityName, entity, owner, false).handle(); + } else if (group != null) { + new SetOwner(url, ignore, metalake, entityName, entity, owner, true).handle(); + } + } + } + /** * Retrieves the Gravitinno URL from the command line options or the GRAVITINO_URL environment * variable or the Gravitio config file. diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java index b9e1e22a9db..9650e29649f 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/GravitinoOptions.java @@ -82,7 +82,7 @@ public Options options() { options.addOption(createArgOption("d", DATABASE, "database name")); options.addOption(createArgOption("g", GROUP, "group name")); options.addOption(createArgOption("a", TAG, "tag name")); - options.addOption(createArgOption("o", OWNER, "owner name or group name")); + options.addOption(createSimpleOption("o", OWNER, "display entity owner")); return options; } diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java index 0d0eaddf752..e81362b20d6 100644 --- a/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/Main.java @@ -25,7 +25,7 @@ import org.apache.commons.cli.Options; import org.apache.commons.cli.ParseException; -/* Entry point for teh Gravitino command line. */ +/* Entry point for the Gravitino command line. */ public class Main { public static void main(String[] args) { diff --git a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java index 4ea4ee5fe84..d980063ff5d 100644 --- a/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java +++ b/clients/cli/src/test/java/org/apache/gravitino/cli/TestCommandEntities.java @@ -37,8 +37,9 @@ public void validEntities() { CommandEntities.isValidEntity(CommandEntities.SCHEMA), "SCHEMA should be a valid entity"); assertTrue( CommandEntities.isValidEntity(CommandEntities.TABLE), "TABLE should be a valid entity"); - assertTrue(CommandEntities.isValidEntity(CommandEntities.TAG), "TAG should be a valid entity"); - assertTrue(CommandEntities.isValidEntity(CommandEntities.OWNER), "OWNER should be a valid entity"); + assertTrue(CommandEntities.isValidEntity(CommandEntities.TAG), "TAG should be a valid entity"); + assertTrue( + CommandEntities.isValidEntity(CommandEntities.OWNER), "OWNER should be a valid entity"); } @Test From 2130aa51fdb22d2df7897e085768cb3ed05bf08a Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Mon, 28 Oct 2024 17:15:38 +1100 Subject: [PATCH 82/83] fix group owner command --- .../java/org/apache/gravitino/cli/GravitinoCommandLine.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 fe5816e477a..41e94f65e40 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 @@ -479,7 +479,7 @@ private void handleOwnerCommand() { if (owner != null) { new SetOwner(url, ignore, metalake, entityName, entity, owner, false).handle(); } else if (group != null) { - new SetOwner(url, ignore, metalake, entityName, entity, owner, true).handle(); + new SetOwner(url, ignore, metalake, entityName, entity, group, true).handle(); } } } From 46b71474b20a49390e63f4f0dfbc5c5e09fe0f69 Mon Sep 17 00:00:00 2001 From: Justin Mclean Date: Mon, 28 Oct 2024 17:48:15 +1100 Subject: [PATCH 83/83] add right files --- .../gravitino/cli/commands/OwnerDetails.java | 93 ++++++++++++++++ .../gravitino/cli/commands/SetOwner.java | 100 ++++++++++++++++++ 2 files changed, 193 insertions(+) create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/OwnerDetails.java create mode 100644 clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetOwner.java diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/OwnerDetails.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/OwnerDetails.java new file mode 100644 index 00000000000..ece8cfd628f --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/OwnerDetails.java @@ -0,0 +1,93 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import java.util.Optional; +import org.apache.gravitino.MetadataObject; +import org.apache.gravitino.MetadataObjects; +import org.apache.gravitino.authorization.Owner; +import org.apache.gravitino.cli.CommandEntities; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetadataObjectException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +public class OwnerDetails extends Command { + + protected final String metalake; + protected final String entity; + protected final MetadataObject.Type entityType; + + /** + * Displays the owner of an entity. + * + * @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 entity The name of the entity. + * @param entityType The type entity. + */ + public OwnerDetails( + String url, boolean ignoreVersions, String metalake, String entity, String entityType) { + super(url, ignoreVersions); + this.metalake = metalake; + this.entity = entity; + + if (entityType.equals(CommandEntities.METALAKE)) { + this.entityType = MetadataObject.Type.METALAKE; + } else if (entityType.equals(CommandEntities.CATALOG)) { + this.entityType = MetadataObject.Type.CATALOG; + } else if (entityType.equals(CommandEntities.SCHEMA)) { + this.entityType = MetadataObject.Type.SCHEMA; + } else if (entityType.equals(CommandEntities.TABLE)) { + this.entityType = MetadataObject.Type.TABLE; + } else if (entityType.equals(CommandEntities.COLUMN)) { + this.entityType = MetadataObject.Type.COLUMN; + } else { + this.entityType = null; + } + } + + /** Displays the owner of an entity. */ + public void handle() { + Optional owner = null; + MetadataObject metadata = MetadataObjects.parse(entity, entityType); + + try { + GravitinoClient client = buildClient(metalake); + owner = client.getOwner(metadata); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchMetadataObjectException err) { + System.err.println(ErrorMessages.UNKNOWN_ENTITY); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + if (owner.isPresent()) { + System.out.println(owner.get().name()); + } else { + System.out.println("No owner"); + } + } +} diff --git a/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetOwner.java b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetOwner.java new file mode 100644 index 00000000000..6d113467812 --- /dev/null +++ b/clients/cli/src/main/java/org/apache/gravitino/cli/commands/SetOwner.java @@ -0,0 +1,100 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.gravitino.cli.commands; + +import org.apache.gravitino.MetadataObject; +import org.apache.gravitino.MetadataObjects; +import org.apache.gravitino.authorization.Owner; +import org.apache.gravitino.cli.CommandEntities; +import org.apache.gravitino.cli.ErrorMessages; +import org.apache.gravitino.client.GravitinoClient; +import org.apache.gravitino.exceptions.NoSuchMetadataObjectException; +import org.apache.gravitino.exceptions.NoSuchMetalakeException; + +public class SetOwner extends Command { + + protected final String metalake; + protected final String entity; + protected final MetadataObject.Type entityType; + protected final String owner; + protected final boolean isGroup; + + /** + * Sets the owner of an entity. + * + * @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 entity The name of the entity. + * @param entityType The type entity. + * @param owner The name of the new owner. + * @param isGroup True if the owner is a group, false if it is not. + */ + public SetOwner( + String url, + boolean ignoreVersions, + String metalake, + String entity, + String entityType, + String owner, + boolean isGroup) { + super(url, ignoreVersions); + this.metalake = metalake; + this.entity = entity; + this.owner = owner; + this.isGroup = isGroup; + + if (entityType.equals(CommandEntities.METALAKE)) { + this.entityType = MetadataObject.Type.METALAKE; + } else if (entityType.equals(CommandEntities.CATALOG)) { + this.entityType = MetadataObject.Type.CATALOG; + } else if (entityType.equals(CommandEntities.SCHEMA)) { + this.entityType = MetadataObject.Type.SCHEMA; + } else if (entityType.equals(CommandEntities.TABLE)) { + this.entityType = MetadataObject.Type.TABLE; + } else if (entityType.equals(CommandEntities.COLUMN)) { + this.entityType = MetadataObject.Type.COLUMN; + } else { + this.entityType = null; + } + } + + /** Sets the owner of an entity. */ + public void handle() { + MetadataObject metadata = MetadataObjects.parse(entity, entityType); + Owner.Type ownerType = isGroup ? Owner.Type.GROUP : Owner.Type.USER; + + try { + GravitinoClient client = buildClient(metalake); + client.setOwner(metadata, owner, ownerType); + } catch (NoSuchMetalakeException err) { + System.err.println(ErrorMessages.UNKNOWN_METALAKE); + return; + } catch (NoSuchMetadataObjectException err) { + System.err.println(ErrorMessages.UNKNOWN_ENTITY); + return; + } catch (Exception exp) { + System.err.println(exp.getMessage()); + return; + } + + System.out.println("Set owner to " + owner); + } +}