/*
* Copyright 2015 EMC Corporation
* All Rights Reserved
*/
package com.emc.storageos.ecs.api;
import java.io.IOException;
import java.net.URI;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpMethod;
import org.apache.commons.httpclient.HttpMethodRetryHandler;
import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager;
import org.apache.commons.httpclient.params.HttpConnectionManagerParams;
import org.apache.commons.httpclient.params.HttpMethodParams;
import org.apache.commons.httpclient.protocol.Protocol;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.filter.HTTPBasicAuthFilter;
import com.sun.jersey.client.apache.ApacheHttpClient;
import com.sun.jersey.client.apache.ApacheHttpClientHandler;
/**
* ECS API client factory
*/
public class ECSApiFactory {
private Logger _log = LoggerFactory.getLogger(ECSApiFactory.class);
private static final int DEFAULT_MAX_CONN = 300;
private static final int DEFAULT_MAX_CONN_PER_HOST = 100;
private static final int DEFAULT_CONN_TIMEOUT = 1000 * 30;
private static final int DEFAULT_CONN_MGR_TIMEOUT = 1000 * 60;
private static final int DEFAULT_SOCKET_CONN_TIMEOUT = 1000 * 60 * 60;
private int _maxConn = DEFAULT_MAX_CONN;
private int _maxConnPerHost = DEFAULT_MAX_CONN_PER_HOST;
private int _connTimeout = DEFAULT_CONN_TIMEOUT;
private int _socketConnTimeout = DEFAULT_SOCKET_CONN_TIMEOUT;
private int connManagerTimeout = DEFAULT_CONN_MGR_TIMEOUT;
private ApacheHttpClientHandler _clientHandler;
private ConcurrentMap<String, ECSApi> _clientMap;
private MultiThreadedHttpConnectionManager _connectionManager;
/**
* Maximum number of outstanding connections
*
* @param maxConn
*/
public void setMaxConnections(int maxConn) {
_maxConn = maxConn;
}
/**
* Maximum number of outstanding connections per host
*
* @param maxConnPerHost
*/
public void setMaxConnectionsPerHost(int maxConnPerHost) {
_maxConnPerHost = maxConnPerHost;
}
/**
* Connection timeout
*
* @param connectionTimeoutMs
*/
public void setConnectionTimeoutMs(int connectionTimeoutMs) {
_connTimeout = connectionTimeoutMs;
}
/**
* Socket connection timeout
*
* @param connectionTimeoutMs
*/
public void setSocketConnectionTimeoutMs(int connectionTimeoutMs) {
_socketConnTimeout = connectionTimeoutMs;
}
/**
* @param connManagerTimeout the connManagerTimeout to set
*/
public void setConnManagerTimeout(int connManagerTimeout) {
this.connManagerTimeout = connManagerTimeout;
}
/**
* Initialize
*/
public void init() {
_log.info(" ECSApiFactory:init ECSApi factory initialization");
_clientMap = new ConcurrentHashMap<String, ECSApi>();
HttpConnectionManagerParams params = new HttpConnectionManagerParams();
params.setDefaultMaxConnectionsPerHost(_maxConnPerHost);
params.setMaxTotalConnections(_maxConn);
params.setTcpNoDelay(true);
params.setConnectionTimeout(_connTimeout);
params.setSoTimeout(_socketConnTimeout);
_connectionManager = new MultiThreadedHttpConnectionManager();
_connectionManager.setParams(params);
_connectionManager.closeIdleConnections(0); // close idle connections immediately
HttpClient client = new HttpClient(_connectionManager);
client.getParams().setConnectionManagerTimeout(connManagerTimeout);
client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new HttpMethodRetryHandler() {
@Override
public boolean retryMethod(HttpMethod httpMethod, IOException e, int i) {
return false;
}
});
_clientHandler = new ApacheHttpClientHandler(client);
Protocol.registerProtocol("https", new Protocol("https", new NonValidatingSocketFactory(), 4443));
}
/**
* shutdown http connection manager.
*/
protected void shutdown() {
_connectionManager.shutdown();
}
/**
* Create ECS API client
*
* @param endpoint ECS endpoint
* @return
*/
public ECSApi getRESTClient(URI endpoint) {
ECSApi ecsApi = _clientMap.get(endpoint.toString() + ":" + ":");
if (ecsApi == null) {
Client jerseyClient = new ApacheHttpClient(_clientHandler);
RESTClient restClient = new RESTClient(jerseyClient);
ecsApi = new ECSApi(endpoint, restClient);
_clientMap.putIfAbsent(endpoint.toString() + ":" + ":", ecsApi);
}
return ecsApi;
}
/**
* Create ECS API client
*
* @param endpoint ECS endpoint
* @return
*/
public ECSApi getRESTClient(URI endpoint, String username, String password) {
ECSApi ecsApi = _clientMap.get(endpoint.toString() + ":" + username + ":" + password);
if (ecsApi == null) {
Client jerseyClient = new ApacheHttpClient(_clientHandler);
jerseyClient.addFilter(new HTTPBasicAuthFilter(username, password));
RESTClient restClient = new RESTClient(jerseyClient);
ecsApi = new ECSApi(endpoint, restClient);
_clientMap.putIfAbsent(endpoint.toString() + ":" + username + ":" + password, ecsApi);
}
return ecsApi;
}
/*
* public static void main(String[] args) {
* System.out.println("starting ecs main");
* URI uri = URI.create(String.format("https://10.*.*.*:4443/login"));
* ECSApiFactory factory = new ECSApiFactory();
* factory.init();
* ECSApi ecsApi = factory.getRESTClient(uri, "root", "***");
*
* String authToken = ecsApi.getAuthToken();
* System.out.println(authToken);
*
* if (ecsApi.isSystemAdmin())
* System.out.println("Sys admin");
* else
* System.out.println("NOT Sys admin");
*
* //UserSecretKeysGetCommandResult res = ecsApi.getUserSecretKeys("prov_user");
* //System.out.println(res);
* UserSecretKeysAddCommandResult res2 = ecsApi.addUserSecretKey("prov_user", "R6JUtI6hK2rDxY2fKuaQ51OL2tfyoHjPp8xL2y3T");
* System.out.println(res2);
* int dummy = 2;
*
* //ecsApi.getStoragePools();
* //ecsApi.getStoragePort("");
*
* //ecsApi.getNamespaces();
* //ECSNamespaceRepGroup ns = ecsApi.getNamespaceDetails("psns");
* //dummy = ns.getReplicationGroups().size();
*
* //createBucket(String name, String namespace, String repGroup,
* //String retentionPeriod, String blkSizeHQ, String notSizeSQ) throws ECSException {
* //ecsApi.createBucket("m1", "s3", "urn:storageos:ReplicationGroupInfo:b3bf2d47-d732-457c-bb9b-d260eb53a76a:global",
* //"4", "99", "55", "testlogin");
* //ecsApi.deleteBucket("esc_myproj_bucket1");
* }
*/
}