Skip to content

Commit

Permalink
RATIS-1860. Add ratis-shell cmd to generate a new raft-meta.conf. (ap…
Browse files Browse the repository at this point in the history
…ache#901)

* Add ratis-shell cmd to generate a new raft-meta.conf.

* Remove index option.

* Style fix.

* Use GroupCommand as the parent of RaftMetaConfCommand.

* Modified by review comments.

* Update cli.md

* Use LocalCommand as the parent of RaftMetaConfCommand.

* ReConstruct some abstract command.

* Modified by review comments.

* Use println instead of printf.

* Checkstyle error fix(delete some unuse import).

---------

Co-authored-by: idellzheng <[email protected]>
  • Loading branch information
2 people authored and symious committed Mar 20, 2024
1 parent e50a012 commit 467043d
Show file tree
Hide file tree
Showing 10 changed files with 276 additions and 37 deletions.
12 changes: 12 additions & 0 deletions ratis-docs/src/site/markdown/cli.md
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ Usage: ratis sh [generic options]
[group [info] [list]]
[peer [add] [remove] [setPriority]]
[snapshot [create]]
[local [raftMetaConf]]
```
## generic options
Expand Down Expand Up @@ -172,3 +173,14 @@ Trigger the specified server take snapshot.
```
$ ratis sh snapshot create -peers <P0_HOST:P0_PORT,P1_HOST:P1_PORT,P2_HOST:P2_PORT> -peerId <peerId0> [-groupid <RAFT_GROUP_ID>]
```
## local
The `local` command is used to process local operation, which no need to connect to ratis server.
It has the following subcommands:
`raftMetaConf`
### local raftMetaConf
Generate a new raft-meta.conf file based on original raft-meta.conf and new peers, which is used to move a raft node to a new node.
```
$ ratis sh local raftMetaConf -peers <P0_HOST:P0_PORT,P1_HOST:P1_PORT,P2_HOST:P2_PORT> -path <PARENT_PATH_OF_RAFT_META_CONF>
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ratis.shell.cli.sh.command;

import org.apache.ratis.shell.cli.Command;

import java.io.PrintStream;
import java.net.InetSocketAddress;

/**
* The base class for all the ratis shell {@link Command} classes.
*/
public abstract class AbstractCommand implements Command {

private final PrintStream printStream;

protected AbstractCommand(Context context) {
printStream = context.getPrintStream();
}

public static InetSocketAddress parseInetSocketAddress(String address) {
try {
final String[] hostPortPair = address.split(":");
if (hostPortPair.length < 2) {
throw new IllegalArgumentException("Unexpected address format <HOST:PORT>.");
}
return new InetSocketAddress(hostPortPair[0], Integer.parseInt(hostPortPair[1]));
} catch (Exception e) {
throw new IllegalArgumentException("Failed to parse the server address parameter \"" + address + "\".", e);
}
}

protected PrintStream getPrintStream() {
return printStream;
}

protected void printf(String format, Object... args) {
printStream.printf(format, args);
}

protected void println(Object message) {
printStream.println(message);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,10 @@
import java.util.function.Function;
import java.util.stream.Collectors;

public abstract class AbstractParentCommand extends AbstractRatisCommand{
public abstract class AbstractParentCommand implements Command {
private final Map<String, Command> subs;

public AbstractParentCommand(Context context, List<Function<Context, AbstractRatisCommand>> subCommandConstructors) {
super(context);
public AbstractParentCommand(Context context, List<Function<Context, Command>> subCommandConstructors) {
this.subs = Collections.unmodifiableMap(subCommandConstructors.stream()
.map(constructor -> constructor.apply(context))
.collect(Collectors.toMap(Command::getCommandName, Function.identity(),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
import org.apache.commons.cli.Option;
import org.apache.ratis.protocol.*;
import org.apache.ratis.protocol.exceptions.RaftException;
import org.apache.ratis.shell.cli.Command;
import org.apache.ratis.shell.cli.RaftUtils;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.Options;
Expand All @@ -34,7 +33,6 @@
import org.apache.ratis.util.function.CheckedFunction;

import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.util.*;
import java.util.function.BiConsumer;
Expand All @@ -43,25 +41,13 @@
import java.util.stream.Stream;

/**
* The base class for all the ratis shell {@link Command} classes.
* The base class for the ratis shell which need to connect to server.
*/
public abstract class AbstractRatisCommand implements Command {
public abstract class AbstractRatisCommand extends AbstractCommand {
public static final String PEER_OPTION_NAME = "peers";
public static final String GROUPID_OPTION_NAME = "groupid";
public static final RaftGroupId DEFAULT_RAFT_GROUP_ID = RaftGroupId.randomId();

public static InetSocketAddress parseInetSocketAddress(String address) {
try {
final String[] hostPortPair = address.split(":");
if (hostPortPair.length < 2) {
throw new IllegalArgumentException("Unexpected address format <HOST:PORT>.");
}
return new InetSocketAddress(hostPortPair[0], Integer.parseInt(hostPortPair[1]));
} catch (Exception e) {
throw new IllegalArgumentException("Failed to parse the server address parameter \"" + address + "\".", e);
}
}

/**
* Execute a given function with input parameter from the members of a list.
*
Expand All @@ -86,12 +72,11 @@ public static <T, K, E extends Throwable> K run(Collection<T> list, CheckedFunct
return null;
}

private final PrintStream printStream;
private RaftGroup raftGroup;
private GroupInfoReply groupInfoReply;

protected AbstractRatisCommand(Context context) {
printStream = context.getPrintStream();
super(context);
}

@Override
Expand Down Expand Up @@ -154,18 +139,6 @@ public Options getOptions() {
.addOption(GROUPID_OPTION_NAME, true, "Raft group id");
}

protected PrintStream getPrintStream() {
return printStream;
}

protected void printf(String format, Object... args) {
printStream.printf(format, args);
}

protected void println(Object message) {
printStream.println(message);
}

protected RaftGroup getRaftGroup() {
return raftGroup;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package org.apache.ratis.shell.cli.sh.command;

import org.apache.ratis.shell.cli.Command;
import org.apache.ratis.shell.cli.sh.election.PauseCommand;
import org.apache.ratis.shell.cli.sh.election.ResumeCommand;
import org.apache.ratis.shell.cli.sh.election.StepDownCommand;
Expand All @@ -28,7 +29,7 @@
import java.util.function.Function;

public class ElectionCommand extends AbstractParentCommand {
private static final List<Function<Context, AbstractRatisCommand>> SUB_COMMAND_CONSTRUCTORS
private static final List<Function<Context, Command>> SUB_COMMAND_CONSTRUCTORS
= Collections.unmodifiableList(Arrays.asList(
TransferCommand::new, StepDownCommand::new, PauseCommand::new, ResumeCommand::new));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package org.apache.ratis.shell.cli.sh.command;

import org.apache.ratis.shell.cli.Command;
import org.apache.ratis.shell.cli.sh.group.GroupInfoCommand;
import org.apache.ratis.shell.cli.sh.group.GroupListCommand;

Expand All @@ -30,7 +31,7 @@
*/
public class GroupCommand extends AbstractParentCommand {

private static final List<Function<Context, AbstractRatisCommand>> SUB_COMMAND_CONSTRUCTORS
private static final List<Function<Context, Command>> SUB_COMMAND_CONSTRUCTORS
= Collections.unmodifiableList(Arrays.asList(
GroupInfoCommand::new, GroupListCommand::new));
/**
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ratis.shell.cli.sh.command;

import org.apache.ratis.shell.cli.Command;
import org.apache.ratis.shell.cli.sh.local.RaftMetaConfCommand;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.function.Function;

/**
* Command for local operation, which no need to connect to ratis server
*/
public class LocalCommand extends AbstractParentCommand {

private static final List<Function<Context, Command>> SUB_COMMAND_CONSTRUCTORS
= Collections.unmodifiableList(Arrays.asList(RaftMetaConfCommand::new));

/**
* @param context command context
*/
public LocalCommand(Context context) {
super(context, SUB_COMMAND_CONSTRUCTORS);
}

@Override
public String getCommandName() {
return "local";
}

@Override
public String getDescription() {
return description();
}

/**
* @return command's description
*/
public static String description() {
return "Command for local operation, which no need to connect to ratis server; "
+ "see the sub-commands for the details.";
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package org.apache.ratis.shell.cli.sh.command;

import org.apache.ratis.shell.cli.Command;
import org.apache.ratis.shell.cli.sh.peer.AddCommand;
import org.apache.ratis.shell.cli.sh.peer.RemoveCommand;
import org.apache.ratis.shell.cli.sh.peer.SetPriorityCommand;
Expand All @@ -31,7 +32,7 @@
*/
public class PeerCommand extends AbstractParentCommand{

private static final List<Function<Context, AbstractRatisCommand>> SUB_COMMAND_CONSTRUCTORS
private static final List<Function<Context, Command>> SUB_COMMAND_CONSTRUCTORS
= Collections.unmodifiableList(Arrays.asList(AddCommand::new, RemoveCommand::new,
SetPriorityCommand::new));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
*/
package org.apache.ratis.shell.cli.sh.command;

import org.apache.ratis.shell.cli.Command;
import org.apache.ratis.shell.cli.sh.snapshot.TakeSnapshotCommand;

import java.util.Arrays;
Expand All @@ -28,7 +29,7 @@
* Command for the ratis snapshot
*/
public class SnapshotCommand extends AbstractParentCommand {
private static final List<Function<Context, AbstractRatisCommand>> SUB_COMMAND_CONSTRUCTORS
private static final List<Function<Context, Command>> SUB_COMMAND_CONSTRUCTORS
= Collections.unmodifiableList(Arrays.asList(TakeSnapshotCommand::new));

/**
Expand Down
Loading

1 comment on commit 467043d

@symious
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Sounds like a trick way to change hostname for server.
  2. But we still need stop the whole ring, right?

Please sign in to comment.