blob: 9c9fc83bce9de2ef8e0a84a78159dac53353e58e [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 com.cloud.test.regression;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Properties;
import java.util.Random;
import java.util.Set;
import java.util.TreeMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.methods.GetMethod;
import org.apache.log4j.Logger;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import com.cloud.test.utils.UtilsForTest;
public class ApiCommand {
public static final Logger s_logger = Logger.getLogger(ApiCommand.class.getName());
public static enum CommandType {
HTTP, MYSQL, SCRIPT;
}
public static enum ResponseType {
ERROR, EMPTY;
}
private Element xmlCommand;
private String commandName;
private String testCaseInfo;
private boolean isUserCommand;
private boolean isAsync = false;
private CommandType commandType;
private ResponseType responseType;
private TreeMap<String, String> urlParam;
private HashMap<String, String> verifyParam = new HashMap<String, String>();;
private HashMap<String, String> setParam = new HashMap<String, String>();;
private int responseCode;
private Element responseBody;
private String command;
private String host;
private boolean list;
private Element listName;
private Element listId;
private boolean required = false;
private ResultSet result;
public ApiCommand(Element fstElmnt, HashMap<String, String> param, HashMap<String, String> commands) {
this.setXmlCommand(fstElmnt);
this.setCommandName();
this.setResponseType();
this.setUserCommand();
this.setCommandType();
this.setTestCaseInfo();
this.setUrlParam(param);
this.setVerifyParam(param);
this.setHost("http://" + param.get("hostip"));
this.setCommand(param);
String async = commands.get(this.getName());
if (async != null && async.equals("yes")) {
this.isAsync = true;
}
}
public Element getXmlCommand() {
return xmlCommand;
}
public void setXmlCommand(Element xmlCommand) {
this.xmlCommand = xmlCommand;
}
// ================FOLLOWING METHODS USE INPUT XML FILE=======================//
public void setCommandName() {
NodeList commandName = this.xmlCommand.getElementsByTagName("name");
Element commandElmnt = (Element)commandName.item(0);
NodeList commandNm = commandElmnt.getChildNodes();
this.commandName = (commandNm.item(0).getNodeValue());
}
public String getName() {
return commandName;
}
public void setTestCaseInfo() {
this.testCaseInfo = getElementByName("testcase");
}
public String getHost() {
return host;
}
public void setHost(String host) {
this.host = host;
}
public void setResponseType() {
boolean result = verifyTagValue("error", "true");
if (result) {
this.responseType = ResponseType.ERROR;
return;
}
result = verifyTagValue("empty", "true");
if (result) {
this.responseType = ResponseType.EMPTY;
}
}
public void setResponseType(ResponseType responseType) {
this.responseType = responseType;
}
public ResponseType getResponseType() {
return responseType;
}
public void setUserCommand() {
boolean result = verifyTagValue("usercommand", "true");
this.isUserCommand = result;
}
public void setCommandType() {
boolean result = verifyTagValue("mysql", "true");
if (result) {
this.commandType = CommandType.MYSQL;
return;
}
result = verifyTagValue("script", "true");
if (result) {
this.commandType = CommandType.SCRIPT;
return;
}
this.commandType = CommandType.HTTP;
}
public CommandType getCommandType() {
return commandType;
}
public String getTestCaseInfo() {
return testCaseInfo;
}
public Boolean getRequired() {
return required;
}
public void setUrlParam(HashMap<String, String> param) {
this.urlParam = new TreeMap<String, String>();
NodeList parameterLst = this.xmlCommand.getElementsByTagName("parameters");
if (parameterLst != null) {
for (int j = 0; j < parameterLst.getLength(); j++) {
Element parameterElement = (Element)parameterLst.item(j);
NodeList itemLst = parameterElement.getElementsByTagName("item");
for (int k = 0; k < itemLst.getLength(); k++) {
Node item = itemLst.item(k);
if (item.getNodeType() == Node.ELEMENT_NODE) {
Element itemElement = (Element)item;
NodeList itemName = itemElement.getElementsByTagName("name");
Element itemNameElement = (Element)itemName.item(0);
// get value
Element itemValueElement = null;
if ((itemElement.getElementsByTagName("value") != null) && (itemElement.getElementsByTagName("value").getLength() != 0)) {
NodeList itemValue = itemElement.getElementsByTagName("value");
itemValueElement = (Element)itemValue.item(0);
}
Element itemParamElement = null;
// getparam
if ((itemElement.getElementsByTagName("param") != null) && (itemElement.getElementsByTagName("param").getLength() != 0)) {
NodeList itemParam = itemElement.getElementsByTagName("param");
itemParamElement = (Element)itemParam.item(0);
}
if ((itemElement.getAttribute("getparam").equals("true")) && (itemParamElement != null)) {
this.urlParam.put(itemNameElement.getTextContent(), param.get(itemParamElement.getTextContent()));
} else if (itemValueElement != null) {
this.urlParam.put(itemNameElement.getTextContent(), itemValueElement.getTextContent());
} else if (itemElement.getAttribute("random").equals("true")) {
Random ran = new Random();
String randomString = Math.abs(ran.nextInt()) + "-randomName";
this.urlParam.put(itemNameElement.getTextContent(), randomString);
if ((itemElement.getAttribute("setparam").equals("true")) && (itemParamElement != null)) {
param.put(itemParamElement.getTextContent(), randomString);
}
} else if (itemElement.getAttribute("randomnumber").equals("true")) {
Random ran = new Random();
Integer randomNumber = Math.abs(ran.nextInt(65535));
this.urlParam.put(itemNameElement.getTextContent(), randomNumber.toString());
if ((itemElement.getAttribute("setparam").equals("true")) && (itemParamElement != null)) {
param.put(itemParamElement.getTextContent(), randomNumber.toString());
}
}
}
}
}
}
}
// Set command URL
public void setCommand(HashMap<String, String> param) {
if (this.getCommandType() == CommandType.SCRIPT) {
String temp = "bash xen/" + this.commandName;
Set<?> c = this.urlParam.entrySet();
Iterator<?> it = c.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
try {
temp = temp + " -" + key + " " + value;
} catch (Exception ex) {
s_logger.error("Unable to set parameter " + key + " for the command " + this.getName());
}
}
this.command = temp;
} else if (this.getCommandType() == CommandType.MYSQL) {
String temp = this.commandName + " where ";
Set<?> c = this.urlParam.entrySet();
Iterator<?> it = c.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
try {
temp = temp + key + "=" + value;
} catch (Exception ex) {
s_logger.error("Unable to set parameter " + key + " for the command " + this.getName());
}
}
this.command = temp;
s_logger.info("The command is " + this.command);
} else {
if ((param.get("apikey") == null) || (param.get("secretkey") == null) || (this.isUserCommand == false)) {
String temp = this.host + ":8096/?command=" + this.commandName;
Set<?> c = this.urlParam.entrySet();
Iterator<?> it = c.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
try {
temp = temp + "&" + key + "=" + URLEncoder.encode(value, "UTF-8");
} catch (Exception ex) {
s_logger.error("Unable to set parameter " + key + " for the command " + this.getName());
}
}
this.command = temp;
} else if (isUserCommand == true) {
String apiKey = param.get("apikey");
String secretKey = param.get("secretkey");
String temp = "";
this.urlParam.put("apikey", apiKey);
this.urlParam.put("command", this.commandName);
// sort url hash map by key
Set<?> c = this.urlParam.entrySet();
Iterator<?> it = c.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
try {
temp = temp + key + "=" + URLEncoder.encode(value, "UTF-8") + "&";
} catch (Exception ex) {
s_logger.error("Unable to set parameter " + value + " for the command " + this.getName());
}
}
temp = temp.substring(0, temp.length() - 1);
String requestToSign = temp.toLowerCase();
String signature = UtilsForTest.signRequest(requestToSign, secretKey);
String encodedSignature = "";
try {
encodedSignature = URLEncoder.encode(signature, "UTF-8");
} catch (Exception ex) {
s_logger.error(ex);
}
this.command = this.host + ":8080/client/api/?" + temp + "&signature=" + encodedSignature;
}
}
}
public void setVerifyParam(HashMap<String, String> param) {
NodeList returnLst = this.xmlCommand.getElementsByTagName("returnvalue");
if (returnLst != null) {
for (int m = 0; m < returnLst.getLength(); m++) {
Element returnElement = (Element)returnLst.item(m);
if (returnElement.getAttribute("list").equals("true")) {
this.list = true;
NodeList elementLst = returnElement.getElementsByTagName("element");
this.listId = (Element)elementLst.item(0);
NodeList elementName = returnElement.getElementsByTagName("name");
this.listName = (Element)elementName.item(0);
} else {
this.list = false;
}
NodeList itemLst1 = returnElement.getElementsByTagName("item");
if (itemLst1 != null) {
for (int n = 0; n < itemLst1.getLength(); n++) {
Node item = itemLst1.item(n);
if (item.getNodeType() == Node.ELEMENT_NODE) {
Element itemElement = (Element)item;
// get parameter name
NodeList itemName = itemElement.getElementsByTagName("name");
Element itemNameElement = (Element)itemName.item(0);
// Get parameters for future use
if (itemElement.getAttribute("setparam").equals("true")) {
NodeList itemVariable = itemElement.getElementsByTagName("param");
Element itemVariableElement = (Element)itemVariable.item(0);
setParam.put(itemVariableElement.getTextContent(), itemNameElement.getTextContent());
this.required = true;
} else if (itemElement.getAttribute("getparam").equals("true")) {
NodeList itemVariable = itemElement.getElementsByTagName("param");
Element itemVariableElement = (Element)itemVariable.item(0);
this.verifyParam.put(itemNameElement.getTextContent(), param.get(itemVariableElement.getTextContent()));
} else if ((itemElement.getElementsByTagName("value") != null) && (itemElement.getElementsByTagName("value").getLength() != 0)) {
NodeList itemVariable = itemElement.getElementsByTagName("value");
Element itemVariableElement = (Element)itemVariable.item(0);
this.verifyParam.put(itemNameElement.getTextContent(), itemVariableElement.getTextContent());
} else {
this.verifyParam.put(itemNameElement.getTextContent(), "no value");
}
}
}
}
}
}
}
public int getResponseCode() {
return responseCode;
}
// Send api command to the server
public void sendCommand(HttpClient client, Connection conn) {
if (TestCaseEngine.s_printUrl == true) {
s_logger.info("url is " + this.command);
}
if (this.getCommandType() == CommandType.SCRIPT) {
try {
s_logger.info("Executing command " + this.command);
Runtime rtime = Runtime.getRuntime();
Process child = rtime.exec(this.command);
Thread.sleep(10000);
int retCode = child.waitFor();
if (retCode != 0) {
this.responseCode = retCode;
} else {
this.responseCode = 200;
}
} catch (Exception ex) {
s_logger.error("Unable to execute a command " + this.command, ex);
}
} else if (this.getCommandType() == CommandType.MYSQL) {
try {
Statement stmt = conn.createStatement();
this.result = stmt.executeQuery(this.command);
this.responseCode = 200;
} catch (Exception ex) {
this.responseCode = 400;
s_logger.error("Unable to execute mysql query " + this.command, ex);
}
} else {
HttpMethod method = new GetMethod(this.command);
try {
this.responseCode = client.executeMethod(method);
if (this.responseCode == 200) {
InputStream is = method.getResponseBodyAsStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
doc.getDocumentElement().normalize();
if (!(this.isAsync)) {
this.responseBody = doc.getDocumentElement();
} else {
// get async job result
Element jobTag = (Element)doc.getDocumentElement().getElementsByTagName("jobid").item(0);
String jobId = jobTag.getTextContent();
Element responseBodyAsyncEl = queryAsyncJobResult(jobId);
if (responseBodyAsyncEl == null) {
s_logger.error("Can't get a async result");
} else {
this.responseBody = responseBodyAsyncEl;
// get status of the job
Element jobStatusTag = (Element)responseBodyAsyncEl.getElementsByTagName("jobstatus").item(0);
String jobStatus = jobStatusTag.getTextContent();
if (!jobStatus.equals("1")) { // Need to modify with different error codes for jobAsync
// results
// set fake response code by now
this.responseCode = 400;
}
}
}
}
if (TestCaseEngine.s_printUrl == true) {
s_logger.info("Response code is " + this.responseCode);
}
} catch (Exception ex) {
s_logger.error("Command " + command + " failed with exception " + ex.getMessage());
} finally {
method.releaseConnection();
}
}
}
// verify if response is empty (contains only root element)
public boolean isEmpty() {
boolean result = false;
if (!this.responseBody.hasChildNodes())
result = true;
return result;
}
// ================FOLLOWING METHODS USE RETURN XML FILE=======================//
public boolean setParam(HashMap<String, String> param) {
if ((this.responseBody == null) && (this.commandType == CommandType.HTTP)) {
s_logger.error("Response body is empty");
return false;
}
Boolean result = true;
if (this.getCommandType() == CommandType.MYSQL) {
Set<?> set = this.setParam.entrySet();
Iterator<?> it = set.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
try {
String itemName = null;
while (this.result.next()) {
itemName = this.result.getString(value);
}
if (itemName != null) {
param.put(key, itemName);
} else {
s_logger.error("Following return parameter is missing: " + value);
result = false;
}
} catch (Exception ex) {
s_logger.error("Unable to set parameter " + value, ex);
}
}
} else if (this.getCommandType() == CommandType.HTTP) {
if (this.list == false) {
Set<?> set = this.setParam.entrySet();
Iterator<?> it = set.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
// set parameters needed for the future use
NodeList itemName = this.responseBody.getElementsByTagName(value);
if ((itemName != null) && (itemName.getLength() != 0)) {
for (int i = 0; i < itemName.getLength(); i++) {
Element itemNameElement = (Element)itemName.item(i);
if (itemNameElement.getChildNodes().getLength() <= 1) {
param.put(key, itemNameElement.getTextContent());
break;
}
}
} else {
s_logger.error("Following return parameter is missing: " + value);
result = false;
}
}
} else {
Set<?> set = this.setParam.entrySet();
Iterator<?> it = set.iterator();
NodeList returnLst = this.responseBody.getElementsByTagName(this.listName.getTextContent());
Node requiredNode = returnLst.item(Integer.parseInt(this.listId.getTextContent()));
if (requiredNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element)requiredNode;
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
NodeList itemName = fstElmnt.getElementsByTagName(value);
if ((itemName != null) && (itemName.getLength() != 0)) {
Element itemNameElement = (Element)itemName.item(0);
if (itemNameElement.getChildNodes().getLength() <= 1) {
param.put(key, itemNameElement.getTextContent());
}
} else {
s_logger.error("Following return parameter is missing: " + value);
result = false;
}
}
}
}
}
return result;
}
public String getUrl() {
return command;
}
public boolean verifyParam() {
boolean result = true;
if (this.getCommandType() == CommandType.HTTP) {
if (this.list == false) {
Set<?> set = verifyParam.entrySet();
Iterator<?> it = set.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
if (value == null) {
s_logger.error("Parameter " + key + " is missing in the list of global parameters");
return false;
}
NodeList itemName = this.responseBody.getElementsByTagName(key);
if ((itemName.getLength() != 0) && (itemName != null)) {
Element itemNameElement = (Element)itemName.item(0);
if (itemNameElement.hasChildNodes()) {
continue;
}
if (!(verifyParam.get(key).equals("no value")) && !(itemNameElement.getTextContent().equals(verifyParam.get(key)))) {
s_logger.error("Incorrect value for the following tag: " + key + ". Expected value is " + verifyParam.get(key) + " while actual value is " +
itemNameElement.getTextContent());
result = false;
}
} else {
s_logger.error("Following xml element is missing in the response: " + key);
result = false;
}
}
}
// for multiple elements
else {
Set<?> set = verifyParam.entrySet();
Iterator<?> it = set.iterator();
// get list element specified by id
NodeList returnLst = this.responseBody.getElementsByTagName(this.listName.getTextContent());
Node requiredNode = returnLst.item(Integer.parseInt(this.listId.getTextContent()));
if (requiredNode.getNodeType() == Node.ELEMENT_NODE) {
Element fstElmnt = (Element)requiredNode;
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
if (value == null) {
s_logger.error("Parameter " + key + " is missing in the list of global parameters");
return false;
}
NodeList itemName = fstElmnt.getElementsByTagName(key);
if ((itemName.getLength() != 0) && (itemName != null)) {
Element itemNameElement = (Element)itemName.item(0);
if (!(verifyParam.get(key).equals("no value")) && !(itemNameElement.getTextContent().equals(verifyParam.get(key)))) {
s_logger.error("Incorrect value for the following tag: " + key + ". Expected value is " + verifyParam.get(key) +
" while actual value is " + itemNameElement.getTextContent());
result = false;
}
} else {
s_logger.error("Following xml element is missing in the response: " + key);
result = false;
}
}
}
}
} else if (this.getCommandType() == CommandType.MYSQL) {
Set<?> set = verifyParam.entrySet();
Iterator<?> it = set.iterator();
while (it.hasNext()) {
Map.Entry<?, ?> me = (Map.Entry<?, ?>)it.next();
String key = (String)me.getKey();
String value = (String)me.getValue();
if (value == null) {
s_logger.error("Parameter " + key + " is missing in the list of global parameters");
return false;
}
String itemName = null;
try {
while (this.result.next()) {
itemName = this.result.getString(key);
}
} catch (Exception ex) {
s_logger.error("Unable to get element from result set " + key);
}
if (!(value.equals("no value")) && !(itemName.equals(verifyParam.get(key)))) {
s_logger.error("Incorrect value for the following tag: " + key + ". Expected value is " + verifyParam.get(key) + " while actual value is " + itemName);
result = false;
}
}
}
return result;
}
public static boolean verifyEvents(String fileName, String level, String host, String account) {
boolean result = false;
HashMap<String, Integer> expectedEvents = new HashMap<String, Integer>();
HashMap<String, Integer> actualEvents = new HashMap<String, Integer>();
String key = "";
File file = new File(fileName);
if (file.exists()) {
Properties pro = new Properties();
try {
// get expected events
FileInputStream in = new FileInputStream(file);
pro.load(in);
Enumeration<?> en = pro.propertyNames();
while (en.hasMoreElements()) {
key = (String)en.nextElement();
expectedEvents.put(key, Integer.parseInt(pro.getProperty(key)));
}
// get actual events
String url = host + "/?command=listEvents&account=" + account + "&level=" + level + "&domainid=1&pagesize=100";
s_logger.info("Getting events with the following url " + url);
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);
int responseCode = client.executeMethod(method);
if (responseCode == 200) {
InputStream is = method.getResponseBodyAsStream();
ArrayList<HashMap<String, String>> eventValues = UtilsForTest.parseMulXML(is, new String[] {"event"});
for (int i = 0; i < eventValues.size(); i++) {
HashMap<String, String> element = eventValues.get(i);
if (element.get("level").equals(level)) {
if (actualEvents.containsKey(element.get("type")) == true) {
actualEvents.put(element.get("type"), actualEvents.get(element.get("type")) + 1);
} else {
actualEvents.put(element.get("type"), 1);
}
}
}
}
method.releaseConnection();
// compare actual events with expected events
// compare expected result and actual result
Iterator<?> iterator = expectedEvents.keySet().iterator();
Integer expected;
Integer actual;
int fail = 0;
while (iterator.hasNext()) {
expected = null;
actual = null;
String type = iterator.next().toString();
expected = expectedEvents.get(type);
actual = actualEvents.get(type);
if (actual == null) {
s_logger.error("Event of type " + type + " and level " + level + " is missing in the listEvents response. Expected number of these events is " +
expected);
fail++;
} else if (expected.compareTo(actual) != 0) {
fail++;
s_logger.info("Amount of events of " + type + " type and level " + level + " is incorrect. Expected number of these events is " + expected +
", actual number is " + actual);
}
}
if (fail == 0) {
result = true;
}
} catch (Exception ex) {
s_logger.error(ex);
}
} else {
s_logger.info("File " + fileName + " not found");
}
return result;
}
public static boolean verifyEvents(HashMap<String, Integer> expectedEvents, String level, String host, String parameters) {
boolean result = false;
HashMap<String, Integer> actualEvents = new HashMap<String, Integer>();
try {
// get actual events
String url = host + "/?command=listEvents&" + parameters;
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);
int responseCode = client.executeMethod(method);
if (responseCode == 200) {
InputStream is = method.getResponseBodyAsStream();
ArrayList<HashMap<String, String>> eventValues = UtilsForTest.parseMulXML(is, new String[] {"event"});
for (int i = 0; i < eventValues.size(); i++) {
HashMap<String, String> element = eventValues.get(i);
if (element.get("level").equals(level)) {
if (actualEvents.containsKey(element.get("type")) == true) {
actualEvents.put(element.get("type"), actualEvents.get(element.get("type")) + 1);
} else {
actualEvents.put(element.get("type"), 1);
}
}
}
}
method.releaseConnection();
} catch (Exception ex) {
s_logger.error(ex);
}
// compare actual events with expected events
Iterator<?> iterator = expectedEvents.keySet().iterator();
Integer expected;
Integer actual;
int fail = 0;
while (iterator.hasNext()) {
expected = null;
actual = null;
String type = iterator.next().toString();
expected = expectedEvents.get(type);
actual = actualEvents.get(type);
if (actual == null) {
s_logger.error("Event of type " + type + " and level " + level + " is missing in the listEvents response. Expected number of these events is " + expected);
fail++;
} else if (expected.compareTo(actual) != 0) {
fail++;
s_logger.info("Amount of events of " + type + " type and level " + level + " is incorrect. Expected number of these events is " + expected +
", actual number is " + actual);
}
}
if (fail == 0) {
result = true;
}
return result;
}
public Element queryAsyncJobResult(String jobId) {
Element returnBody = null;
int code = 400;
String resultUrl = this.host + ":8096/?command=queryAsyncJobResult&jobid=" + jobId;
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(resultUrl);
while (true) {
try {
code = client.executeMethod(method);
if (code == 200) {
InputStream is = method.getResponseBodyAsStream();
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document doc = builder.parse(is);
doc.getDocumentElement().normalize();
returnBody = doc.getDocumentElement();
Element jobStatusTag = (Element)returnBody.getElementsByTagName("jobstatus").item(0);
String jobStatus = jobStatusTag.getTextContent();
if (jobStatus.equals("0")) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
s_logger.debug("[ignored] interrupted while during async job result query.");
}
} else {
break;
}
method.releaseConnection();
} else {
s_logger.error("Error during queryJobAsync. Error code is " + code);
this.responseCode = code;
return null;
}
} catch (Exception ex) {
s_logger.error(ex);
}
}
return returnBody;
}
private String getElementByName(String elementName) {
NodeList commandName = this.xmlCommand.getElementsByTagName(elementName);
if (commandName.getLength() != 0) {
Element commandElmnt = (Element)commandName.item(0);
NodeList commandNm = commandElmnt.getChildNodes();
return commandNm.item(0).getNodeValue();
} else {
return null;
}
}
private boolean verifyTagValue(String elementName, String expectedValue) {
NodeList tag = this.xmlCommand.getElementsByTagName(elementName);
if (tag.getLength() != 0) {
Element commandElmnt = (Element)tag.item(0);
NodeList commandNm = commandElmnt.getChildNodes();
if (commandNm.item(0).getNodeValue().equals(expectedValue)) {
return true;
} else {
return false;
}
} else {
return false;
}
}
}