/*
* The Alluxio Open Foundation licenses this work under the Apache License, version 2.0
* (the "License"). You may not use this work except in compliance with the License, which is
* available at www.apache.org/licenses/LICENSE-2.0
*
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
* either express or implied, as more fully set forth in the License.
*
* See the NOTICE file distributed with this work for information regarding copyright ownership.
*/
package alluxio.cli;
import alluxio.Configuration;
import alluxio.PropertyKey;
import com.google.common.base.Preconditions;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
import org.apache.commons.cli.DefaultParser;
import org.apache.commons.cli.HelpFormatter;
import org.apache.commons.cli.Option;
import org.apache.commons.cli.Options;
import org.apache.commons.cli.ParseException;
import java.util.Map.Entry;
/**
* Utility for printing Alluxio configuration.
*/
public final class GetConf {
private static final String USAGE = "USAGE: GetConf [--unit <arg>] [KEY]\n\n"
+ "GetConf prints the configured value for the given key. If the key is invalid, the "
+ "exit code will be nonzero. If the key is valid but isn't set, an empty string is printed. "
+ "If no key is specified, all configuration is printed. If \"--unit\" option is specified, "
+ "values of data size configuration will be converted to a quantity in the given unit."
+ "E.g., with \"--unit KB\", a configuration value of \"4096\" will return 4, "
+ "and with \"--unit S\", a configuration value of \"5000\" will return 5."
+ "Possible unit options include B, KB, MB, GB, TP, PB, MS, S, M, H, D";
private static final String UNIT_OPTION_NAME = "unit";
private static final Option UNIT_OPTION =
Option.builder().required(false).longOpt(UNIT_OPTION_NAME).hasArg(true)
.desc("unit of the value to return.").build();
private static final Options OPTIONS = new Options().addOption(UNIT_OPTION);
private enum ByteUnit {
B(1L),
KB(1L << 10),
MB(1L << 20),
GB(1L << 30),
TB(1L << 40),
PB(1L << 50);
/** value associated with each unit. */
private long mValue;
/**
* @return the value of this unit
*/
public long getValue() {
return mValue;
}
ByteUnit(long value) {
mValue = value;
}
}
private enum TimeUnit {
MS(1L),
MILLISECOND(1L),
S(1000L),
SEC(1000L),
SECOND(1000L),
M(60000L),
MIN(60000L),
MINUTE(60000L),
H(3600000L),
HR(3600000L),
HOUR(3600000L),
D(86400000L),
DAY(86400000L);
/** value associated with each unit. */
private long mValue;
/**
* @return the value of this unit
*/
public long getValue() {
return mValue;
}
TimeUnit(long value) {
mValue = value;
}
}
/**
* Prints the help message.
*
* @param message message before standard usage information
*/
public static void printHelp(String message) {
System.err.println(message);
HelpFormatter help = new HelpFormatter();
help.printHelp(USAGE, OPTIONS);
}
/**
* Implements get configuration.
*
* @param args list of arguments
* @return 0 on success, 1 on failures
*/
public static int getConf(String... args) {
CommandLineParser parser = new DefaultParser();
CommandLine cmd;
try {
cmd = parser.parse(OPTIONS, args, true /* stopAtNonOption */);
} catch (ParseException e) {
printHelp("Unable to parse input args: " + e.getMessage());
return 1;
}
Preconditions.checkNotNull(cmd, "Unable to parse input args");
args = cmd.getArgs();
switch (args.length) {
case 0:
for (Entry<String, String> entry : Configuration.toMap().entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
System.out.println(String.format("%s=%s", key, value));
}
break;
case 1:
if (!PropertyKey.isValid(args[0])) {
printHelp(String.format("%s is not a valid configuration key", args[0]));
return 1;
}
PropertyKey key = PropertyKey.fromString(args[0]);
if (!Configuration.containsKey(key)) {
System.out.println("");
} else {
if (cmd.hasOption(UNIT_OPTION_NAME)) {
String arg = cmd.getOptionValue(UNIT_OPTION_NAME).toUpperCase();
try {
ByteUnit byteUnit;
byteUnit = ByteUnit.valueOf(arg);
System.out.println(Configuration.getBytes(key) / byteUnit.getValue());
break;
} catch (Exception e) {
// try next unit parse
}
try {
TimeUnit timeUnit;
timeUnit = TimeUnit.valueOf(arg);
System.out.println(Configuration.getMs(key) / timeUnit.getValue());
break;
} catch (IllegalArgumentException ex) {
// try next unit parse
}
printHelp(String.format("%s is not a valid unit", arg));
return 1;
} else {
System.out.println(Configuration.get(key));
}
}
break;
default:
printHelp("More arguments than expected");
return 1;
}
return 0;
}
/**
* Prints Alluxio configuration.
*
* @param args the arguments to specify the unit (optional) and configuration key (optional)
*/
public static void main(String[] args) {
System.exit(getConf(args));
}
private GetConf() {} // this class is not intended for instantiation
}