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();
+    }
 }


Reply via email to