blob: 834b6b18ae99aefb1d7c500c9cb35e5e993c8254 [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
*
* 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.tajo.cli.tools;
import com.google.protobuf.ServiceException;
import org.apache.commons.cli.*;
import org.apache.tajo.client.TajoClient;
import org.apache.tajo.conf.TajoConf;
import org.apache.tajo.service.ServiceTracker;
import org.apache.tajo.service.ServiceTrackerFactory;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.Writer;
public class TajoHAAdmin {
private static final Options options;
static {
options = new Options();
options.addOption("h", "host", true, "Tajo server host");
options.addOption("p", "port", true, "Tajo server port");
options.addOption("transitionToActive", null, true, "Transitions the master into Active state");
options.addOption("transitionToBackup", null, true, "Transitions the master into Backup state");
options.addOption("getState", null, true, "Returns the state of the master");
options.addOption("formatHA", null, false, "Format HA status on share storage");
}
private TajoConf tajoConf;
private Writer writer;
private ServiceTracker serviceTracker;
public TajoHAAdmin(TajoConf tajoConf, Writer writer) {
this(tajoConf, writer, null);
}
public TajoHAAdmin(TajoConf tajoConf, Writer writer, TajoClient tajoClient) {
this.tajoConf = tajoConf;
this.writer = writer;
serviceTracker = ServiceTrackerFactory.get(this.tajoConf);
}
private void printUsage() {
HelpFormatter formatter = new HelpFormatter();
formatter.printHelp( "haadmin [options]", options );
}
public void runCommand(String[] args) throws Exception {
if(args.length == 1 &&
(args[0].equalsIgnoreCase("-transitionToActive")
|| args[0].equalsIgnoreCase("-transitionToBackup")
|| args[0].equalsIgnoreCase("-getState"))) {
writer.write("Not enough arguments: expected 1 but got 0\n");
writer.flush();
return;
}
CommandLineParser parser = new PosixParser();
CommandLine cmd = parser.parse(options, args);
String param = "";
int cmdType = 0;
String hostName = null;
Integer port = null;
if (cmd.hasOption("h")) {
hostName = cmd.getOptionValue("h");
}
if (cmd.hasOption("p")) {
port = Integer.parseInt(cmd.getOptionValue("p"));
}
if (cmd.hasOption("transitionToActive")) {
cmdType = 1;
param = cmd.getOptionValue("transitionToActive");
} else if (cmd.hasOption("transitionToBackup")) {
cmdType = 2;
param = cmd.getOptionValue("transitionToBackup");
} else if (cmd.hasOption("getState")) {
cmdType = 3;
param = cmd.getOptionValue("getState");
} else if (cmd.hasOption("formatHA")) {
cmdType = 4;
}
// if there is no "-h" option,
if(hostName == null) {
if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) {
// it checks if the client service address is given in configuration and distributed mode.
// if so, it sets entryAddr.
hostName = tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[0];
}
}
if (port == null) {
if (tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS) != null) {
// it checks if the client service address is given in configuration and distributed mode.
// if so, it sets entryAddr.
port = Integer.parseInt(tajoConf.getVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS).split(":")[1]);
}
}
if (cmdType == 0) {
printUsage();
return;
}
if ((hostName == null) ^ (port == null)) {
System.err.println("ERROR: cannot find valid Tajo server address");
return;
} else if (hostName != null && port != null) {
tajoConf.setVar(TajoConf.ConfVars.TAJO_MASTER_CLIENT_RPC_ADDRESS, hostName + ":" + port);
}
if (!tajoConf.getBoolVar(TajoConf.ConfVars.TAJO_MASTER_HA_ENABLE)) {
writer.write("HA is not enabled for this tajo cluster.");
} else {
switch (cmdType) {
case 1:
writer.write("Not Yet Implemented\n");
break;
case 2:
writer.write("Not Yet Implemented\n");
break;
case 3:
getState(writer, param);
break;
case 4:
formatHA(writer);
break;
default:
printUsage();
break;
}
}
writer.flush();
}
private void getState(Writer writer, String param) throws ParseException, IOException,
ServiceException {
int retValue = serviceTracker.getState(param, tajoConf);
switch (retValue) {
case 1:
writer.write("The master is active.\n");
break;
case 0:
writer.write("The master is backup.\n");
break;
case -1:
writer.write("Finding failed. - master:" + param + "\n");
break;
default:
writer.write("Cannot find the master. - master:" + param + "\n");
break;
}
}
private void formatHA(Writer writer) throws ParseException, IOException,
ServiceException {
int retValue = serviceTracker.formatHA(tajoConf);
switch (retValue) {
case 1:
writer.write("Formatting finished successfully.\n");
break;
case 0:
writer.write("If you want to format the ha information, you must shutdown tajo masters "
+ " before formatting.\n");
break;
default:
writer.write("Cannot format ha information.\n");
break;
}
}
public static void main(String [] args) throws Exception {
TajoConf conf = new TajoConf();
Writer writer = new PrintWriter(System.out);
try {
TajoHAAdmin admin = new TajoHAAdmin(conf, writer);
admin.runCommand(args);
} finally {
writer.close();
System.exit(0);
}
}
}