/* * Copyright (c) 2014 EMC Corporation * All Rights Reserved */ package com.emc.storageos.cinder.api; import java.net.URI; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.emc.storageos.cinder.CinderEndPointInfo; import com.sun.jersey.api.client.Client; import com.sun.jersey.api.client.config.ClientConfig; import com.sun.jersey.api.client.config.DefaultClientConfig; /** * Cinder API client factory */ public class CinderApiFactory { private Logger _log = LoggerFactory.getLogger(CinderApiFactory.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_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 ConcurrentMap<String, CinderApi> _clientMap = null; /** * Initialize */ public void init() { _log.info(" CinderApi factory initialized"); if (_clientMap == null) { _clientMap = new ConcurrentHashMap<String, CinderApi>(); _log.info(" CinderApi factory new map created"); } } /** * shutdown */ protected void shutdown() { } /** * Return Cinder API client, create if not present * * @param provider Storage Provider URI * @return */ public CinderApi getApi(URI provider, CinderEndPointInfo endPoint) { boolean isNew = false; CinderApi cinderApi = _clientMap.get(provider.toString()); if (cinderApi == null) { isNew = true; ClientConfig config = new DefaultClientConfig(); Client jerseyClient = Client.create(config); cinderApi = new CinderApi(endPoint, jerseyClient); _clientMap.putIfAbsent(provider.toString(), cinderApi); } if (!isNew) { // Token gets expired, if the instance is not new refresh it. cinderApi.getClient().setAuthTokenHeader(endPoint.getCinderToken()); } return cinderApi; } }