This is an automated email from the ASF dual-hosted git repository. apkhmv pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/ignite-3.git
The following commit(s) were added to refs/heads/main by this push: new 5346cd0408 IGNITE-19036 Add cli config remove command (#1961) 5346cd0408 is described below commit 5346cd0408b148ace772eb2843552d75c0cb8d8c Author: Vadim Pakhnushev <8614891+valep...@users.noreply.github.com> AuthorDate: Fri Apr 21 17:02:34 2023 +0300 IGNITE-19036 Add cli config remove command (#1961) --- .../cli/call/cliconfig/CliConfigGetCall.java | 8 ++- ...ConfigGetCall.java => CliConfigRemoveCall.java} | 17 +++--- .../call/cliconfig/CliConfigRemoveCallInput.java | 64 ++++++++++++++++++++++ .../cli/commands/cliconfig/CliConfigCommand.java | 1 + .../commands/cliconfig/CliConfigRemoveCommand.java | 55 +++++++++++++++++++ .../cliconfig/CliConfigRemoveReplCommand.java | 49 +++++++++++++++++ .../commands/cliconfig/CliConfigReplCommand.java | 1 + .../apache/ignite/internal/cli/config/Config.java | 10 +++- .../ignite/internal/cli/config/ConfigManager.java | 4 ++ .../apache/ignite/internal/cli/config/Profile.java | 20 +++++-- .../ignite/internal/cli/config/StateConfig.java | 1 + .../ConfigInitializationException.java | 2 +- .../{ => exception}/ConfigStoringException.java | 2 +- .../NonexistentPropertyException.java} | 12 ++-- .../{ => exception}/ProfileNotFoundException.java | 2 +- .../ignite/internal/cli/config/ini/IniConfig.java | 7 +++ .../internal/cli/config/ini/IniConfigManager.java | 4 +- .../ignite/internal/cli/config/ini/IniFile.java | 2 +- .../ignite/internal/cli/config/ini/IniProfile.java | 27 ++++----- .../ignite/internal/cli/config/ini/IniSection.java | 4 ++ .../handler/ConfigStoringExceptionHandler.java | 2 +- .../handler/ProfileNotFoundExceptionHandler.java | 2 +- .../completer/DynamicCompleterActivationPoint.java | 1 + .../cliconfig/CliConfigGetCommandTest.java | 8 +-- .../CliConfigProfileCreateCommandTest.java | 2 +- ...ndTest.java => CliConfigRemoveCommandTest.java} | 47 ++++++++++------ .../cli/commands/cliconfig/ConfigManagerTest.java | 12 ++++ 27 files changed, 298 insertions(+), 68 deletions(-) diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigGetCall.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigGetCall.java index e64960df1d..d6356f3db1 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigGetCall.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigGetCall.java @@ -21,6 +21,7 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; import org.apache.ignite.internal.cli.config.ConfigManager; import org.apache.ignite.internal.cli.config.ConfigManagerProvider; +import org.apache.ignite.internal.cli.config.exception.NonexistentPropertyException; import org.apache.ignite.internal.cli.core.call.Call; import org.apache.ignite.internal.cli.core.call.DefaultCallOutput; @@ -37,7 +38,10 @@ public class CliConfigGetCall implements Call<CliConfigGetCallInput, String> { ConfigManager configManager = configManagerProvider.get(); String key = input.getKey(); String profileName = input.getProfileName(); - String property = configManager.getProperty(key, profileName, ""); - return DefaultCallOutput.success(property); + String property = configManager.getProperty(key, profileName); + if (property != null) { + return DefaultCallOutput.success(property); + } + return DefaultCallOutput.failure(new NonexistentPropertyException(key)); } } diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigGetCall.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigRemoveCall.java similarity index 69% copy from modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigGetCall.java copy to modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigRemoveCall.java index e64960df1d..d03c7aedeb 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigGetCall.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigRemoveCall.java @@ -21,23 +21,26 @@ import jakarta.inject.Inject; import jakarta.inject.Singleton; import org.apache.ignite.internal.cli.config.ConfigManager; import org.apache.ignite.internal.cli.config.ConfigManagerProvider; +import org.apache.ignite.internal.cli.config.exception.NonexistentPropertyException; import org.apache.ignite.internal.cli.core.call.Call; import org.apache.ignite.internal.cli.core.call.DefaultCallOutput; /** - * Gets CLI configuration parameter. + * Removes CLI configuration parameter. */ @Singleton -public class CliConfigGetCall implements Call<CliConfigGetCallInput, String> { +public class CliConfigRemoveCall implements Call<CliConfigRemoveCallInput, String> { @Inject private ConfigManagerProvider configManagerProvider; @Override - public DefaultCallOutput<String> execute(CliConfigGetCallInput input) { + public DefaultCallOutput<String> execute(CliConfigRemoveCallInput input) { ConfigManager configManager = configManagerProvider.get(); - String key = input.getKey(); - String profileName = input.getProfileName(); - String property = configManager.getProperty(key, profileName, ""); - return DefaultCallOutput.success(property); + String key = input.key(); + String profileName = input.profileName(); + if (configManager.removeProperty(key, profileName) != null) { + return DefaultCallOutput.empty(); + } + return DefaultCallOutput.failure(new NonexistentPropertyException(key)); } } diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigRemoveCallInput.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigRemoveCallInput.java new file mode 100644 index 0000000000..a820020820 --- /dev/null +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/call/cliconfig/CliConfigRemoveCallInput.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.ignite.internal.cli.call.cliconfig; + +import org.apache.ignite.internal.cli.core.call.CallInput; + +/** Input for {@link CliConfigRemoveCall}. */ +public class CliConfigRemoveCallInput implements CallInput { + private final String key; + + private final String profileName; + + private CliConfigRemoveCallInput(String key, String profileName) { + this.key = key; + this.profileName = profileName; + } + + public static Builder builder() { + return new Builder(); + } + + public String key() { + return key; + } + + public String profileName() { + return profileName; + } + + /** Builder of {@link CliConfigRemoveCallInput}. */ + public static class Builder { + private String key; + private String profileName; + + public Builder key(String key) { + this.key = key; + return this; + } + + public Builder profileName(String profileName) { + this.profileName = profileName; + return this; + } + + public CliConfigRemoveCallInput build() { + return new CliConfigRemoveCallInput(key, profileName); + } + } +} diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigCommand.java index c62cf0c54e..a4f7216bda 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigCommand.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigCommand.java @@ -29,6 +29,7 @@ import picocli.CommandLine.Command; subcommands = { CliConfigGetCommand.class, CliConfigSetCommand.class, + CliConfigRemoveCommand.class, CliConfigShowCommand.class, CliConfigProfileCommand.class, }) diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveCommand.java new file mode 100644 index 0000000000..01c6fda5f8 --- /dev/null +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveCommand.java @@ -0,0 +1,55 @@ +/* + * 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.ignite.internal.cli.commands.cliconfig; + +import jakarta.inject.Inject; +import java.util.concurrent.Callable; +import org.apache.ignite.internal.cli.call.cliconfig.CliConfigRemoveCall; +import org.apache.ignite.internal.cli.call.cliconfig.CliConfigRemoveCallInput; +import org.apache.ignite.internal.cli.commands.BaseCommand; +import org.apache.ignite.internal.cli.commands.ProfileMixin; +import org.apache.ignite.internal.cli.core.call.CallExecutionPipeline; +import picocli.CommandLine.Command; +import picocli.CommandLine.Mixin; +import picocli.CommandLine.Parameters; + +/** Command to remove CLI configuration parameters. */ +@Command(name = "remove", description = "Removes configuration parameters") +public class CliConfigRemoveCommand extends BaseCommand implements Callable<Integer> { + @Parameters(description = "Property name") + private String key; + + @Mixin + private ProfileMixin profileName; + + @Inject + private CliConfigRemoveCall call; + + @Override + public Integer call() { + return CallExecutionPipeline.builder(call) + .inputProvider(CliConfigRemoveCallInput.builder() + .key(key) + .profileName(profileName.getProfileName())::build) + .output(spec.commandLine().getOut()) + .errOutput(spec.commandLine().getErr()) + .verbose(verbose) + .build() + .runPipeline(); + } +} diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveReplCommand.java new file mode 100644 index 0000000000..7fc6f96463 --- /dev/null +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveReplCommand.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.ignite.internal.cli.commands.cliconfig; + +import jakarta.inject.Inject; +import java.util.concurrent.Callable; +import org.apache.ignite.internal.cli.call.cliconfig.CliConfigRemoveCall; +import org.apache.ignite.internal.cli.call.cliconfig.CliConfigRemoveCallInput; +import org.apache.ignite.internal.cli.commands.BaseCommand; +import org.apache.ignite.internal.cli.core.call.CallExecutionPipeline; +import picocli.CommandLine.Command; +import picocli.CommandLine.Parameters; + +/** Command to remove CLI configuration parameters in REPL mode. */ +@Command(name = "remove", description = "Removes configuration parameters") +public class CliConfigRemoveReplCommand extends BaseCommand implements Callable<Integer> { + @Parameters(description = "Property name") + private String key; + + @Inject + private CliConfigRemoveCall call; + + @Override + public Integer call() { + return CallExecutionPipeline.builder(call) + .inputProvider(CliConfigRemoveCallInput.builder() + .key(key)::build) + .output(spec.commandLine().getOut()) + .errOutput(spec.commandLine().getErr()) + .verbose(verbose) + .build() + .runPipeline(); + } +} diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigReplCommand.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigReplCommand.java index cd41593cbe..747d0bdb25 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigReplCommand.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigReplCommand.java @@ -29,6 +29,7 @@ import picocli.CommandLine.Command; subcommands = { CliConfigGetReplCommand.class, CliConfigSetReplCommand.class, + CliConfigRemoveReplCommand.class, CliConfigShowReplCommand.class, CliConfigProfileCommand.class, }) diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Config.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Config.java index 2faaac2717..8b99f10c95 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Config.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Config.java @@ -57,7 +57,15 @@ public interface Config { void setProperty(String key, String value); /** - * Sets properties to this profile. + * Removes a property. + * + * @param key property to remove + * @return removed property, or {@code null} if there was no such property. + */ + String removeProperty(String key); + + /** + * Sets properties. * * @param values map of properties to set */ diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigManager.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigManager.java index 5e3e2c8468..eb1cddfe92 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigManager.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigManager.java @@ -49,6 +49,10 @@ public interface ConfigManager { return getConfig(profileName).getProperty(key, defaultValue); } + default String removeProperty(String key, String profileName) { + return getConfig(profileName).removeProperty(key); + } + private Profile getConfig(String profileName) { return profileName == null ? getCurrentProfile() : getProfile(profileName); } diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Profile.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Profile.java index 179427100d..b6e080323e 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Profile.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/Profile.java @@ -24,21 +24,21 @@ import java.util.Map; */ public interface Profile { /** - * Gets name of the profile. + * Gets name. * * @return profile name */ String getName(); /** - * Convenience method to get all properties from this profile. + * Gets all properties. * * @return map of all properties */ Map<String, String> getAll(); /** - * Convenience method to get a property from this profile. + * Gets a property. * * @param key property to get * @return property value or {@code null} if config doesn't contain this property @@ -46,7 +46,7 @@ public interface Profile { String getProperty(String key); /** - * Convenience method to get a property from this profile. + * Gets a property. * * @param key property to get * @param defaultValue default value of the property @@ -56,7 +56,7 @@ public interface Profile { String getProperty(String key, String defaultValue); /** - * Convenience method to set a property to this profile. + * Sets a property. * * @param key property to set * @param value value to set @@ -64,7 +64,15 @@ public interface Profile { void setProperty(String key, String value); /** - * Convenience method to set properties to this profile. + * Removes a property. + * + * @param key property to remove + * @return removed property, or {@code null} if there was no such property. + */ + String removeProperty(String key); + + /** + * Set properties. * * @param values map of properties to set */ diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/StateConfig.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/StateConfig.java index 6dc1c42d6e..426c3c5c75 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/StateConfig.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/StateConfig.java @@ -19,6 +19,7 @@ package org.apache.ignite.internal.cli.config; import java.io.File; import java.io.IOException; +import org.apache.ignite.internal.cli.config.exception.ConfigInitializationException; import org.apache.ignite.internal.cli.config.ini.IniConfig; import org.apache.ignite.internal.cli.config.ini.IniFile; diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigInitializationException.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ConfigInitializationException.java similarity index 95% rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigInitializationException.java rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ConfigInitializationException.java index 17e0bb3624..4f1830e78c 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigInitializationException.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ConfigInitializationException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.ignite.internal.cli.config; +package org.apache.ignite.internal.cli.config.exception; /** * Config initialization exception. diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigStoringException.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ConfigStoringException.java similarity index 95% rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigStoringException.java rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ConfigStoringException.java index 577b21a92b..336ab05822 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ConfigStoringException.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ConfigStoringException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.ignite.internal.cli.config; +package org.apache.ignite.internal.cli.config.exception; /** * Exception for case when config not stored correctly. diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ProfileNotFoundException.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/NonexistentPropertyException.java similarity index 74% copy from modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ProfileNotFoundException.java copy to modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/NonexistentPropertyException.java index b879c4b625..a4245b0d7b 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ProfileNotFoundException.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/NonexistentPropertyException.java @@ -15,13 +15,11 @@ * limitations under the License. */ -package org.apache.ignite.internal.cli.config; +package org.apache.ignite.internal.cli.config.exception; -/** - * CLI profile not found. - */ -public class ProfileNotFoundException extends RuntimeException { - public ProfileNotFoundException(String profileName) { - super("Profile " + profileName + " not found."); +/** CLI config property not found. */ +public class NonexistentPropertyException extends RuntimeException { + public NonexistentPropertyException(String property) { + super("Property " + property + " doesn't exist."); } } diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ProfileNotFoundException.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ProfileNotFoundException.java similarity index 94% rename from modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ProfileNotFoundException.java rename to modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ProfileNotFoundException.java index b879c4b625..c3a2a99b4a 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ProfileNotFoundException.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/exception/ProfileNotFoundException.java @@ -15,7 +15,7 @@ * limitations under the License. */ -package org.apache.ignite.internal.cli.config; +package org.apache.ignite.internal.cli.config.exception; /** * CLI profile not found. diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfig.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfig.java index 7b4e57af34..db65370388 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfig.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfig.java @@ -57,6 +57,13 @@ public class IniConfig implements Config { saveAction.run(); } + @Override + public String removeProperty(String key) { + String removedProperty = section.removeProperty(key); + saveAction.run(); + return removedProperty; + } + /** {@inheritDoc} */ @Override public void setProperties(Map<String, String> values) { diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java index 9bf32d8fe1..03ab1b867f 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniConfigManager.java @@ -40,10 +40,10 @@ import java.nio.file.attribute.PosixFilePermissions; import java.util.Collection; import java.util.NoSuchElementException; import java.util.Set; -import org.apache.ignite.internal.cli.config.ConfigInitializationException; import org.apache.ignite.internal.cli.config.ConfigManager; import org.apache.ignite.internal.cli.config.Profile; -import org.apache.ignite.internal.cli.config.ProfileNotFoundException; +import org.apache.ignite.internal.cli.config.exception.ConfigInitializationException; +import org.apache.ignite.internal.cli.config.exception.ProfileNotFoundException; import org.apache.ignite.internal.cli.core.exception.IgniteCliException; import org.apache.ignite.internal.cli.logger.CliLoggers; import org.apache.ignite.internal.cli.util.OperatingSystem; diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniFile.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniFile.java index aa95e41fea..c34b0aacc3 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniFile.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniFile.java @@ -26,7 +26,7 @@ import java.io.OutputStreamWriter; import java.nio.charset.StandardCharsets; import java.util.Collection; import java.util.Map; -import org.apache.ignite.internal.cli.config.ConfigStoringException; +import org.apache.ignite.internal.cli.config.exception.ConfigStoringException; /** * Representation of INI file. diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniProfile.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniProfile.java index 0cabe5e53e..7e3f641a7b 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniProfile.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniProfile.java @@ -62,31 +62,24 @@ public class IniProfile implements Profile { /** {@inheritDoc} */ @Override public String getProperty(String key) { - if (CliConfigKeys.secretConfigKeys().contains(key)) { - return secretConfig.getProperty(key); - } else { - return config.getProperty(key); - } + return getConfig(key).getProperty(key); } /** {@inheritDoc} */ @Override public String getProperty(String key, String defaultValue) { - if (CliConfigKeys.secretConfigKeys().contains(key)) { - return secretConfig.getProperty(key, defaultValue); - } else { - return config.getProperty(key, defaultValue); - } + return getConfig(key).getProperty(key, defaultValue); } /** {@inheritDoc} */ @Override public void setProperty(String key, String value) { - if (CliConfigKeys.secretConfigKeys().contains(key)) { - secretConfig.setProperty(key, value); - } else { - config.setProperty(key, value); - } + getConfig(key).setProperty(key, value); + } + + @Override + public String removeProperty(String key) { + return getConfig(key).removeProperty(key); } /** {@inheritDoc} */ @@ -106,4 +99,8 @@ public class IniProfile implements Profile { secretConfig.setProperties(secretConfigValues); } } + + private IniConfig getConfig(String key) { + return CliConfigKeys.secretConfigKeys().contains(key) ? secretConfig : config; + } } diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniSection.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniSection.java index b9ce806372..03b5c8384e 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniSection.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/config/ini/IniSection.java @@ -52,6 +52,10 @@ public class IniSection { props.put(key, value); } + public String removeProperty(String key) { + return props.remove(key); + } + public void setProperties(Map<String, String> values) { props.putAll(values); } diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ConfigStoringExceptionHandler.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ConfigStoringExceptionHandler.java index 4fa2dc2593..1d337158da 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ConfigStoringExceptionHandler.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ConfigStoringExceptionHandler.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.cli.core.exception.handler; -import org.apache.ignite.internal.cli.config.ConfigStoringException; +import org.apache.ignite.internal.cli.config.exception.ConfigStoringException; import org.apache.ignite.internal.cli.core.exception.ExceptionHandler; import org.apache.ignite.internal.cli.core.exception.ExceptionWriter; import org.apache.ignite.internal.cli.core.style.component.ErrorUiComponent; diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ProfileNotFoundExceptionHandler.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ProfileNotFoundExceptionHandler.java index 8df2a84227..f58faa62df 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ProfileNotFoundExceptionHandler.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/exception/handler/ProfileNotFoundExceptionHandler.java @@ -17,7 +17,7 @@ package org.apache.ignite.internal.cli.core.exception.handler; -import org.apache.ignite.internal.cli.config.ProfileNotFoundException; +import org.apache.ignite.internal.cli.config.exception.ProfileNotFoundException; import org.apache.ignite.internal.cli.core.exception.ExceptionHandler; import org.apache.ignite.internal.cli.core.exception.ExceptionWriter; import org.apache.ignite.internal.cli.core.style.component.ErrorUiComponent; diff --git a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/completer/DynamicCompleterActivationPoint.java b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/completer/DynamicCompleterActivationPoint.java index 3f8792b3bb..596fa2f545 100644 --- a/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/completer/DynamicCompleterActivationPoint.java +++ b/modules/cli/src/main/java/org/apache/ignite/internal/cli/core/repl/completer/DynamicCompleterActivationPoint.java @@ -139,6 +139,7 @@ public class DynamicCompleterActivationPoint { CompleterConf.builder() .command("cli", "config", "set") .command("cli", "config", "get") + .command("cli", "config", "remove") .singlePositionalParameter() .build(), cliConfigDynamicCompleterFactory diff --git a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommandTest.java b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommandTest.java index 2625537b3c..d0054f2cf6 100644 --- a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommandTest.java +++ b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommandTest.java @@ -55,15 +55,15 @@ class CliConfigGetCommandTest extends CliConfigCommandTestBase { } @Test - @DisplayName("Displays empty string for nonexistent key") + @DisplayName("Displays error for nonexistent key") void nonexistentKey() { // When executed with nonexistent key execute("nonexistentKey"); assertAll( - this::assertExitCodeIsZero, - () -> assertOutputIs(System.lineSeparator()), - this::assertErrOutputIsEmpty + () -> assertExitCodeIs(1), + this::assertOutputIsEmpty, + () -> assertErrOutputContains("Property nonexistentKey doesn't exist") ); } diff --git a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigProfileCreateCommandTest.java b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigProfileCreateCommandTest.java index c42426115a..93e4c75cd7 100644 --- a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigProfileCreateCommandTest.java +++ b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigProfileCreateCommandTest.java @@ -22,7 +22,7 @@ import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; import org.apache.ignite.internal.cli.commands.cliconfig.profile.CliConfigProfileCreateCommand; -import org.apache.ignite.internal.cli.config.ProfileNotFoundException; +import org.apache.ignite.internal.cli.config.exception.ProfileNotFoundException; import org.junit.jupiter.api.Test; class CliConfigProfileCreateCommandTest extends CliConfigCommandTestBase { diff --git a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommandTest.java b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveCommandTest.java similarity index 62% copy from modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommandTest.java copy to modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveCommandTest.java index 2625537b3c..04c4ab9ef2 100644 --- a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigGetCommandTest.java +++ b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/CliConfigRemoveCommandTest.java @@ -17,15 +17,17 @@ package org.apache.ignite.internal.cli.commands.cliconfig; +import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; +import org.apache.ignite.internal.cli.config.ConfigManager; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; -class CliConfigGetCommandTest extends CliConfigCommandTestBase { +class CliConfigRemoveCommandTest extends CliConfigCommandTestBase { @Override protected Class<?> getCommandClass() { - return CliConfigGetCommand.class; + return CliConfigRemoveCommand.class; } @Test @@ -42,28 +44,29 @@ class CliConfigGetCommandTest extends CliConfigCommandTestBase { } @Test - @DisplayName("Displays value for specified key") + @DisplayName("Removes a value") void singleKey() { - // When executed with single key + // When executed with key execute("server"); assertAll( this::assertExitCodeIsZero, - () -> assertOutputIs("127.0.0.1" + System.lineSeparator()), - this::assertErrOutputIsEmpty + this::assertOutputIsEmpty, + this::assertErrOutputIsEmpty, + () -> assertThat(configManagerProvider.get().getCurrentProperty("server")).isNull() ); } @Test - @DisplayName("Displays empty string for nonexistent key") + @DisplayName("Displays error for nonexistent key") void nonexistentKey() { // When executed with nonexistent key execute("nonexistentKey"); assertAll( - this::assertExitCodeIsZero, - () -> assertOutputIs(System.lineSeparator()), - this::assertErrOutputIsEmpty + () -> assertExitCodeIs(1), + this::assertOutputIsEmpty, + () -> assertErrOutputContains("Property nonexistentKey doesn't exist") ); } @@ -81,23 +84,33 @@ class CliConfigGetCommandTest extends CliConfigCommandTestBase { } @Test - public void testWithNonDefaultProfile() { - execute("organization --profile owner"); + @DisplayName("Remove with profile") + public void testWithProfile() { + // When executed with multiple keys + execute("name --profile owner"); + + ConfigManager configManager = configManagerProvider.get(); assertAll( + this::assertExitCodeIsZero, + this::assertOutputIsEmpty, this::assertErrOutputIsEmpty, - () -> assertOutputContains("Apache Ignite") + () -> assertThat(configManager.getProfile("owner").getProperty("name")).isNull() ); - } @Test - public void testWithNonNotExistedProfile() { - execute("organization --profile notExist"); + @DisplayName("Displays error for nonexistent profile") + public void testWithNonexistentProfile() { + execute("server --profile notExist"); + + ConfigManager configManager = configManagerProvider.get(); assertAll( + () -> assertExitCodeIs(1), this::assertOutputIsEmpty, - () -> assertErrOutputContains("Profile notExist not found.") + () -> assertErrOutputContains("Profile notExist not found"), + () -> assertThat(configManager.getCurrentProperty("server")).isEqualTo("127.0.0.1") ); } } diff --git a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/ConfigManagerTest.java b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/ConfigManagerTest.java index 99a3050cbb..5b52a24758 100644 --- a/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/ConfigManagerTest.java +++ b/modules/cli/src/test/java/org/apache/ignite/internal/cli/commands/cliconfig/ConfigManagerTest.java @@ -75,4 +75,16 @@ class ConfigManagerTest { assertThat(configManager.getCurrentProfile().getProperty("test")).isEqualTo("testValue"); assertThat(configManager.getCurrentProfile().getName()).isEqualTo("database"); } + + @Test + public void testRemoveProperty() { + File tempFile = TestConfigManagerHelper.createSectionWithDefaultProfile(); + File tempSecretFile = TestConfigManagerHelper.createEmptySecretConfig(); + IniConfigManager configManager = new IniConfigManager(tempFile, tempSecretFile); + + assertThat(configManager.removeProperty("server", configManager.getCurrentProfile().getName())).isEqualTo("127.0.0.1"); + + assertThat(tempFile.exists()).isTrue(); + assertThat(configManager.getCurrentProfile().getProperty("server")).isNull(); + } }