Add Option to proxy to plugins 26/98926/4
authorilanap <ilanap@amdocs.com>
Thu, 28 Nov 2019 09:13:24 +0000 (11:13 +0200)
committerOren Kleks <oren.kleks@amdocs.com>
Thu, 5 Dec 2019 09:19:40 +0000 (09:19 +0000)
Added option to proxy the plugins throught the catalog proxy. Remove hardcoded redirect to workflow and added to the plugin configuration.

Issue-ID: SDC-2691
Signed-off-by: ilanap <ilanap@amdocs.com>
Change-Id: Ica479ff00e1a8c281b9280b5495ac022172775c4
Signed-off-by: ilanap <ilanap@amdocs.com>
catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java
catalog-fe/src/test/java/org/openecomp/sdc/servlets/FeProxyServletTest.java
catalog-ui/configurations/dev.js
catalog-ui/configurations/prod.js
common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java
docs/configuration.rst
sdc-os-chef/environments/plugins-configuration.yaml
sdc-os-chef/kubernetes/sdc/templates/configmaps/sdc-environment-configmap.yaml

index 1c7b174..1d7643f 100644 (file)
@@ -46,9 +46,8 @@ public class FeProxyServlet extends SSLProxyServlet {
     private static final String URL = "%s://%s%s%s";
     private static final String ONBOARDING_CONTEXT = "/onboarding-api";
     private static final String DCAED_CONTEXT = "/dcae-api";
-    private static final String WORKFLOW_CONTEXT = "/wf";
     private static final String SDC1_FE_PROXY = "/sdc1/feProxy";
-    private static final String PLUGIN_ID_WORKFLOW = "WORKFLOW";
+    private static final String SDC1_PLUGIN_REDIRECT = SDC1_FE_PROXY + "/plugin";
 
     private static final Logger LOGGER = Logger.getLogger(FeProxyServlet.class);
     private static final int EXPIRE_DURATION = 10;
@@ -154,6 +153,24 @@ public class FeProxyServlet extends SSLProxyServlet {
     }
 
 
+    /****
+     * scan all the plugins from the configuration against the URL and the redicert path
+     * @param request
+     * @return
+     */
+    private Plugin getPluginProxyForRequest(HttpServletRequest request) {
+        return getPluginConfiguration(request).getPluginsList()
+                .stream()
+                .filter(plugin -> {
+                    if (plugin.getPluginProxyRedirectPath() != null && !plugin.getPluginProxyRedirectPath().isEmpty()) {
+                        return request.getRequestURI().contains(SDC1_PLUGIN_REDIRECT + plugin.getPluginProxyRedirectPath());
+                    } else {
+                        return false;
+                    }
+                })
+                .findFirst().orElse(null);
+    }
+
     private String getModifiedUrl(HttpServletRequest request) throws MalformedURLException {
         Configuration config = getConfiguration(request);
         if (config == null) {
@@ -161,50 +178,77 @@ public class FeProxyServlet extends SSLProxyServlet {
             throw new RuntimeException("failed to read FE configuration");
         }
         String uri = request.getRequestURI();
-        String protocol;
-        String host;
-        String port;
+
+        // the modify logic is as follows:
+        // - proxy ONBOARDING to the onboarding context. this is not a plugin and hardcoded
+        // - proxy DCAE to the correct context. also - not a plugin but hardcoded
+        // - proxy to the plugin according to configuration if the path is found in the plugin patterns
+        // - proxy to the catalog backend if no other proxy was found
+
         if (uri.contains(ONBOARDING_CONTEXT)) {
             uri = uri.replace(SDC1_FE_PROXY + ONBOARDING_CONTEXT, ONBOARDING_CONTEXT);
-            protocol = config.getOnboarding().getProtocolBe();
-            host = config.getOnboarding().getHostBe();
-            port = config.getOnboarding().getPortBe().toString();
-        } else if (uri.contains(DCAED_CONTEXT)) {
+            return getModifiedUrlString(
+                    request,
+                    uri,
+                    config.getOnboarding().getHostBe(),
+                    config.getOnboarding().getPortBe().toString(),
+                    config.getOnboarding().getProtocolBe());
+        }
+        if (uri.contains(DCAED_CONTEXT)) {
             uri = uri.replace(SDC1_FE_PROXY + DCAED_CONTEXT, DCAED_CONTEXT);
-            protocol = config.getBeProtocol();
-            host = config.getBeHost();
-            if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
-                port = config.getBeHttpPort().toString();
-            } else {
-                port = config.getBeSslPort().toString();
+            return getModifiedUrlString(
+                    request,
+                    uri,
+                    config.getBeHost(),
+                    getCatalogBePort(config),
+                    config.getBeProtocol());
+        }
+
+        if (uri.contains(SDC1_PLUGIN_REDIRECT)) {
+            Plugin proxyPlugin = getPluginProxyForRequest(request);
+            if (proxyPlugin != null) {
+                String proxyUrlStr = (proxyPlugin.getPluginFeProxyUrl() != null) ? proxyPlugin.getPluginFeProxyUrl() : proxyPlugin.getPluginSourceUrl();
+                URL proxyUrl = new URL(proxyUrlStr);
+                uri = uri.replace(SDC1_PLUGIN_REDIRECT + proxyPlugin.getPluginProxyRedirectPath(), proxyUrl.getPath());
+                return getModifiedUrlString(request, uri, proxyUrl);
             }
-        } else if (uri.contains(WORKFLOW_CONTEXT)) {
-            String workflowPluginURL = getPluginConfiguration(request).getPluginsList()
-                    .stream()
-                    .filter(plugin -> plugin.getPluginId().equalsIgnoreCase(PLUGIN_ID_WORKFLOW))
-                    .map(Plugin::getPluginDiscoveryUrl)
-                    .findFirst().orElse(null);
-
-            java.net.URL workflowURL = new URL(workflowPluginURL);
-            protocol = workflowURL.getProtocol();
-            host = workflowURL.getHost();
-            port = String.valueOf(workflowURL.getPort());
-            uri = uri.replace(SDC1_FE_PROXY + WORKFLOW_CONTEXT, workflowURL.getPath() + WORKFLOW_CONTEXT);
+        }
+
+        Plugin proxyPlugin = getPluginProxyForRequest(request);
+        if (proxyPlugin != null) {
+            String proxyUrlStr = (proxyPlugin.getPluginFeProxyUrl() != null) ? proxyPlugin.getPluginFeProxyUrl() : proxyPlugin.getPluginSourceUrl();
+            URL proxyUrl = new URL(proxyUrlStr);
+            uri = uri.replace(SDC1_FE_PROXY + proxyPlugin.getPluginProxyRedirectPath(), proxyUrl.getPath());
+            return getModifiedUrlString(request, uri, proxyUrl);
+        }
+
+        uri = uri.replace(SDC1_FE_PROXY, "/sdc2");
+        return getModifiedUrlString(
+                request,
+                uri,
+                config.getBeHost(),
+                getCatalogBePort(config),
+                config.getBeProtocol());
+    }
+
+
+    private String getCatalogBePort(Configuration config) {
+        if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
+            return config.getBeHttpPort().toString();
         } else {
-            uri = uri.replace(SDC1_FE_PROXY, "/sdc2");
-            protocol = config.getBeProtocol();
-            host = config.getBeHost();
-            if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
-                port = config.getBeHttpPort().toString();
-            } else {
-                port = config.getBeSslPort().toString();
-            }
+            return config.getBeSslPort().toString();
         }
+    }
 
