package org.ovirt.engine.core.bll.provider.network.openstack;
import static java.lang.Math.toIntExact;
import java.io.File;
import java.io.FileInputStream;
import java.security.KeyStore;
import java.util.concurrent.TimeUnit;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.params.HttpConnectionParams;
import org.apache.http.params.HttpParams;
import org.jboss.resteasy.client.ClientExecutor;
import org.jboss.resteasy.client.core.executors.ApacheHttpClient4Executor;
import org.ovirt.engine.core.common.config.Config;
import org.ovirt.engine.core.common.config.ConfigValues;
import org.ovirt.engine.core.utils.EngineLocalConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.woorea.openstack.connector.RESTEasyConnector;
public class CustomizedRESTEasyConnector extends RESTEasyConnector {
private static Logger log = LoggerFactory.getLogger(CustomizedRESTEasyConnector.class);
@Override
protected ClientExecutor createClientExecutor() {
DefaultHttpClient httpClient = new DefaultHttpClient();
configureTimeouts(httpClient);
registerExternalProvidersTrustStore(httpClient);
return new ApacheHttpClient4Executor(httpClient);
}
private void configureTimeouts(DefaultHttpClient httpClient) {
long socketTimeOut = TimeUnit.SECONDS.toMillis(
Config.<Integer> getValue(ConfigValues.ExternalNetworkProviderTimeout));
long connectionTimeOut = TimeUnit.SECONDS.toMillis(
Config.<Integer> getValue(ConfigValues.ExternalNetworkProviderConnectionTimeout));
HttpParams params = httpClient.getParams();
HttpConnectionParams.setConnectionTimeout(params, toIntExact(connectionTimeOut));
HttpConnectionParams.setSoTimeout(params, toIntExact(socketTimeOut));
}
private void registerExternalProvidersTrustStore(DefaultHttpClient httpClient) {
try (FileInputStream inputStream = new FileInputStream(
new File(EngineLocalConfig.getInstance().getExternalProvidersTrustStore().getAbsolutePath()));) {
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
trustStore.load(inputStream,
EngineLocalConfig.getInstance().getExternalProvidersTrustStorePassword().toCharArray());
SSLSocketFactory socketFactory = new SSLSocketFactory(trustStore);
Scheme scheme = new Scheme("https", 443, socketFactory);
httpClient.getConnectionManager().getSchemeRegistry().register(scheme);
} catch (Exception ex) {
log.warn("Cannot register external providers trust store: {}", ex.getMessage());
log.debug("Exception", ex);
}
}
}