Initial fix for https call to plugins
[sdc.git] / catalog-fe / src / main / java / org / openecomp / sdc / fe / impl / PluginStatusBL.java
index a369d66..a2b0adb 100644 (file)
-package org.openecomp.sdc.fe.impl;
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2019 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with 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.
+ * ============LICENSE_END=========================================================
+ */
 
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
+package org.openecomp.sdc.fe.impl;
 
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+import org.apache.http.HttpStatus;
+import org.apache.http.client.config.RequestConfig;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpHead;
+import org.apache.http.config.Registry;
+import org.apache.http.config.RegistryBuilder;
+import org.apache.http.conn.socket.ConnectionSocketFactory;
+import org.apache.http.conn.socket.PlainConnectionSocketFactory;
+import org.apache.http.conn.ssl.NoopHostnameVerifier;
+import org.apache.http.conn.ssl.SSLConnectionSocketFactory;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
+
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.exception.InvalidArgumentException;
 import org.openecomp.sdc.fe.config.ConfigurationManager;
 import org.openecomp.sdc.fe.config.PluginsConfiguration;
 import org.openecomp.sdc.fe.config.PluginsConfiguration.Plugin;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import org.openecomp.sdc.fe.utils.JettySSLUtils;
 
-import com.google.gson.Gson;
-import com.google.gson.GsonBuilder;
+import java.io.IOException;
+import java.security.GeneralSecurityException;
 
 public class PluginStatusBL {
 
-       private static Logger log = LoggerFactory.getLogger(PluginStatusBL.class.getName());
-       private static  Gson gson = new GsonBuilder().setPrettyPrinting().create();
-       private CloseableHttpClient client = null;
-       
-       public PluginStatusBL() {
-               this.client = HttpClients.createDefault();
-       }
-       
-       public PluginStatusBL(CloseableHttpClient client) {
-               this.client = client;
-                               
-       }
+    private static final Logger log = Logger.getLogger(PluginStatusBL.class.getName());
+       private static final String MAX_CONNECTION_POOL = "maxOutgoingConnectionPoolTotal";
+       private static final String MAX_ROUTE_POOL = "maxOutgoingPerRoute";
+    private final Gson gson;
+    private CloseableHttpClient client;
+    private final PluginsConfiguration pluginsConfiguration;
+    private RequestConfig requestConfig;
+
+    public PluginStatusBL() {
+        this.pluginsConfiguration = ConfigurationManager.getConfigurationManager().getPluginsConfiguration();
+        this.gson = new GsonBuilder().setPrettyPrinting().create();
+               // check if we have secure connections in the plugin list, if not - we won't bother with it
+               try {
+                       this.client = getPooledClient(this.hasSecuredPlugins());
+               } catch (Exception e){
+                       log.error("Could not initialize the Https client: {}", e.getMessage());
+                       log.debug("Exception:",e);
+               }
+    }
 
-       public String checkPluginsListAvailability() {
-               String result = null;
+    public PluginStatusBL(CloseableHttpClient client) {
+        this.pluginsConfiguration = ConfigurationManager.getConfigurationManager().getPluginsConfiguration();
+        this.client = client;
 
-               PluginsConfiguration pluginsConfiguration = ConfigurationManager.getConfigurationManager()
-                               .getPluginsConfiguration();
+        this.gson = new GsonBuilder().setPrettyPrinting().create();
 
-               if (pluginsConfiguration == null || pluginsConfiguration.getPluginsList() == null) {
-                       log.warn("Configuration of type {} was not found", PluginsConfiguration.class);
-               } else {
-                       log.debug("The value returned from getConfig is {}", pluginsConfiguration);
+    }
 
-                       List<Plugin> availablePluginsList = new ArrayList<>();
+       private boolean hasSecuredPlugins() {
+               if (this.getPluginsList() != null) {
+            return pluginsConfiguration.getPluginsList().stream()
+                    .anyMatch(plugin -> plugin.getPluginDiscoveryUrl().toLowerCase().startsWith("https"));
+               }
+               return false;
 
-                       pluginsConfiguration.getPluginsList().forEach(value -> {
-                               if (checkPluginAvailability(value)) {
-                                       availablePluginsList.add(value);
-                               }
+       }
 
-                       });
-                       result = gson.toJson(availablePluginsList);
+       private CloseableHttpClient getPooledClient(boolean isSecured) throws GeneralSecurityException, IOException {
+               final PoolingHttpClientConnectionManager  poolingConnManager;
+               if (!isSecured) {
+                       poolingConnManager
+                                       = new PoolingHttpClientConnectionManager();
+               } else {
+                       SSLConnectionSocketFactory s = new SSLConnectionSocketFactory(
+                    JettySSLUtils.getSslContext(),
+                                       new NoopHostnameVerifier());
+
+                       Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create()
+                                       .register("http", new PlainConnectionSocketFactory())
+                                       .register("https", s)
+                                       .build();
+                       poolingConnManager
+                                       = new PoolingHttpClientConnectionManager(registry);
                }
-               return result;
+               int maxTotal = System.getProperties().containsKey(MAX_CONNECTION_POOL) ? Integer.parseInt(System.getProperty(MAX_CONNECTION_POOL)) : 5;
+               int routeMax = System.getProperties().containsKey(MAX_ROUTE_POOL) ? Integer.parseInt(System.getProperty(MAX_ROUTE_POOL)) : 20;
+               poolingConnManager.setMaxTotal(maxTotal);
+               poolingConnManager.setDefaultMaxPerRoute(routeMax);
+               return HttpClients.custom().setConnectionManager(poolingConnManager).setSSLHostnameVerifier(new NoopHostnameVerifier()).build();
        }
 
-       private boolean checkPluginAvailability(Plugin plugin) {
-               boolean result = false;
-
-               HttpHead head = new HttpHead(plugin.getPluginDiscoveryUrl());
-
-               try (CloseableHttpResponse response = this.client.execute(head)) {
-                       result = response != null && response.getStatusLine().getStatusCode() == 200;
-               } catch (IOException e) {
-                       log.debug("The plugin {} is offline", plugin.getPluginId());
+    public String getPluginsList() {
+        String result = null;
+
+        if (pluginsConfiguration == null || pluginsConfiguration.getPluginsList() == null) {
+            log.warn("Configuration of type {} was not found", PluginsConfiguration.class);
+            throw new InvalidArgumentException("the plugin configuration was not read successfully.");
+
+        } else {
+            log.debug("The value returned from getConfig is {}", pluginsConfiguration);
+
+            result = gson.toJson(pluginsConfiguration.getPluginsList());
+        }
+        return result;
+    }
+
+    public String getPluginAvailability(String pluginId) {
+        String result = null;
+
+        if (pluginsConfiguration == null || pluginsConfiguration.getPluginsList() == null) {
+            log.warn("Configuration of type {} was not found", PluginsConfiguration.class);
+            throw new InvalidArgumentException("the plugin configuration was not read successfully.");
+
+        } else {
+            log.debug("The value returned from getConfig is {}", pluginsConfiguration);
+            Integer connectionTimeout = pluginsConfiguration.getConnectionTimeout();
+            this.requestConfig = RequestConfig.custom()
+                    .setSocketTimeout(connectionTimeout)
+                    .setConnectTimeout(connectionTimeout)
+                    .setConnectionRequestTimeout(connectionTimeout).build();
+
+
+            Plugin wantedPlugin = pluginsConfiguration.getPluginsList().stream()
+                    .filter(plugin -> plugin.getPluginId().equals(pluginId))
+                    .findAny()
+                    .orElse(null);
+
+            if (wantedPlugin != null) {
+                result = gson.toJson(checkPluginAvailability(wantedPlugin));
+            }
+        }
+        return result;
+    }
+
+    private boolean checkPluginAvailability(Plugin plugin) {
+        boolean result = false;
+        log.debug("sending head request to id:{} url:{}", plugin.getPluginId(), plugin.getPluginDiscoveryUrl());
+        HttpHead head = new HttpHead(plugin.getPluginDiscoveryUrl());
+
+        head.setConfig(this.requestConfig);
+               if (this.client == null) {
+                       log.debug("The plugin {} will not run because https is not configured on the FE server",plugin.getPluginId());
+                       return false;
                }
-
-               return result;
-       }
+        try (CloseableHttpResponse response = this.client.execute(head)) {
+            result = response != null && response.getStatusLine().getStatusCode() == HttpStatus.SC_OK;
+            log.debug("The plugin {} is {} with result {}", plugin.getPluginId(), (result ? "online" : "offline"), result);
+        } catch (IOException e) {
+            log.debug("The plugin {} is offline", plugin.getPluginId());
+            log.debug("Exception:", e);
+        }
+
+        return result;
+    }
 
 }