From ee4c4d72ed2118ea44dd5d83e1cf1677b6ebb03c Mon Sep 17 00:00:00 2001 From: ilanap Date: Thu, 28 Nov 2019 11:13:24 +0200 Subject: [PATCH] Add Option to proxy to plugins 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 Change-Id: Ica479ff00e1a8c281b9280b5495ac022172775c4 Signed-off-by: ilanap --- .../openecomp/sdc/fe/servlets/FeProxyServlet.java | 116 ++++++++++++++------- .../openecomp/sdc/servlets/FeProxyServletTest.java | 25 ++++- catalog-ui/configurations/dev.js | 2 +- catalog-ui/configurations/prod.js | 2 +- .../sdc/fe/config/PluginsConfiguration.java | 108 +++---------------- docs/configuration.rst | 6 ++ .../environments/plugins-configuration.yaml | 2 + .../configmaps/sdc-environment-configmap.yaml | 4 +- 8 files changed, 128 insertions(+), 137 deletions(-) diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java index 1c7b174c57..1d7643fe40 100644 --- a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java +++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/FeProxyServlet.java @@ -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) { diff --git a/catalog-fe/src/test/java/org/openecomp/sdc/servlets/FeProxyServletTest.java b/catalog-fe/src/test/java/org/openecomp/sdc/servlets/FeProxyServletTest.java index 4915936b1d..81e939b929 100644 --- a/catalog-fe/src/test/java/org/openecomp/sdc/servlets/FeProxyServletTest.java +++ b/catalog-fe/src/test/java/org/openecomp/sdc/servlets/FeProxyServletTest.java @@ -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); + } /** diff --git a/catalog-ui/configurations/dev.js b/catalog-ui/configurations/dev.js index bca591296a..be1f52a787 100644 --- a/catalog-ui/configurations/dev.js +++ b/catalog-ui/configurations/dev.js @@ -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/", diff --git a/catalog-ui/configurations/prod.js b/catalog-ui/configurations/prod.js index 496c5760a6..32c9ae2a2b 100644 --- a/catalog-ui/configurations/prod.js +++ b/catalog-ui/configurations/prod.js @@ -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/", diff --git a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java index 449c9eaccc..55b0ea0db9 100644 --- a/common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java +++ b/common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java @@ -20,132 +20,50 @@ 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 pluginsList; private Integer connectionTimeout; - public List getPluginsList() { - return pluginsList; - } - - public void setPluginsList(List 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 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 getPluginDisplayOptions() { - return pluginDisplayOptions; - } - - public void setPluginDisplayOptions(Map pluginDisplayOptions) { - this.pluginDisplayOptions = pluginDisplayOptions; - } - } + @Getter + @Setter + @ToString public static class PluginDisplayOptions { - private String displayName; private List displayContext; private List displayRoles; - - public String getDisplayName() { - return displayName; - } - - public void setDisplayName(String displayName) { - this.displayName = displayName; - } - - public List getDisplayContext() { - return displayContext; - } - - public void setDisplayContext(List displayContext) { - this.displayContext = displayContext; - } - - public List getDisplayRoles() { - return displayRoles; - } - - public void setDisplayRoles(List 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 + ']'; - } } diff --git a/docs/configuration.rst b/docs/configuration.rst index 59f571d6ca..5156f6ee95 100644 --- a/docs/configuration.rst +++ b/docs/configuration.rst @@ -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: diff --git a/sdc-os-chef/environments/plugins-configuration.yaml b/sdc-os-chef/environments/plugins-configuration.yaml index 21de74636f..1135cbb54e 100644 --- a/sdc-os-chef/environments/plugins-configuration.yaml +++ b/sdc-os-chef/environments/plugins-configuration.yaml @@ -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: diff --git a/sdc-os-chef/kubernetes/sdc/templates/configmaps/sdc-environment-configmap.yaml b/sdc-os-chef/kubernetes/sdc/templates/configmaps/sdc-environment-configmap.yaml index 0eb5289c64..e332729526 100644 --- a/sdc-os-chef/kubernetes/sdc/templates/configmaps/sdc-environment-configmap.yaml +++ b/sdc-os-chef/kubernetes/sdc/templates/configmaps/sdc-environment-configmap.yaml @@ -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": { -- 2.16.6