package com.intuit.tank.harness;
/*
* #%L
* Intuit Tank Agent (apiharness)
* %%
* Copyright (C) 2011 - 2015 Intuit Inc.
* %%
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
* #L%
*/
import java.io.IOException;
import java.io.PrintStream;
import java.net.InetSocketAddress;
import java.net.SocketAddress;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.simpleframework.http.Request;
import org.simpleframework.http.Response;
import org.simpleframework.http.core.Container;
import org.simpleframework.transport.connect.Connection;
import org.simpleframework.transport.connect.SocketConnection;
import com.intuit.tank.harness.logging.LogUtil;
import com.intuit.tank.vm.api.enumerated.WatsAgentCommand;
public class CommandListener implements Container {
private static final Logger LOG = LogManager.getLogger(CommandListener.class);
private static boolean started = false;
public static void main(String[] args) {
APITestHarness.getInstance();
startHttpServer(8080);
System.out.println("Listening for requests");
}
public synchronized static void startHttpServer(int port) {
if (!started) {
try {
Container container = new CommandListener();
@SuppressWarnings("resource") Connection connection = new SocketConnection(container);
SocketAddress address = new InetSocketAddress(port);
System.out.println("Starting httpserver on port " + port);
LOG.info("Starting httpserver on port " + port);
connection.connect(address);
started = true;
} catch (IOException e) {
LOG.error(LogUtil.getLogMessage("Error starting httpServer: " + e), e);
throw new RuntimeException(e);
}
}
}
@Override
public void handle(Request req, Response response) {
try {
String msg = "unknown path";
String path = req.getPath().getPath();
if (path.equals(WatsAgentCommand.start.getPath()) || path.equals(WatsAgentCommand.run.getPath())) {
msg = "Starting Test " + APITestHarness.getInstance().getAgentRunData().getJobId();
startTest();
} else if (path.startsWith(WatsAgentCommand.stop.getPath())) {
msg = "Stopping Test " + APITestHarness.getInstance().getAgentRunData().getJobId();
APITestHarness.getInstance().setCommand(WatsAgentCommand.stop);
} else if (path.startsWith(WatsAgentCommand.kill.getPath())) {
msg = "Killing Test " + APITestHarness.getInstance().getAgentRunData().getJobId();
System.exit(0);
} else if (path.startsWith(WatsAgentCommand.pause.getPath())) {
msg = "Pausing Test " + APITestHarness.getInstance().getAgentRunData().getJobId();
APITestHarness.getInstance().setCommand(WatsAgentCommand.pause);
} else if (path.startsWith(WatsAgentCommand.pause_ramp.getPath())) {
msg = "Pausing Ramp for Test " + APITestHarness.getInstance().getAgentRunData().getJobId();
APITestHarness.getInstance().setCommand(WatsAgentCommand.pause_ramp);
} else if (path.startsWith(WatsAgentCommand.resume_ramp.getPath())) {
msg = "Pausing Test " + APITestHarness.getInstance().getAgentRunData().getJobId();
APITestHarness.getInstance().setCommand(WatsAgentCommand.resume_ramp);
} else if (path.startsWith(WatsAgentCommand.status.getPath())) {
msg = APITestHarness.getInstance().getStats().toString();
APITestHarness.getInstance().setCommand(WatsAgentCommand.resume_ramp);
}
LOG.info(msg);
PrintStream body = response.getPrintStream();
long time = System.currentTimeMillis();
response.set("Content-Type", "text/plain");
response.set("Server", "Intuit Tank Agent/1.0");
response.setDate("Date", time);
response.setDate("Last-Modified", time);
body.println(msg);
body.close();
} catch (IOException e) {
LOG.error("");
response.setCode(500);
}
}
public void startTest() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
APITestHarness.getInstance().runConcurrentTestPlans();
}
});
t.setDaemon(true);
t.start();
}
}