// 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.ovm.object;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.TimeZone;
import org.apache.log4j.Logger;
import org.apache.xmlrpc.XmlRpcException;
import org.apache.xmlrpc.client.TimingOutCallback;
import org.apache.xmlrpc.client.XmlRpcClient;
import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
import com.cloud.utils.exception.CloudRuntimeException;
public class Connection {
private static final Logger s_logger = Logger.getLogger(Connection.class);
private XmlRpcClientConfigImpl _config = new XmlRpcClientConfigImpl();
XmlRpcClient _client;
String _username;
String _password;
String _ip;
Integer _port = 8899;
Boolean _isSsl = false;
private XmlRpcClient getXmlClient() {
XmlRpcClient client = new XmlRpcClient();
URL url;
try {
url = new URL("http://" + _ip + ":" + _port.toString());
_config.setTimeZone(TimeZone.getTimeZone("UTC"));
_config.setServerURL(url);
_config.setReplyTimeout(0); // disable, we use asyncexecute to control timeout
_config.setConnectionTimeout(6000);
_config.setBasicUserName(_username);
_config.setBasicPassword(_password);
client.setConfig(_config);
} catch (MalformedURLException e) {
throw new CloudRuntimeException(e.getMessage());
}
return client;
}
public Connection(String ip, Integer port, String username, String password) {
_ip = ip;
_port = port;
_username = username;
_password = password;
_client = getXmlClient();
}
public Connection(String ip, String username, String password) {
_ip = ip;
_username = username;
_password = password;
_client = getXmlClient();
}
public Object call(String method, Object[] params) throws XmlRpcException {
/* default timeout is 10 mins */
return callTimeoutInSec(method, params, 600);
}
public Object call(String method, Object[] params, boolean debug) throws XmlRpcException {
/* default timeout is 10 mins */
return callTimeoutInSec(method, params, 600, debug);
}
public Object callTimeoutInSec(String method, Object[] params, int timeout, boolean debug) throws XmlRpcException {
TimingOutCallback callback = new TimingOutCallback(timeout * 1000);
Object[] mParams = new Object[params.length + 1];
mParams[0] = method;
for (int i=0; i<params.length; i++) {
mParams[i+1] = params[i];
}
if (debug) {
/*
* some parameters including user password should not be printed in log
*/
s_logger.debug("Call Ovm agent: " + Coder.toJson(mParams));
}
long startTime = System.currentTimeMillis();
_client.executeAsync("OvmDispatch", mParams, callback);
try {
return callback.waitForResponse();
} catch (TimingOutCallback.TimeoutException to) {
throw to;
} catch (Throwable e) {
throw new XmlRpcException(-2, e.getMessage());
} finally {
long endTime = System.currentTimeMillis();
float during = (endTime - startTime) / 1000; // in secs
s_logger.debug("Ovm call " + method + " finished in " + during + " secs");
}
}
public Object callTimeoutInSec(String method, Object[] params, int timeout) throws XmlRpcException {
return callTimeoutInSec(method, params, timeout, true);
}
public String getIp() {
return _ip;
}
public Integer getPort() {
return _port;
}
public String getUserName() {
return _username;
}
public String getPassword() {
return _password;
}
public Boolean getIsSsl() {
return _isSsl;
}
}