blob: 3c60e5956d478a7e59d973b454deb9726a6f52f9 [file] [log] [blame]
/**
* 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
* <p>
* http://www.apache.org/licenses/LICENSE-2.0
* <p>
* 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.hadoop.ozone.freon;
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.security.PrivilegedExceptionAction;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import org.apache.hadoop.HadoopIllegalArgumentException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.conf.Configured;
import org.apache.hadoop.hdfs.DFSUtil;
import org.apache.hadoop.hdfs.HdfsConfiguration;
import org.apache.hadoop.hdds.HddsUtils;
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
import org.apache.hadoop.ozone.OmUtils;
import org.apache.hadoop.security.SecurityUtil;
import org.apache.hadoop.util.StringUtils;
import org.apache.hadoop.util.Tool;
import org.apache.hadoop.util.ToolRunner;
/**
* CLI utility to print out ozone related configuration.
*/
public class OzoneGetConf extends Configured implements Tool {
private static final String DESCRIPTION = "ozone getconf is utility for "
+ "getting configuration information from the config file.\n";
enum Command {
INCLUDE_FILE("-includeFile",
"gets the include file path that defines the datanodes " +
"that can join the cluster."),
EXCLUDE_FILE("-excludeFile",
"gets the exclude file path that defines the datanodes " +
"that need to decommissioned."),
OZONEMANAGER("-ozonemanagers",
"gets list of Ozone Manager nodes in the cluster"),
STORAGECONTAINERMANAGER("-storagecontainermanagers",
"gets list of ozone storage container manager nodes in the cluster"),
CONFKEY("-confKey [key]", "gets a specific key from the configuration");
private static final Map<String, OzoneGetConf.CommandHandler> HANDLERS;
static {
HANDLERS = new HashMap<String, OzoneGetConf.CommandHandler>();
HANDLERS.put(StringUtils.toLowerCase(OZONEMANAGER.getName()),
new OzoneManagersCommandHandler());
HANDLERS.put(StringUtils.toLowerCase(STORAGECONTAINERMANAGER.getName()),
new StorageContainerManagersCommandHandler());
HANDLERS.put(StringUtils.toLowerCase(CONFKEY.getName()),
new PrintConfKeyCommandHandler());
}
private final String cmd;
private final String description;
Command(String cmd, String description) {
this.cmd = cmd;
this.description = description;
}
public String getName() {
return cmd.split(" ")[0];
}
public String getUsage() {
return cmd;
}
public String getDescription() {
return description;
}
public static OzoneGetConf.CommandHandler getHandler(String cmd) {
return HANDLERS.get(StringUtils.toLowerCase(cmd));
}
}
static final String USAGE;
static {
HdfsConfiguration.init();
/* Initialize USAGE based on Command values */
StringBuilder usage = new StringBuilder(DESCRIPTION);
usage.append("\nozone getconf \n");
for (OzoneGetConf.Command cmd : OzoneGetConf.Command.values()) {
usage.append("\t[" + cmd.getUsage() + "]\t\t\t" + cmd.getDescription()
+ "\n");
}
USAGE = usage.toString();
}
/**
* Handler to return value for key corresponding to the
* {@link OzoneGetConf.Command}.
*/
static class CommandHandler {
@SuppressWarnings("visibilitymodifier")
protected String key; // Configuration key to lookup
CommandHandler() {
this(null);
}
CommandHandler(String key) {
this.key = key;
}
final int doWork(OzoneGetConf tool, String[] args) {
try {
checkArgs(args);
return doWorkInternal(tool, args);
} catch (Exception e) {
tool.printError(e.getMessage());
}
return -1;
}
protected void checkArgs(String[] args) {
if (args.length > 0) {
throw new HadoopIllegalArgumentException(
"Did not expect argument: " + args[0]);
}
}
/** Method to be overridden by sub classes for specific behavior. */
int doWorkInternal(OzoneGetConf tool, String[] args) throws Exception {
String value = tool.getConf().getTrimmed(key);
if (value != null) {
tool.printOut(value);
return 0;
}
tool.printError("Configuration " + key + " is missing.");
return -1;
}
}
static class PrintConfKeyCommandHandler extends OzoneGetConf.CommandHandler {
@Override
protected void checkArgs(String[] args) {
if (args.length != 1) {
throw new HadoopIllegalArgumentException(
"usage: " + OzoneGetConf.Command.CONFKEY.getUsage());
}
}
@Override
int doWorkInternal(OzoneGetConf tool, String[] args) throws Exception {
this.key = args[0];
return super.doWorkInternal(tool, args);
}
}
private final PrintStream out; // Stream for printing command output
private final PrintStream err; // Stream for printing error
protected OzoneGetConf(Configuration conf) {
this(conf, System.out, System.err);
}
protected OzoneGetConf(Configuration conf, PrintStream out, PrintStream err) {
super(conf);
this.out = out;
this.err = err;
}
void printError(String message) {
err.println(message);
}
void printOut(String message) {
out.println(message);
}
private void printUsage() {
printError(USAGE);
}
/**
* Main method that runs the tool for given arguments.
* @param args arguments
* @return return status of the command
*/
private int doWork(String[] args) {
if (args.length >= 1) {
OzoneGetConf.CommandHandler handler =
OzoneGetConf.Command.getHandler(args[0]);
if (handler != null) {
return handler.doWork(this, Arrays.copyOfRange(args, 1, args.length));
}
}
printUsage();
return -1;
}
@Override
public int run(final String[] args) throws Exception {
return SecurityUtil.doAsCurrentUser(
new PrivilegedExceptionAction<Integer>() {
@Override
public Integer run() throws Exception {
return doWork(args);
}
});
}
/**
* Handler for {@link Command#STORAGECONTAINERMANAGER}.
*/
static class StorageContainerManagersCommandHandler extends CommandHandler {
@Override
public int doWorkInternal(OzoneGetConf tool, String[] args)
throws IOException {
Collection<InetSocketAddress> addresses = HddsUtils
.getSCMAddresses(tool.getConf());
for (InetSocketAddress addr : addresses) {
tool.printOut(addr.getHostName());
}
return 0;
}
}
/**
* Handler for {@link Command#OZONEMANAGER}.
*/
static class OzoneManagersCommandHandler extends CommandHandler {
@Override
public int doWorkInternal(OzoneGetConf tool, String[] args)
throws IOException {
tool.printOut(OmUtils.getOmAddress(tool.getConf()).getHostName());
return 0;
}
}
public static void main(String[] args) throws Exception {
if (DFSUtil.parseHelpArgument(args, USAGE, System.out, true)) {
System.exit(0);
}
Configuration conf = new Configuration();
conf.addResource(new OzoneConfiguration());
int res = ToolRunner.run(new OzoneGetConf(conf), args);
System.exit(res);
}
}