This is an automated email from the ASF dual-hosted git repository.
sodonnell pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 5da02baad5 HDDS-10139. Support to get hosts from stdin when DN is
decommissioning, recommissioning or entering maintenance. (#6019)
5da02baad5 is described below
commit 5da02baad5cfc0368d6eeed96a726eee2ff0e9de
Author: WangYuanben <[email protected]>
AuthorDate: Fri Jan 19 18:33:31 2024 +0800
HDDS-10139. Support to get hosts from stdin when DN is decommissioning,
recommissioning or entering maintenance. (#6019)
---
.../scm/cli/datanode/DecommissionSubCommand.java | 21 +++++++++++--
.../scm/cli/datanode/MaintenanceSubCommand.java | 21 +++++++++++--
.../scm/cli/datanode/RecommissionSubCommand.java | 21 +++++++++++--
.../cli/datanode/TestDecommissionSubCommand.java | 34 ++++++++++++++++++++--
.../cli/datanode/TestMaintenanceSubCommand.java | 34 ++++++++++++++++++++--
.../cli/datanode/TestRecommissionSubCommand.java | 34 ++++++++++++++++++++--
6 files changed, 150 insertions(+), 15 deletions(-)
diff --git
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DecommissionSubCommand.java
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DecommissionSubCommand.java
index 23ff9176df..e7d3a44438 100644
---
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DecommissionSubCommand.java
+++
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/DecommissionSubCommand.java
@@ -27,6 +27,7 @@ import picocli.CommandLine.Command;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Scanner;
/**
* Decommission one or more datanodes.
@@ -41,12 +42,26 @@ public class DecommissionSubCommand extends ScmSubcommand {
@CommandLine.Spec
private CommandLine.Model.CommandSpec spec;
- @CommandLine.Parameters(description = "List of fully qualified host names")
- private List<String> hosts = new ArrayList<>();
+ @CommandLine.Parameters(description = "One or more host names separated by
spaces. " +
+ "To read from stdin, specify '-' and supply the host names " +
+ "separated by newlines.",
+ paramLabel = "<host name>")
+ private List<String> parameters = new ArrayList<>();
@Override
public void execute(ScmClient scmClient) throws IOException {
- if (hosts.size() > 0) {
+ if (parameters.size() > 0) {
+ List<String> hosts;
+ // Whether to read from stdin
+ if (parameters.get(0).equals("-")) {
+ hosts = new ArrayList<>();
+ Scanner scanner = new Scanner(System.in, "UTF-8");
+ while (scanner.hasNextLine()) {
+ hosts.add(scanner.nextLine().trim());
+ }
+ } else {
+ hosts = parameters;
+ }
List<DatanodeAdminError> errors = scmClient.decommissionNodes(hosts);
System.out.println("Started decommissioning datanode(s):\n" +
String.join("\n", hosts));
diff --git
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/MaintenanceSubCommand.java
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/MaintenanceSubCommand.java
index a64c400f66..82d263b416 100644
---
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/MaintenanceSubCommand.java
+++
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/MaintenanceSubCommand.java
@@ -27,6 +27,7 @@ import picocli.CommandLine.Command;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Scanner;
/**
* Place one or more datanodes into Maintenance Mode.
@@ -41,8 +42,11 @@ public class MaintenanceSubCommand extends ScmSubcommand {
@CommandLine.Spec
private CommandLine.Model.CommandSpec spec;
- @CommandLine.Parameters(description = "List of fully qualified host names")
- private List<String> hosts = new ArrayList<>();
+ @CommandLine.Parameters(description = "One or more host names separated by
spaces. " +
+ "To read from stdin, specify '-' and supply the host names " +
+ "separated by newlines.",
+ paramLabel = "<host name>")
+ private List<String> parameters = new ArrayList<>();
@CommandLine.Option(names = {"--end"},
description = "Automatically end maintenance after the given hours. " +
@@ -51,7 +55,18 @@ public class MaintenanceSubCommand extends ScmSubcommand {
@Override
public void execute(ScmClient scmClient) throws IOException {
- if (hosts.size() > 0) {
+ if (parameters.size() > 0) {
+ List<String> hosts;
+ // Whether to read from stdin
+ if (parameters.get(0).equals("-")) {
+ hosts = new ArrayList<>();
+ Scanner scanner = new Scanner(System.in, "UTF-8");
+ while (scanner.hasNextLine()) {
+ hosts.add(scanner.nextLine().trim());
+ }
+ } else {
+ hosts = parameters;
+ }
List<DatanodeAdminError> errors =
scmClient.startMaintenanceNodes(hosts, endInHours);
System.out.println("Entering maintenance mode on datanode(s):\n" +
diff --git
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/RecommissionSubCommand.java
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/RecommissionSubCommand.java
index 61f7826cf6..e21d61ed3d 100644
---
a/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/RecommissionSubCommand.java
+++
b/hadoop-hdds/tools/src/main/java/org/apache/hadoop/hdds/scm/cli/datanode/RecommissionSubCommand.java
@@ -27,6 +27,7 @@ import picocli.CommandLine.Command;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
+import java.util.Scanner;
/**
* Recommission one or more datanodes.
@@ -42,12 +43,26 @@ public class RecommissionSubCommand extends ScmSubcommand {
@CommandLine.Spec
private CommandLine.Model.CommandSpec spec;
- @CommandLine.Parameters(description = "List of fully qualified host names")
- private List<String> hosts = new ArrayList<>();
+ @CommandLine.Parameters(description = "One or more host names separated by
spaces. " +
+ "To read from stdin, specify '-' and supply the host names " +
+ "separated by newlines.",
+ paramLabel = "<host name>")
+ private List<String> parameters = new ArrayList<>();
@Override
public void execute(ScmClient scmClient) throws IOException {
- if (hosts.size() > 0) {
+ if (parameters.size() > 0) {
+ List<String> hosts;
+ // Whether to read from stdin
+ if (parameters.get(0).equals("-")) {
+ hosts = new ArrayList<>();
+ Scanner scanner = new Scanner(System.in, "UTF-8");
+ while (scanner.hasNextLine()) {
+ hosts.add(scanner.nextLine().trim());
+ }
+ } else {
+ hosts = parameters;
+ }
List<DatanodeAdminError> errors = scmClient.recommissionNodes(hosts);
System.out.println("Started recommissioning datanode(s):\n" +
String.join("\n", hosts));
diff --git
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDecommissionSubCommand.java
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDecommissionSubCommand.java
index 7e5b857d17..afce23b5fd 100644
---
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDecommissionSubCommand.java
+++
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestDecommissionSubCommand.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
@@ -47,6 +48,7 @@ import static org.mockito.Mockito.when;
public class TestDecommissionSubCommand {
private DecommissionSubCommand cmd;
+ private ScmClient scmClient;
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
@@ -56,6 +58,7 @@ public class TestDecommissionSubCommand {
@BeforeEach
public void setup() throws UnsupportedEncodingException {
cmd = new DecommissionSubCommand();
+ scmClient = mock(ScmClient.class);
System.setOut(new PrintStream(outContent, false, DEFAULT_ENCODING));
System.setErr(new PrintStream(errContent, false, DEFAULT_ENCODING));
}
@@ -66,9 +69,37 @@ public class TestDecommissionSubCommand {
System.setErr(originalErr);
}
+ @Test
+ public void testMultipleHostnamesCanBeReadFromStdin() throws Exception {
+ when(scmClient.decommissionNodes(anyList()))
+ .thenAnswer(invocation -> new ArrayList<DatanodeAdminError>());
+
+ String input = "host1\nhost2\nhost3\n";
+ System.setIn(new ByteArrayInputStream(input.getBytes(DEFAULT_ENCODING)));
+ CommandLine c = new CommandLine(cmd);
+ c.parseArgs("-");
+ cmd.execute(scmClient);
+
+ Pattern p = Pattern.compile(
+ "^Started\\sdecommissioning\\sdatanode\\(s\\)", Pattern.MULTILINE);
+ Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host1$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host2$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host3$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+ }
+
@Test
public void testNoErrorsWhenDecommissioning() throws IOException {
- ScmClient scmClient = mock(ScmClient.class);
when(scmClient.decommissionNodes(anyList()))
.thenAnswer(invocation -> new ArrayList<DatanodeAdminError>());
@@ -92,7 +123,6 @@ public class TestDecommissionSubCommand {
@Test
public void testErrorsReportedWhenDecommissioning() throws IOException {
- ScmClient scmClient = mock(ScmClient.class);
when(scmClient.decommissionNodes(anyList()))
.thenAnswer(invocation -> {
ArrayList<DatanodeAdminError> e = new ArrayList<>();
diff --git
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestMaintenanceSubCommand.java
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestMaintenanceSubCommand.java
index d3f7f026dd..694ba0e282 100644
---
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestMaintenanceSubCommand.java
+++
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestMaintenanceSubCommand.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
@@ -48,6 +49,7 @@ import static org.mockito.Mockito.when;
public class TestMaintenanceSubCommand {
private MaintenanceSubCommand cmd;
+ private ScmClient scmClient;
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
@@ -57,6 +59,7 @@ public class TestMaintenanceSubCommand {
@BeforeEach
public void setup() throws UnsupportedEncodingException {
cmd = new MaintenanceSubCommand();
+ scmClient = mock(ScmClient.class);
System.setOut(new PrintStream(outContent, false, DEFAULT_ENCODING));
System.setErr(new PrintStream(errContent, false, DEFAULT_ENCODING));
}
@@ -67,9 +70,37 @@ public class TestMaintenanceSubCommand {
System.setErr(originalErr);
}
+ @Test
+ public void testMultipleHostnamesCanBeReadFromStdin() throws Exception {
+ when(scmClient.decommissionNodes(anyList()))
+ .thenAnswer(invocation -> new ArrayList<DatanodeAdminError>());
+
+ String input = "host1\nhost2\nhost3\n";
+ System.setIn(new ByteArrayInputStream(input.getBytes(DEFAULT_ENCODING)));
+ CommandLine c = new CommandLine(cmd);
+ c.parseArgs("-");
+ cmd.execute(scmClient);
+
+ Pattern p = Pattern.compile(
+ "^Entering\\smaintenance\\smode\\son\\sdatanode\\(s\\)",
Pattern.MULTILINE);
+ Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host1$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host2$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host3$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+ }
+
@Test
public void testNoErrorsWhenEnteringMaintenance() throws IOException {
- ScmClient scmClient = mock(ScmClient.class);
when(scmClient.startMaintenanceNodes(anyList(), anyInt()))
.thenAnswer(invocation -> new ArrayList<DatanodeAdminError>());
@@ -94,7 +125,6 @@ public class TestMaintenanceSubCommand {
@Test
public void testErrorsReportedWhenEnteringMaintenance() throws IOException {
- ScmClient scmClient = mock(ScmClient.class);
when(scmClient.startMaintenanceNodes(anyList(), anyInt()))
.thenAnswer(invocation -> {
ArrayList<DatanodeAdminError> e = new ArrayList<>();
diff --git
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestRecommissionSubCommand.java
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestRecommissionSubCommand.java
index 41ce0d90cb..7f4dbec773 100644
---
a/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestRecommissionSubCommand.java
+++
b/hadoop-hdds/tools/src/test/java/org/apache/hadoop/hdds/scm/cli/datanode/TestRecommissionSubCommand.java
@@ -23,6 +23,7 @@ import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
+import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.PrintStream;
@@ -47,6 +48,7 @@ import static org.mockito.Mockito.when;
public class TestRecommissionSubCommand {
private RecommissionSubCommand cmd;
+ private ScmClient scmClient;
private final ByteArrayOutputStream outContent = new ByteArrayOutputStream();
private final ByteArrayOutputStream errContent = new ByteArrayOutputStream();
private final PrintStream originalOut = System.out;
@@ -56,6 +58,7 @@ public class TestRecommissionSubCommand {
@BeforeEach
public void setup() throws UnsupportedEncodingException {
cmd = new RecommissionSubCommand();
+ scmClient = mock(ScmClient.class);
System.setOut(new PrintStream(outContent, false, DEFAULT_ENCODING));
System.setErr(new PrintStream(errContent, false, DEFAULT_ENCODING));
}
@@ -66,9 +69,37 @@ public class TestRecommissionSubCommand {
System.setErr(originalErr);
}
+ @Test
+ public void testMultipleHostnamesCanBeReadFromStdin() throws Exception {
+ when(scmClient.decommissionNodes(anyList()))
+ .thenAnswer(invocation -> new ArrayList<DatanodeAdminError>());
+
+ String input = "host1\nhost2\nhost3\n";
+ System.setIn(new ByteArrayInputStream(input.getBytes(DEFAULT_ENCODING)));
+ CommandLine c = new CommandLine(cmd);
+ c.parseArgs("-");
+ cmd.execute(scmClient);
+
+ Pattern p = Pattern.compile(
+ "^Started\\srecommissioning\\sdatanode\\(s\\)", Pattern.MULTILINE);
+ Matcher m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host1$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host2$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+
+ p = Pattern.compile("^host3$", Pattern.MULTILINE);
+ m = p.matcher(outContent.toString(DEFAULT_ENCODING));
+ assertTrue(m.find());
+ }
+
@Test
public void testNoErrorsWhenRecommissioning() throws IOException {
- ScmClient scmClient = mock(ScmClient.class);
when(scmClient.recommissionNodes(anyList()))
.thenAnswer(invocation -> new ArrayList<DatanodeAdminError>());
@@ -92,7 +123,6 @@ public class TestRecommissionSubCommand {
@Test
public void testErrorsReportedWhenRecommissioning() throws IOException {
- ScmClient scmClient = mock(ScmClient.class);
when(scmClient.recommissionNodes(anyList()))
.thenAnswer(invocation -> {
ArrayList<DatanodeAdminError> e = new ArrayList<>();
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]