/* The contents of this file are subject to the terms
* of the Common Development and Distribution License
* (the License). You may not use this file except in
* compliance with the License.
*
* You can obtain a copy of the License at
* http://www.sun.com/cddl/cddl.html or
* install_dir/legal/LICENSE
* See the License for the specific language governing
* permission and limitations under the License.
*
* When distributing Covered Code, include this CDDL
* Header Notice in each file and include the License file
* at install_dir/legal/LICENSE.
* If applicable, add the following below the CDDL Header,
* with the fields enclosed by brackets [] replaced by
* your own identifying information:
* "Portions Copyrighted [year] [name of copyright owner]"
*
* $Id$
*
* Copyright 2008-2009 Sun Microsystems Inc. All Rights Reserved
*/
package com.sun.tools;
import com.sun.faban.common.Command;
import com.sun.faban.common.CommandHandle;
import com.sun.faban.harness.ConfigurationException;
import com.sun.faban.harness.Context;
import com.sun.faban.harness.Configure;
import com.sun.faban.harness.RunContext;
import com.sun.faban.harness.tools.Postprocess;
import com.sun.faban.harness.Start;
import com.sun.faban.harness.Stop;
import com.sun.faban.harness.tools.ToolContext;
import java.io.File;
import java.io.IOException;
import java.util.*;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Mysqlstats implements a tool used for gathering the statistics from a
* MySQL instance.
*/
public class Mysqlstats {
private static Logger logger =
Logger.getLogger(Mysqlstats.class.getName());
/** The injected tool context. */
@Context public ToolContext ctx;
Command cmd;
CommandHandle processRef;
ArrayList<String> toolCmd;
String toolName;
String logfile, logfile1, logfile2;
/**
* Configures the MySQLStats.
*/
@Configure public void config() throws ConfigurationException {
toolName = ctx.getToolName();
String mysqlHome = ctx.getServiceProperty("serverHome");
if(mysqlHome == null || mysqlHome.trim().length() <= 0) {
throw new ConfigurationException("MySQL serverHome property is not provided");
}
String mysqlUser = ctx.getServiceProperty("user");
if(mysqlUser == null || mysqlUser.trim().length() <= 0) {
throw new ConfigurationException("MySQL user is not provided");
}
String mysqlPass = ctx.getServiceProperty("password");
if(mysqlPass == null || mysqlPass.trim().length() <= 0) {
throw new ConfigurationException("MySQL password is not provided");
}
if (mysqlHome.endsWith(File.separator))
mysqlHome = mysqlHome.substring(0, mysqlHome.length() -
File.separator.length());
toolCmd = new ArrayList<String>();
String mysqlCmd = "mysql";
mysqlCmd = mysqlHome + File.separator + "bin" + File.separator + mysqlCmd;
toolCmd.add(mysqlCmd);
toolCmd.add("-u" + mysqlUser);
toolCmd.add("-p" + mysqlPass);
toolCmd.add("-B");
toolCmd.add("-e");
toolCmd.add("show global status");
logger.fine("Setting up mysql command: " + toolCmd);
cmd = new Command(toolCmd);
logfile = ctx.getOutputFile();
// We need two intermediate files for the begin/end snapshots
logfile1 = logfile + "_1";
logfile2 = logfile + "_2";
logger.fine(toolName + " Configured with toolCmd " + toolCmd);
}
/**
* Starts the MySQLStats.
* @throws IOException Cannot execute the needed command
* @throws InterruptedException Interrupted waiting for the stats commmand
*/
@Start public void start() throws IOException, InterruptedException {
logger.fine("Calling mysql show status at start");
cmd.setOutputFile(Command.STDOUT, logfile1);
cmd.setSynchronous(false);
processRef = RunContext.exec(cmd);
logger.fine(toolName + " Started with Cmd = " + toolCmd + " in start method");
}
/**
* Stops the MySQLStats.
*/
@Stop public void stop() {
try {
if(ctx.getToolStatus() == 1){
logger.fine("Calling mysql show status at stop");
cmd.setOutputFile(Command.STDOUT, logfile2);
cmd.setSynchronous(false);
processRef = RunContext.exec(cmd);
logger.fine(toolName + " Started with Cmd = " + toolCmd + " in stop method");
}
logger.fine("Stopping tool " + this.toolCmd);
} catch (IOException ex) {
logger.log(Level.SEVERE, null, ex);
} catch (InterruptedException ex) {
logger.log(Level.SEVERE, null, ex);
}
}
/**
* Get final report by diffing the two logfiles.
*/
@Postprocess public void getReport() {
String c = "mysql_diff_status.sh " + logfile1 + " " + logfile2 + " " + logfile;
logger.fine("Calling " + c);
Command diffCommand = new Command(c);
try {
RunContext.exec(diffCommand);
} catch (IOException e) {
logger.log(Level.SEVERE, "Error executing mysql_diff_status.sh", e);
} catch (InterruptedException e) {
logger.log(Level.SEVERE, "Interrupted executing mysql_diff_status.sh", e);
}
}
}