package org.batfish.client;
import java.io.File;
import java.nio.file.Files;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;
import javax.ws.rs.ProcessingException;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.exception.ExceptionUtils;
import org.batfish.common.BatfishException;
import org.batfish.common.BatfishLogger;
import org.batfish.common.BfConsts;
import org.batfish.common.CoordConsts;
import org.batfish.common.WorkItem;
import org.batfish.common.CoordConsts.WorkStatusCode;
import org.batfish.common.Pair;
import org.batfish.common.Version;
import org.batfish.common.util.CommonUtil;
import org.codehaus.jettison.json.JSONArray;
import org.codehaus.jettison.json.JSONObject;
import org.glassfish.jersey.media.multipart.FormDataBodyPart;
import org.glassfish.jersey.media.multipart.MultiPart;
import org.glassfish.jersey.media.multipart.MultiPartFeature;
public class BfCoordWorkHelper {
private String _coordWorkMgr;
private BatfishLogger _logger;
private Settings _settings;
public BfCoordWorkHelper(String workMgr, BatfishLogger logger,
Settings settings) {
_coordWorkMgr = workMgr;
_logger = logger;
_settings = settings;
}
private void addFileMultiPart(MultiPart multiPart, String key,
String filename) {
multiPart.bodyPart(new FormDataBodyPart(key, new File(filename),
MediaType.APPLICATION_OCTET_STREAM_TYPE));
}
private void addTextMultiPart(MultiPart multiPart, String key,
String value) {
multiPart.bodyPart(
new FormDataBodyPart(key, value, MediaType.TEXT_PLAIN_TYPE));
}
public String checkApiKey() {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_CHECK_API_KEY_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
return Boolean.toString(jObj.getBoolean(CoordConsts.SVC_API_KEY));
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public boolean configureAnalysis(String containerName, boolean newAnalysis,
String analysisName, String addQuestionsFileName,
String delQuestionsStr) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_CONFIGURE_ANALYSIS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
if (newAnalysis) {
addTextMultiPart(multiPart, CoordConsts.SVC_NEW_ANALYSIS_KEY,
"new");
}
addTextMultiPart(multiPart, CoordConsts.SVC_ANALYSIS_NAME_KEY,
analysisName);
if (addQuestionsFileName != null) {
addFileMultiPart(multiPart, CoordConsts.SVC_FILE_KEY,
addQuestionsFileName);
}
if (delQuestionsStr != null) {
addTextMultiPart(multiPart,
CoordConsts.SVC_DEL_ANALYSIS_QUESTIONS_KEY, delQuestionsStr);
}
return postData(webTarget, multiPart) != null;
}
catch (Exception e) {
if (e.getMessage().contains("FileNotFoundException")) {
_logger.errorf("File not found: %s (addQuestionsFile file)\n",
addQuestionsFileName);
}
else {
_logger.errorf(
"Exception when configuring analysis to %s using (%s, %s, %s, %s, %s): %s\n",
_coordWorkMgr, containerName, newAnalysis, analysisName,
addQuestionsFileName, delQuestionsStr,
ExceptionUtils.getStackTrace(e));
}
return false;
}
}
public boolean delAnalysis(String containerName, String analysisName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_DEL_ANALYSIS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_ANALYSIS_NAME_KEY,
analysisName);
return postData(webTarget, multiPart) != null;
}
catch (Exception e) {
_logger.errorf(
"Exception when deleting analysis to %s using (%s, %s): %s\n",
_coordWorkMgr, containerName, analysisName,
ExceptionUtils.getStackTrace(e));
return false;
}
}
public boolean delContainer(String containerName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_DEL_CONTAINER_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
JSONObject jObj = postData(webTarget, multiPart);
return (jObj != null);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return false;
}
}
public boolean delEnvironment(String containerName, String testrigName,
String envName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_DEL_ENVIRONMENT_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
addTextMultiPart(multiPart, CoordConsts.SVC_ENV_NAME_KEY, envName);
JSONObject jObj = postData(webTarget, multiPart);
return (jObj != null);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return false;
}
}
public boolean delQuestion(String containerName, String testrigName,
String questionName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_DEL_QUESTION_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
addTextMultiPart(multiPart, CoordConsts.SVC_QUESTION_NAME_KEY,
questionName);
JSONObject jObj = postData(webTarget, multiPart);
return (jObj != null);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return false;
}
}
public boolean delTestrig(String containerName, String testrigName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_DEL_TESTRIG_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
JSONObject jObj = postData(webTarget, multiPart);
return (jObj != null);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return false;
}
}
// private JSONObject getJsonResponse(WebTarget webTarget) throws Exception {
// try {
// Response response = webTarget.request(MediaType.APPLICATION_JSON)
// .get();
//
// _logger.info(response.getStatus() + " " + response.getStatusInfo()
// + " " + response + "\n");
//
// if (response.getStatus() != Response.Status.OK.getStatusCode()) {
// _logger.errorf("Did not get an OK response from: %s\n", webTarget);
// return null;
// }
//
// String sobj = response.readEntity(String.class);
// JSONArray array = new JSONArray(sobj);
//
// _logger.infof("response: %s [%s] [%s]\n", array.toString(),
// array.get(0), array.get(1));
//
// if (!array.get(0).equals(CoordConsts.SVC_SUCCESS_KEY)) {
// _logger.errorf("did not get success: %s %s\n", array.get(0),
// array.get(1));
// return null;
// }
//
// return new JSONObject(array.get(1).toString());
// }
// catch (ProcessingException e) {
// if (e.getMessage().contains("ConnectException")) {
// _logger.errorf("unable to connect to coordinator at %s\n",
// _coordWorkMgr);
// return null;
// }
// if (e.getMessage().contains("SSLHandshakeException")) {
// _logger
// .errorf("SSL handshake exception while connecting to coordinator (Is the
// coordinator using SSL and using keys that you trust?)\n");
// return null;
// }
// if (e.getMessage().contains("SocketException: Unexpected end of file")) {
// _logger
// .errorf("SocketException while connecting to coordinator. (Are you using
// SSL?)\n");
// return null;
// }
// throw e;
// }
// }
public String getAnalysisAnswers(String containerName, String baseTestrig,
String baseEnvironment, String deltaTestrig, String deltaEnvironment,
String analysisName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_GET_ANALYSIS_ANSWERS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
baseTestrig);
addTextMultiPart(multiPart, CoordConsts.SVC_ENV_NAME_KEY,
baseEnvironment);
if (deltaTestrig != null) {
addTextMultiPart(multiPart, CoordConsts.SVC_DELTA_TESTRIG_NAME_KEY,
deltaTestrig);
addTextMultiPart(multiPart, CoordConsts.SVC_DELTA_ENV_NAME_KEY,
deltaEnvironment);
}
addTextMultiPart(multiPart, CoordConsts.SVC_ANALYSIS_NAME_KEY,
analysisName);
addTextMultiPart(multiPart, CoordConsts.SVC_PRETTY_ANSWER_KEY,
Boolean.toString(false));
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_ANSWERS_KEY)) {
_logger.errorf("answer key not found in: %s\n", jObj.toString());
return null;
}
String answer = jObj.getString(CoordConsts.SVC_ANSWERS_KEY);
return answer;
}
catch (Exception e) {
_logger.errorf("Exception in getAnswer from %s using (%s, %s)\n",
_coordWorkMgr, baseTestrig, analysisName);
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public String getAnswer(String containerName, String baseTestrig,
String baseEnv, String deltaTestrig, String deltaEnv,
String questionName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_GET_ANSWER_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
baseTestrig);
addTextMultiPart(multiPart, CoordConsts.SVC_ENV_NAME_KEY, baseEnv);
if (deltaTestrig != null) {
addTextMultiPart(multiPart, CoordConsts.SVC_DELTA_TESTRIG_NAME_KEY,
deltaTestrig);
addTextMultiPart(multiPart, CoordConsts.SVC_DELTA_ENV_NAME_KEY,
deltaEnv);
}
addTextMultiPart(multiPart, CoordConsts.SVC_QUESTION_NAME_KEY,
questionName);
addTextMultiPart(multiPart, CoordConsts.SVC_PRETTY_ANSWER_KEY,
Boolean.toString(false));
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_ANSWER_KEY)) {
_logger.errorf("answer key not found in: %s\n", jObj.toString());
return null;
}
String answer = jObj.getString(CoordConsts.SVC_ANSWER_KEY);
return answer;
}
catch (Exception e) {
_logger.errorf("Exception in getAnswer from %s using (%s, %s)\n",
_coordWorkMgr, baseTestrig, questionName);
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
private ClientBuilder getClientBuilder() throws Exception {
return CommonUtil
.getClientBuilder(_settings.getUseSsl(),
_settings.getTrustAllSslCerts())
.register(MultiPartFeature.class);
}
public String getObject(String containerName, String testrigName,
String objectName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_GET_OBJECT_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_VERSION_KEY,
Version.getVersion());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
addTextMultiPart(multiPart, CoordConsts.SVC_OBJECT_NAME_KEY,
objectName);
Response response = webTarget
.request(MediaType.APPLICATION_OCTET_STREAM)
.post(Entity.entity(multiPart, multiPart.getMediaType()));
_logger.debug(response.getStatus() + " " + response.getStatusInfo()
+ " " + response + "\n");
if (response.getStatus() != Response.Status.OK.getStatusCode()) {
_logger.errorf("GetObject: Did not get an OK response\n");
return null;
}
// see if we have a filename header
// String outFileStr = objectName;
//
// MultivaluedMap<String, String> headers =
// response.getStringHeaders();
//
// if (headers.containsKey(CoordConsts.SVC_FILENAME_HDR)) {
// String value = headers.getFirst(CoordConsts.SVC_FILENAME_HDR);
// if (value != null && !value.equals("")) {
// outFileStr = value;
// }
// }
File inFile = response.readEntity(File.class);
File tmpOutFile = Files.createTempFile("batfish_client", null)
.toFile();
tmpOutFile.deleteOnExit();
FileUtils.copyFile(inFile, tmpOutFile);
if (!inFile.delete()) {
throw new BatfishException("Failed to delete temporary file: "
+ inFile.getAbsolutePath());
}
return tmpOutFile.getAbsolutePath();
}
catch (Exception e) {
_logger.errorf("Exception in getObject from %s using (%s, %s)\n",
_coordWorkMgr, testrigName, objectName);
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
private WebTarget getTarget(Client client, String resource) {
String protocol = (_settings.getUseSsl()) ? "https" : "http";
String urlString = String.format("%s://%s%s/%s", protocol, _coordWorkMgr,
CoordConsts.SVC_BASE_WORK_MGR, resource);
return client.target(urlString);
}
public WorkItem getWorkItemAnswerQuestion(String questionName,
String containerName, String testrigName, String envName,
String deltaTestrig, String deltaEnvName, boolean isDelta) {
WorkItem wItem = new WorkItem(containerName, testrigName);
wItem.addRequestParam(BfConsts.COMMAND_ANSWER, "");
wItem.addRequestParam(BfConsts.ARG_QUESTION_NAME, questionName);
wItem.addRequestParam(BfConsts.ARG_ENVIRONMENT_NAME, envName);
if (deltaEnvName != null) {
wItem.addRequestParam(BfConsts.ARG_DELTA_ENVIRONMENT_NAME,
deltaEnvName);
}
if (deltaTestrig != null) {
wItem.addRequestParam(BfConsts.ARG_DELTA_TESTRIG, deltaTestrig);
}
if (isDelta) {
wItem.addRequestParam(BfConsts.ARG_DIFF_ACTIVE, "");
}
return wItem;
}
public WorkItem getWorkItemCompileDeltaEnvironment(String containerName,
String testrigName, String envName, String diffEnvName) {
WorkItem wItem = new WorkItem(containerName, testrigName);
wItem.addRequestParam(BfConsts.COMMAND_COMPILE_DIFF_ENVIRONMENT, "");
wItem.addRequestParam(BfConsts.ARG_ENVIRONMENT_NAME, envName);
wItem.addRequestParam(BfConsts.ARG_DELTA_ENVIRONMENT_NAME, diffEnvName);
wItem.addRequestParam(BfConsts.ARG_DIFF_ACTIVE, "");
return wItem;
}
public WorkItem getWorkItemGenerateDataPlane(String containerName,
String testrigName, String envName) {
WorkItem wItem = new WorkItem(containerName, testrigName);
wItem.addRequestParam(BfConsts.COMMAND_DUMP_DP, "");
wItem.addRequestParam(BfConsts.ARG_ENVIRONMENT_NAME, envName);
return wItem;
}
public WorkItem getWorkItemGenerateDeltaDataPlane(String containerName,
String testrigName, String envName, String deltaTestrigName,
String deltaEnvName) {
WorkItem wItem = new WorkItem(containerName, testrigName);
wItem.addRequestParam(BfConsts.COMMAND_DUMP_DP, "");
wItem.addRequestParam(BfConsts.ARG_ENVIRONMENT_NAME, envName);
wItem.addRequestParam(BfConsts.ARG_DELTA_TESTRIG, deltaTestrigName);
wItem.addRequestParam(BfConsts.ARG_DELTA_ENVIRONMENT_NAME, deltaEnvName);
wItem.addRequestParam(BfConsts.ARG_DIFF_ACTIVE, "");
return wItem;
}
public WorkItem getWorkItemParse(String containerName, String testrigName,
boolean doDelta) {
WorkItem wItem = new WorkItem(containerName, testrigName);
wItem.addRequestParam(BfConsts.COMMAND_PARSE_VENDOR_INDEPENDENT, "");
wItem.addRequestParam(BfConsts.COMMAND_PARSE_VENDOR_SPECIFIC, "");
wItem.addRequestParam(BfConsts.COMMAND_INIT_INFO, "");
wItem.addRequestParam(BfConsts.ARG_UNIMPLEMENTED_SUPPRESS, "");
if (doDelta) {
wItem.addRequestParam(BfConsts.ARG_DIFF_ACTIVE, "");
}
return wItem;
}
public WorkItem getWorkItemRunAnalysis(String analysisName,
String containerName, String testrigName, String envName,
String deltaTestrig, String deltaEnvName, boolean delta,
boolean differential) {
WorkItem wItem = new WorkItem(containerName, testrigName);
wItem.addRequestParam(BfConsts.COMMAND_ANALYZE, "");
wItem.addRequestParam(BfConsts.ARG_ANALYSIS_NAME, analysisName);
wItem.addRequestParam(BfConsts.ARG_TESTRIG, testrigName);
wItem.addRequestParam(BfConsts.ARG_ENVIRONMENT_NAME, envName);
if (differential || delta) {
wItem.addRequestParam(BfConsts.ARG_DELTA_TESTRIG, deltaTestrig);
wItem.addRequestParam(BfConsts.ARG_DELTA_ENVIRONMENT_NAME,
deltaEnvName);
}
if (delta) {
wItem.addRequestParam(BfConsts.ARG_DIFF_ACTIVE, "");
}
if (differential) {
wItem.addRequestParam(BfConsts.ARG_DIFFERENTIAL, "");
}
return wItem;
}
public Pair<WorkStatusCode, String> getWorkStatus(UUID parseWorkUUID) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_GET_WORKSTATUS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_WORKID_KEY,
parseWorkUUID.toString());
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_WORKSTATUS_KEY)) {
_logger.errorf("workstatus key not found in: %s\n",
jObj.toString());
return null;
}
WorkStatusCode workStatus = WorkStatusCode
.valueOf(jObj.getString(CoordConsts.SVC_WORKSTATUS_KEY));
if (!jObj.has(CoordConsts.SVC_TASKSTATUS_KEY)) {
_logger.errorf("taskstatus key not found in: %s\n",
jObj.toString());
}
String taskStr = jObj.getString(CoordConsts.SVC_TASKSTATUS_KEY);
return new Pair<>(workStatus, taskStr);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public String initContainer(String containerPrefix) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_INIT_CONTAINER_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_PREFIX_KEY,
containerPrefix);
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_CONTAINER_NAME_KEY)) {
_logger.errorf("container name key not found in: %s\n",
jObj.toString());
return null;
}
return jObj.getString(CoordConsts.SVC_CONTAINER_NAME_KEY);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public boolean isReachable(boolean chatty) throws Exception {
WebTarget webTarget = null;
try {
Client client = getClientBuilder().build();
webTarget = getTarget(client, "");
Response response = webTarget.request().get();
_logger.info(response.getStatus() + " " + response.getStatusInfo()
+ " " + response + "\n");
if (response.getStatus() != Response.Status.OK.getStatusCode()) {
_logger.errorf("GetObject: Did not get an OK response\n");
return false;
}
return true;
}
catch (ProcessingException e) {
if (e.getMessage().contains("ConnectException")) {
if (chatty) {
_logger.errorf(
"BF-Client: unable to connect to coordinator at %s\n",
webTarget.getUri().toString());
}
return false;
}
if (e.getMessage().contains("SSLHandshakeException")) {
if (chatty) {
_logger.errorf(
"SSL handshake exception while connecting to coordinator (Is the coordinator using SSL and using keys that you trust?)\n");
}
return false;
}
if (e.getMessage()
.contains("SocketException: Unexpected end of file")) {
if (chatty) {
_logger.errorf(
"SocketException while connecting to coordinator. (Are you using SSL?)\n");
}
return false;
}
throw e;
}
}
public JSONObject listAnalyses(String containerName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_LIST_ANALYSES_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_ANALYSIS_LIST_KEY)) {
_logger.errorf("analysis list key not found in: %s\n",
jObj.toString());
return null;
}
return jObj.getJSONObject(CoordConsts.SVC_ANALYSIS_LIST_KEY);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public String[] listContainers() {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_LIST_CONTAINERS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_CONTAINER_LIST_KEY)) {
_logger.errorf("container list key not found in: %s\n",
jObj.toString());
return null;
}
JSONArray containerArray = jObj
.getJSONArray(CoordConsts.SVC_CONTAINER_LIST_KEY);
String[] containerList = new String[containerArray.length()];
for (int index = 0; index < containerArray.length(); index++) {
containerList[index] = containerArray.getString(index);
}
return containerList;
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public String[] listEnvironments(String containerName, String testrigName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_LIST_ENVIRONMENTS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_ENVIRONMENT_LIST_KEY)) {
_logger.errorf("environment list key not found in: %s\n",
jObj.toString());
return null;
}
JSONArray environmentArray = jObj
.getJSONArray(CoordConsts.SVC_ENVIRONMENT_LIST_KEY);
String[] environmentList = new String[environmentArray.length()];
for (int index = 0; index < environmentArray.length(); index++) {
environmentList[index] = environmentArray.getString(index);
}
return environmentList;
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public String[] listQuestions(String containerName, String testrigName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_LIST_QUESTIONS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_QUESTION_LIST_KEY)) {
_logger.errorf("question list key not found in: %s\n",
jObj.toString());
return null;
}
JSONArray questionArray = jObj
.getJSONArray(CoordConsts.SVC_QUESTION_LIST_KEY);
String[] questionList = new String[questionArray.length()];
for (int index = 0; index < questionArray.length(); index++) {
questionList[index] = questionArray.getString(index);
}
return questionList;
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public Map<String, String> listTestrigs(String containerName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_LIST_TESTRIGS_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
if (containerName != null) {
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
}
JSONObject jObj = postData(webTarget, multiPart);
if (jObj == null) {
return null;
}
if (!jObj.has(CoordConsts.SVC_TESTRIG_LIST_KEY)) {
_logger.errorf("testrig key not found in: %s\n", jObj.toString());
return null;
}
JSONArray testrigArray = jObj
.getJSONArray(CoordConsts.SVC_TESTRIG_LIST_KEY);
Map<String, String> testrigs = new HashMap<>();
for (int index = 0; index < testrigArray.length(); index++) {
JSONObject jObjTestrig = testrigArray.getJSONObject(index);
testrigs.put(
jObjTestrig.getString(CoordConsts.SVC_TESTRIG_NAME_KEY),
jObjTestrig.getString(CoordConsts.SVC_TESTRIG_INFO_KEY));
}
return testrigs;
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return null;
}
}
public JSONObject postData(WebTarget webTarget, MultiPart multiPart)
throws Exception {
try {
addTextMultiPart(multiPart, CoordConsts.SVC_VERSION_KEY,
Version.getVersion());
Response response = webTarget.request(MediaType.APPLICATION_JSON)
.post(Entity.entity(multiPart, multiPart.getMediaType()));
_logger.debugf(response.getStatus() + " " + response.getStatusInfo()
+ " " + response + "\n");
if (response.getStatus() != Response.Status.OK.getStatusCode()) {
System.err.printf("PostData: Did not get an OK response\n");
return null;
}
String sobj = response.readEntity(String.class);
JSONArray array = new JSONArray(sobj);
_logger.debugf("response: %s [%s] [%s]\n", array.toString(),
array.get(0), array.get(1));
if (!array.get(0).equals(CoordConsts.SVC_SUCCESS_KEY)) {
_logger.errorf("Error in PostData: %s %s\n", array.get(0),
array.get(1));
return null;
}
return new JSONObject(array.get(1).toString());
}
catch (ProcessingException e) {
if (e.getMessage().contains("ConnectException")) {
_logger.errorf("unable to connect to coordinator at %s\n",
_coordWorkMgr);
return null;
}
if (e.getMessage().contains("SSLHandshakeException")) {
_logger.errorf(
"SSL handshake exception while connecting to coordinator (Is the coordinator using SSL and using keys that you trust?)\n");
return null;
}
if (e.getMessage()
.contains("SocketException: Unexpected end of file")) {
_logger.errorf(
"SocketException while connecting to coordinator. (Are you using SSL?)\n");
return null;
}
throw e;
}
}
public boolean queueWork(WorkItem wItem) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_QUEUE_WORK_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_WORKITEM_KEY,
wItem.toJsonString());
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
JSONObject jObj = postData(webTarget, multiPart);
return (jObj != null);
}
catch (Exception e) {
_logger.errorf("exception: ");
_logger.error(ExceptionUtils.getFullStackTrace(e) + "\n");
return false;
}
}
public boolean uploadCustomObject(String containerName, String testrigName,
String objName, String objFileName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_PUT_OBJECT_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
addTextMultiPart(multiPart, CoordConsts.SVC_OBJECT_NAME_KEY, objName);
addFileMultiPart(multiPart, CoordConsts.SVC_FILE_KEY, objFileName);
return postData(webTarget, multiPart) != null;
}
catch (Exception e) {
if (e.getMessage().contains("FileNotFoundException")) {
_logger.errorf("File not found: %s\n", objFileName);
}
else {
_logger.errorf(
"Exception when uploading custom object to %s using (%s, %s, %s): %s\n",
_coordWorkMgr, testrigName, objName, objFileName,
ExceptionUtils.getStackTrace(e));
}
return false;
}
}
public boolean uploadEnvironment(String containerName, String testrigName,
String envName, String zipfileName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_UPLOAD_ENV_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
addTextMultiPart(multiPart, CoordConsts.SVC_ENV_NAME_KEY, envName);
addFileMultiPart(multiPart, CoordConsts.SVC_ZIPFILE_KEY, zipfileName);
return postData(webTarget, multiPart) != null;
}
catch (Exception e) {
if (e.getMessage().contains("FileNotFoundException")) {
_logger.errorf("File not found: %s\n", zipfileName);
}
else {
_logger.errorf(
"Exception when uploading environment to %s using (%s, %s, %s): %s\n",
_coordWorkMgr, testrigName, envName, zipfileName,
ExceptionUtils.getStackTrace(e));
}
return false;
}
}
public boolean uploadQuestion(String containerName, String testrigName,
String qName, String qFileName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_UPLOAD_QUESTION_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
addTextMultiPart(multiPart, CoordConsts.SVC_QUESTION_NAME_KEY, qName);
addFileMultiPart(multiPart, CoordConsts.SVC_FILE_KEY, qFileName);
return postData(webTarget, multiPart) != null;
}
catch (Exception e) {
if (e.getMessage().contains("FileNotFoundException")) {
_logger.errorf("File not found: %s (question file)\n", qFileName);
}
else {
_logger.errorf(
"Exception when uploading question to %s using (%s, %s, %s): %s\n",
_coordWorkMgr, testrigName, qName, qFileName,
ExceptionUtils.getStackTrace(e));
}
return false;
}
}
public boolean uploadTestrig(String containerName, String testrigName,
String zipfileName) {
try {
Client client = getClientBuilder().build();
WebTarget webTarget = getTarget(client,
CoordConsts.SVC_UPLOAD_TESTRIG_RSC);
MultiPart multiPart = new MultiPart();
multiPart.setMediaType(MediaType.MULTIPART_FORM_DATA_TYPE);
addTextMultiPart(multiPart, CoordConsts.SVC_API_KEY,
_settings.getApiKey());
addTextMultiPart(multiPart, CoordConsts.SVC_CONTAINER_NAME_KEY,
containerName);
addTextMultiPart(multiPart, CoordConsts.SVC_TESTRIG_NAME_KEY,
testrigName);
addFileMultiPart(multiPart, CoordConsts.SVC_ZIPFILE_KEY, zipfileName);
return postData(webTarget, multiPart) != null;
}
catch (Exception e) {
if (e.getMessage().contains("FileNotFoundException")) {
_logger.errorf("File not found: %s\n", zipfileName);
}
else {
_logger.errorf(
"Exception when uploading test rig to %s using (%s, %s, %s): %s\n",
_coordWorkMgr, containerName, testrigName, zipfileName,
ExceptionUtils.getStackTrace(e));
}
return false;
}
}
// private String uriEncode(String input) {
// return UriComponent.encode(input,
// UriComponent.Type.QUERY_PARAM_SPACE_ENCODED);
// }
}