mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
209 lines
8.4 KiB
Java
209 lines
8.4 KiB
Java
// 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
|
|
// 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.api;
|
|
|
|
import java.io.BufferedReader;
|
|
import java.io.EOFException;
|
|
import java.io.InputStreamReader;
|
|
import java.math.BigInteger;
|
|
import java.net.HttpURLConnection;
|
|
import java.net.URL;
|
|
import java.net.URLEncoder;
|
|
import java.security.MessageDigest;
|
|
import java.security.NoSuchAlgorithmException;
|
|
import java.util.HashMap;
|
|
import java.util.Iterator;
|
|
|
|
import org.apache.cloudstack.api.response.SuccessResponse;
|
|
|
|
import com.cloud.utils.exception.CloudRuntimeException;
|
|
import com.google.gson.Gson;
|
|
|
|
/**
|
|
* Base class for API Test
|
|
*
|
|
*/
|
|
public abstract class APITest {
|
|
|
|
protected String rootUrl = "http://localhost:8080/client/api";
|
|
protected String sessionKey = null;
|
|
protected String cookieToSent = null;
|
|
|
|
|
|
/**
|
|
* Sending an api request through Http GET
|
|
* @param command command name
|
|
* @param params command query parameters in a HashMap
|
|
* @return http request response string
|
|
*/
|
|
protected String sendRequest(String command, HashMap<String, String> params){
|
|
try {
|
|
// Construct query string
|
|
StringBuilder sBuilder = new StringBuilder();
|
|
sBuilder.append("command=");
|
|
sBuilder.append(command);
|
|
if ( params != null && params.size() > 0){
|
|
Iterator<String> keys = params.keySet().iterator();
|
|
while (keys.hasNext()){
|
|
String key = keys.next();
|
|
sBuilder.append("&");
|
|
sBuilder.append(key);
|
|
sBuilder.append("=");
|
|
sBuilder.append(URLEncoder.encode(params.get(key), "UTF-8"));
|
|
}
|
|
}
|
|
|
|
// Construct request url
|
|
String reqUrl = rootUrl + "?" + sBuilder.toString();
|
|
|
|
// Send Http GET request
|
|
URL url = new URL(reqUrl);
|
|
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
|
|
conn.setRequestMethod("GET");
|
|
|
|
if ( !command.equals("login") && cookieToSent != null){
|
|
// add the cookie to a request
|
|
conn.setRequestProperty("Cookie", cookieToSent);
|
|
}
|
|
conn.connect();
|
|
|
|
|
|
if ( command.equals("login")){
|
|
// if it is login call, store cookie
|
|
String headerName=null;
|
|
for (int i=1; (headerName = conn.getHeaderFieldKey(i))!=null; i++) {
|
|
if (headerName.equals("Set-Cookie")) {
|
|
String cookie = conn.getHeaderField(i);
|
|
cookie = cookie.substring(0, cookie.indexOf(";"));
|
|
String cookieName = cookie.substring(0, cookie.indexOf("="));
|
|
String cookieValue = cookie.substring(cookie.indexOf("=") + 1, cookie.length());
|
|
cookieToSent = cookieName + "=" + cookieValue;
|
|
}
|
|
}
|
|
}
|
|
|
|
// Get the response
|
|
StringBuilder response = new StringBuilder();
|
|
BufferedReader rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
|
|
String line;
|
|
try {
|
|
while ((line = rd.readLine()) != null) {
|
|
response.append(line);
|
|
}
|
|
} catch (EOFException ex) {
|
|
// ignore this exception
|
|
System.out.println("EOF exception due to java bug");
|
|
}
|
|
rd.close();
|
|
|
|
|
|
|
|
return response.toString();
|
|
|
|
} catch (Exception e) {
|
|
throw new CloudRuntimeException("Problem with sending api request", e);
|
|
}
|
|
}
|
|
|
|
protected String createMD5String(String password) {
|
|
MessageDigest md5;
|
|
try {
|
|
md5 = MessageDigest.getInstance("MD5");
|
|
} catch (NoSuchAlgorithmException e) {
|
|
throw new CloudRuntimeException("Error", e);
|
|
}
|
|
|
|
md5.reset();
|
|
BigInteger pwInt = new BigInteger(1, md5.digest(password.getBytes()));
|
|
|
|
// make sure our MD5 hash value is 32 digits long...
|
|
StringBuffer sb = new StringBuffer();
|
|
String pwStr = pwInt.toString(16);
|
|
int padding = 32 - pwStr.length();
|
|
for (int i = 0; i < padding; i++) {
|
|
sb.append('0');
|
|
}
|
|
sb.append(pwStr);
|
|
return sb.toString();
|
|
}
|
|
|
|
|
|
protected Object fromSerializedString(String result, Class<?> repCls) {
|
|
try {
|
|
if (result != null && !result.isEmpty()) {
|
|
// get real content
|
|
int start;
|
|
int end;
|
|
if (repCls == LoginResponse.class || repCls == SuccessResponse.class) {
|
|
|
|
start = result.indexOf('{', result.indexOf('{') + 1); // find
|
|
// the
|
|
// second
|
|
// {
|
|
|
|
end = result.lastIndexOf('}', result.lastIndexOf('}') - 1); // find
|
|
// the
|
|
// second
|
|
// }
|
|
// backwards
|
|
|
|
} else {
|
|
// get real content
|
|
start = result.indexOf('{', result.indexOf('{', result.indexOf('{') + 1) + 1); // find
|
|
// the
|
|
// third
|
|
// {
|
|
end = result.lastIndexOf('}', result.lastIndexOf('}', result.lastIndexOf('}') - 1) - 1); // find
|
|
// the
|
|
// third
|
|
// }
|
|
// backwards
|
|
}
|
|
if (start < 0 || end < 0) {
|
|
throw new CloudRuntimeException("Response format is wrong: " + result);
|
|
}
|
|
String content = result.substring(start, end + 1);
|
|
Gson gson = ApiGsonHelper.getBuilder().create();
|
|
return gson.fromJson(content, repCls);
|
|
}
|
|
return null;
|
|
} catch (RuntimeException e) {
|
|
throw new CloudRuntimeException("Caught runtime exception when doing GSON deserialization on: " + result, e);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Login call
|
|
* @param username user name
|
|
* @param password password (plain password, we will do MD5 hash here for you)
|
|
* @return login response string
|
|
*/
|
|
protected void login(String username, String password)
|
|
{
|
|
//String md5Psw = createMD5String(password);
|
|
// send login request
|
|
HashMap<String, String> params = new HashMap<String, String>();
|
|
params.put("response", "json");
|
|
params.put("username", username);
|
|
params.put("password", password);
|
|
String result = this.sendRequest("login", params);
|
|
LoginResponse loginResp = (LoginResponse)fromSerializedString(result, LoginResponse.class);
|
|
sessionKey = loginResp.getSessionkey();
|
|
|
|
}
|
|
}
|