+    private String getModifiedUrlString(HttpServletRequest request, String uri, URL url) {
+        String queryString = getQueryString(request);
+        return String.format(URL, url.getProtocol(), url.getAuthority(), uri, queryString);
+    }
+
+    private String getModifiedUrlString(HttpServletRequest request, String uri, String host, String port, String protocol) {
         String authority = getAuthority(host, port);
         String queryString = getQueryString(request);
         return String.format(URL, protocol, authority, uri, queryString);
-
     }
 
     private PluginsConfiguration getPluginConfiguration(HttpServletRequest request) {
index 4915936..81e939b 100644 (file)
@@ -113,7 +113,12 @@ public class FeProxyServletTest {
                when(plugin.getPluginId()).thenReturn("WORKFLOW");
                when(plugin.getPluginSourceUrl()).thenReturn(WF_PROTOCOL + "://" + WF_HOST + ":" + WF_PORT);
                when(plugin.getPluginDiscoveryUrl()).thenReturn(WF_PROTOCOL + "://" + WF_HOST + ":" + WF_PORT + "/workflows");
+               when(plugin.getPluginFeProxyUrl()).thenReturn(WF_PROTOCOL + "://" + WF_HOST + ":" + WF_PORT + "/workflows/wf/");
+               when(plugin.getPluginProxyRedirectPath()).thenReturn("/wf/");
                pluginList.add(plugin);
+               PluginsConfiguration.Plugin noConfigPlugin = new PluginsConfiguration.Plugin();
+               noConfigPlugin.setPluginId("NO_CONFIG");
+               pluginList.add(noConfigPlugin);
                when(configurationManager.getPluginsConfiguration()).thenReturn(pluginsConfiguration);
                when(pluginsConfiguration.getPluginsList()).thenReturn(pluginList);
 
@@ -182,17 +187,31 @@ public class FeProxyServletTest {
 
        @Test
        public void testRewriteURIWithWFAPIRequest() {
-               when(servletRequest.getRequestURI()).thenReturn("/sdc1/feProxy/wf/workflows");
-               String requestResourceUrl = "http://localhost:8080/sdc1/feProxy/wf/workflows";
+               when(servletRequest.getRequestURI()).thenReturn("/sdc1/feProxy/plugin/wf/workflows");
+               String requestResourceUrl = "http://localhost:8080/sdc1/feProxy/plugin/wf/workflows";
                String expectedChangedUrl = WF_PROTOCOL + "://" + WF_HOST + ":" + WF_PORT + "/workflows/wf/workflows";
                when(servletRequest.getRequestURL()).thenReturn(new StringBuffer(requestResourceUrl));
 
                when(servletRequest.getContextPath()).thenReturn("/sdc1");
-               when(servletRequest.getServletPath()).thenReturn("/feProxy/wf/workflows");
+               when(servletRequest.getServletPath()).thenReturn("/feProxy/plugin/wf/workflows");
 
                String rewriteURI = feProxy.rewriteTarget(servletRequest);
 
                assertEquals(expectedChangedUrl, rewriteURI);
+
+               // now test in case it did not go through the plugin
+               when(servletRequest.getRequestURI()).thenReturn("/sdc1/feProxy/wf/workflows");
+               requestResourceUrl = "http://localhost:8080/sdc1/feProxy/wf/workflows";
+               expectedChangedUrl = BE_PROTOCOL + "://" + BE_HOST + ":" + BE_PORT + "/sdc2/wf/workflows";
+               when(servletRequest.getRequestURL()).thenReturn(new StringBuffer(requestResourceUrl));
+
+               when(servletRequest.getContextPath()).thenReturn("/sdc1");
+               when(servletRequest.getServletPath()).thenReturn("/feProxy/wf/workflows");
+
+               rewriteURI = feProxy.rewriteTarget(servletRequest);
+
+               assertEquals(expectedChangedUrl, rewriteURI);
+
        }
 
        /**
index bca5912..be1f52a 100644 (file)
@@ -49,7 +49,7 @@ const SDC_CONFIG = {
                "GET_lifecycle_state_UNDOCHECKOUT":"lifecycleState/UNDOCHECKOUT",
                "root": "/sdc1/feProxy/rest",
         "no_proxy_root": "/sdc1/rest",
-               "workflow_root": "/sdc1/feProxy/wf",
+               "workflow_root": "/sdc1/feProxy/plugin/wf",
                "POST_workflow_artifact": "sdc/v1/catalog",
                "PUT_service": "/v1/catalog/services/:id/metadata",
                "GET_download_artifact": "/v1/catalog/",
index 496c576..32c9ae2 100644 (file)
@@ -49,7 +49,7 @@ const SDC_CONFIG = {
                "GET_lifecycle_state_UNDOCHECKOUT":"lifecycleState/UNDOCHECKOUT",
                "root": "/sdc1/feProxy/rest",
         "no_proxy_root": "/sdc1/rest",
-               "workflow_root": "/sdc1/feProxy/wf",
+               "workflow_root": "/sdc1/feProxy/plugin/wf",
                "POST_workflow_artifact": "sdc/v1/catalog",
                "PUT_service": "/v1/catalog/services/:id/metadata",
                "GET_download_artifact": "/v1/catalog/",
index 449c9ea..55b0ea0 100644 (file)
 
 package org.openecomp.sdc.fe.config;
 
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
 import org.openecomp.sdc.common.api.BasicConfiguration;
 
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
 
+@Getter
+@Setter
+@ToString
 public class PluginsConfiguration extends BasicConfiguration {
 
     private List<Plugin> pluginsList;
     private Integer connectionTimeout;
 
-    public List<Plugin> getPluginsList() {
-        return pluginsList;
-    }
-
-    public void setPluginsList(List<Plugin> pluginsList) {
-        this.pluginsList = pluginsList;
-    }
-
-    public Integer getConnectionTimeout() {
-        return connectionTimeout;
-    }
-
-    public void setConnectionTimeout(Integer connectionTimeout) {
-        this.connectionTimeout = connectionTimeout;
-    }
-
     public PluginsConfiguration() {
         this.pluginsList = new ArrayList<>();
     }
 
+    @Getter
+    @Setter
     public static class Plugin {
-
         private String pluginId;
         private String pluginDiscoveryUrl;
         private String pluginSourceUrl;
         private String pluginStateUrl;
+        private String pluginFeProxyUrl; // this is optional in case it is different from the source url.
+        private String pluginProxyRedirectPath;
         private Map<String, PluginDisplayOptions> pluginDisplayOptions;
         private boolean isOnline;
 
-        public String getPluginId() {
-            return pluginId;
-        }
-
-        public void setPluginId(String pluginId) {
-            this.pluginId = pluginId;
-        }
-
-        public String getPluginDiscoveryUrl() {
-            return pluginDiscoveryUrl;
-        }
-
-        public void setPluginDiscoveryUrl(String pluginDiscoveryUrl) {
-            this.pluginDiscoveryUrl = pluginDiscoveryUrl;
-        }
-
-        public String getPluginSourceUrl() {
-            return pluginSourceUrl;
-        }
-
-        public void setPluginSourceUrl(String pluginSourceUrl) {
-            this.pluginSourceUrl = pluginSourceUrl;
-        }
-
-        public String getPluginStateUrl() {
-            return pluginStateUrl;
-        }
-
-        public void setPluginStateUrl(String pluginStateUrl) {
-            this.pluginStateUrl = pluginStateUrl;
-        }
-
-        public Map<String, PluginDisplayOptions> getPluginDisplayOptions() {
-            return pluginDisplayOptions;
-        }
-
-        public void setPluginDisplayOptions(Map<String, PluginDisplayOptions> pluginDisplayOptions) {
-            this.pluginDisplayOptions = pluginDisplayOptions;
-        }
-
     }
 
+    @Getter
+    @Setter
+    @ToString
     public static class PluginDisplayOptions {
-
         private String displayName;
         private List<String> displayContext;
         private List<String> displayRoles;
-
-        public String getDisplayName() {
-            return displayName;
-        }
-
-        public void setDisplayName(String displayName) {
-            this.displayName = displayName;
-        }
-
-        public List<String> getDisplayContext() {
-            return displayContext;
-        }
-
-        public void setDisplayContext(List<String> displayContext) {
-            this.displayContext = displayContext;
-        }
-
-        public List<String> getDisplayRoles() {
-            return displayRoles;
-        }
-
-        public void setDisplayRoles(List<String> displayRoles) {
-            this.displayRoles = displayRoles;
-        }
-
-        @Override
-        public String toString() {
-            return "PluginDisplayOptions["
-                    + "displayName='" + displayName
-                    + ", displayContext=" + displayContext
-                    + ", displayRoles=" + displayRoles
-                    + ']';
-        }
     }
 
-    @Override
-    public String toString() {
-        return "PluginsConfiguration[" + "pluginsList=" + pluginsList + ", connectionTimeout=" + connectionTimeout + ']';
-    }
 }
 
 
index 59f571d..5156f6e 100644 (file)
@@ -1382,6 +1382,10 @@ FE-plugins-configuration.yaml
    # definition of the plugins that exist in sdc
    # we have a pre-defined list of plugins that are connected to the system.
    # the plugins define where they are shown, to whom and on what elements
+   # in addition, the catalog can proxy to the plugin as well if the following 2 keys are set:
+   #     pluginFeProxyUrl - the pattern of the url that should be proxied after the sdc1/feProxy/plugin prefix
+   #     pluginProxyRedirectPath - the redirect path to the plugin (full url including protool/host and port)
+
    pluginsList:
         # the DCAE-DS is the SDC monitoring design studio this entry defines there use as part of the service level context
       - pluginId: DCAED
@@ -1414,6 +1418,8 @@ FE-plugins-configuration.yaml
       - pluginId: WORKFLOW
         pluginDiscoveryUrl: <%= @workflow_discovery_url %>
         pluginSourceUrl: <%= @workflow_source_url %>
+        pluginFeProxyUrl: <%= @workflow_fe_proxy_url %>
+        pluginProxyRedirectPath: <%= @workflow_redirect_path %>
         pluginStateUrl: "workflowDesigner"
         pluginDisplayOptions:
            tab:
index 21de746..1135cbb 100644 (file)
@@ -19,6 +19,8 @@ pluginsList:
    - pluginId: WORKFLOW
      pluginDiscoveryUrl: <%= @workflow_discovery_url %>
      pluginSourceUrl: <%= @workflow_source_url %>
+     pluginFeProxyUrl: <%= @workflow_fe_proxy_url %>
+     pluginProxyRedirectPath: <%= @workflow_redirect_path %>
      pluginStateUrl: "workflowDesigner"
      pluginDisplayOptions:
         tab:
index 0eb5289..e332729 100644 (file)
@@ -57,7 +57,9 @@ data:
                 },
                 "WORKFLOW": {
                     "workflow_discovery_url": "10.0.2.15",
-                    "workflow_source_url": "10.0.2.15"
+                    "workflow_source_url": "10.0.2.15",
+                    "workflow_fe_proxy_url": "10.0.2.15",
+                    "workflow_redirect_path": "/wf"
                 }
             },
                "VnfRepo": {