// Copyright 2012 Citrix Systems, Inc. Licensed under the
// Apache License, Version 2.0 (the "License"); you may not use this
// file except in compliance with the License. Citrix Systems, Inc.
// reserves all rights not expressly granted by 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.
//
// Automatically generated by addcopyright.py at 04/03/2012
package com.cloud.test.longrun;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
import java.util.Iterator;
import java.util.Map;
import java.util.Random;
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 com.cloud.test.stress.TestClientWithAPI;
public class PerformanceWithAPI {
public static final Logger s_logger= Logger.getLogger(PerformanceWithAPI.class.getClass());
private static final int _retry=10;
private static final int _apiPort=8096;
private static int numVM=2;
private static final long _zoneId=-1L;
private static final long _templateId=3;
private static final long _serviceOfferingId=1;
private static final String _apiUrl = "/client/api";
private static final int _developerPort=8080;
public static void main (String[] args){
List<String> argsList = Arrays.asList(args);
Iterator<String> iter = argsList.iterator();
String host = "http://localhost";
int numThreads = 1;
while (iter.hasNext()){
String arg = iter.next();
if (arg.equals("-h")){
host="http://"+iter.next();
}
if (arg.equals("-t")){
numThreads=Integer.parseInt(iter.next());
}
if (arg.equals("-n")){
numVM=Integer.parseInt(iter.next());
}
}
final String server = host + ":" + _apiPort + "/";
final String developerServer = host + ":" + _developerPort + _apiUrl;
s_logger.info("Starting test in "+numThreads+" thread(s). Each thread is launching "+numVM+" VMs");
for (int i=0; i<numThreads; i++){
new Thread(new Runnable() {
public void run() {
try{
String username = null;
String singlePrivateIp=null;
String singlePublicIp=null;
Random ran = new Random();
username = Math.abs(ran.nextInt())+ "-user";
//Create User
User myUser = new User(username,username, server, developerServer);
try{
myUser.launchUser();
myUser.registerUser();
}catch (Exception e){
s_logger.warn("Error code: ", e);
}
if (myUser.getUserId()!=null){
s_logger.info("User "+myUser.getUserName()+" was created successfully, starting VM creation");
//create VMs for the user
for (int i=0; i<numVM; i++){
//Create a new VM, add it to the list of user's VMs
VirtualMachine myVM = new VirtualMachine(myUser.getUserId());
myVM.deployVM(_zoneId, _serviceOfferingId, _templateId, myUser.getDeveloperServer(), myUser.getApiKey(), myUser.getSecretKey());
myUser.getVirtualMachines().add(myVM);
singlePrivateIp=myVM.getPrivateIp();
if (singlePrivateIp!=null){
s_logger.info("VM with private Ip "+singlePrivateIp+" was successfully created");
}
else{
s_logger.info("Problems with VM creation for a user"+myUser.getUserName());
break;
}
//get public IP address for the User
myUser.retrievePublicIp(_zoneId);
singlePublicIp=myUser.getPublicIp().get(myUser.getPublicIp().size()-1);
if (singlePublicIp!=null){
s_logger.info("Successfully got public Ip "+singlePublicIp+" for user "+myUser.getUserName());
}
else{
s_logger.info("Problems with getting public Ip address for user"+myUser.getUserName());
break;
}
//create ForwardProxy rules for user's VMs
int responseCode = CreateForwardingRule(myUser, singlePrivateIp, singlePublicIp, "22", "22");
if (responseCode==500)
break;
}
s_logger.info("Deployment successful..."+numVM+" VMs were created. Waiting for 5 min before performance test");
Thread.sleep(300000L); // Wait
//Start performance test for the user
s_logger.info("Starting performance test for Guest network that has "+myUser.getPublicIp().size()+" public IP addresses");
for (int j=0; j<myUser.getPublicIp().size(); j++){
s_logger.info("Starting test for user which has "+myUser.getVirtualMachines().size()+" vms. Public IP for the user is "+myUser.getPublicIp().get(j)+" , number of retries is "+_retry+" , private IP address of the machine is"+myUser.getVirtualMachines().get(j).getPrivateIp());
guestNetwork myNetwork =new guestNetwork(myUser.getPublicIp().get(j), _retry);
myNetwork.setVirtualMachines(myUser.getVirtualMachines());
new Thread(myNetwork).start();
}
}
}catch (Exception e){
s_logger.error(e);
}
}
}).start();
}
}
private static int CreateForwardingRule(User myUser, String privateIp, String publicIp, String publicPort, String privatePort) throws IOException{
String encodedPrivateIp=URLEncoder.encode(""+privateIp, "UTF-8");
String encodedPublicIp=URLEncoder.encode(""+publicIp, "UTF-8");
String encodedPrivatePort=URLEncoder.encode(""+privatePort, "UTF-8");
String encodedPublicPort=URLEncoder.encode(""+publicPort, "UTF-8");
String encodedApiKey = URLEncoder.encode(myUser.getApiKey(), "UTF-8");
int responseCode=500;
String requestToSign = "apiKey=" + encodedApiKey
+ "&command=createOrUpdateIpForwardingRule&privateIp="
+ encodedPrivateIp + "&privatePort=" + encodedPrivatePort
+ "&protocol=tcp&publicIp="
+ encodedPublicIp + "&publicPort="+encodedPublicPort;
requestToSign = requestToSign.toLowerCase();
s_logger.info("Request to sign is "+requestToSign);
String signature = TestClientWithAPI.signRequest(requestToSign, myUser.getSecretKey());
String encodedSignature = URLEncoder.encode(signature, "UTF-8");
String url = myUser.getDeveloperServer() + "?command=createOrUpdateIpForwardingRule"
+ "&publicIp=" + encodedPublicIp
+ "&publicPort="+encodedPublicPort+"&privateIp=" + encodedPrivateIp
+ "&privatePort=" + encodedPrivatePort + "&protocol=tcp&apiKey=" + encodedApiKey
+ "&signature=" + encodedSignature;
s_logger.info("Trying to create IP forwarding rule: "+url);
HttpClient client = new HttpClient();
HttpMethod method = new GetMethod(url);
responseCode = client.executeMethod(method);
s_logger.info("create ip forwarding rule response code: "
+ responseCode);
if (responseCode == 200) {
s_logger.info("The rule is created successfully");
} else if (responseCode == 500) {
InputStream is = method.getResponseBodyAsStream();
Map<String, String> errorInfo = TestClientWithAPI.getSingleValueFromXML(is,
new String[] { "errorCode", "description" });
s_logger
.error("create ip forwarding rule (linux) test failed with errorCode: "
+ errorInfo.get("errorCode")
+ " and description: "
+ errorInfo.get("description"));
} else {
s_logger.error("internal error processing request: "
+ method.getStatusText());
}
return responseCode;
}
}