From 3504f84909d1ee1963931e63bed694a533a84cd3 Mon Sep 17 00:00:00 2001 From: Idan Amit Date: Tue, 9 Oct 2018 18:45:52 +0300 Subject: Plugin load by the UI Changed the original plugin API to only return the plugins list Changed the plugin Iframe to check if the plugin is online on every init Change-Id: I7916668de17c49a2639047ef243939889a933067 Issue-ID: SDC-1400 Signed-off-by: Idan Amit --- .../org/openecomp/sdc/fe/impl/PluginStatusBL.java | 33 +++++++--- .../openecomp/sdc/fe/servlets/ConfigServlet.java | 77 +++++++++++++++------- .../sdc/fe/servlets/PluginStatusBLTest.java | 40 ++++++----- catalog-ui/configurations/dev.js | 1 + catalog-ui/configurations/prod.js | 1 + catalog-ui/src/app/models/app-config.ts | 1 + .../ui/plugin/plugin-frame.component.html | 4 +- .../components/ui/plugin/plugin-frame.component.ts | 16 ++++- catalog-ui/src/app/ng2/services/plugins.service.ts | 23 ++++++- .../sdc/fe/config/PluginsConfiguration.java | 8 --- 10 files changed, 140 insertions(+), 64 deletions(-) diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/PluginStatusBL.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/PluginStatusBL.java index f4cbe9a70b..460d6deeee 100644 --- a/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/PluginStatusBL.java +++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/PluginStatusBL.java @@ -24,7 +24,6 @@ public class PluginStatusBL { private final Gson gson; private final CloseableHttpClient client; private final PluginsConfiguration pluginsConfiguration; - private Integer connectionTimeout; private RequestConfig requestConfig; public PluginStatusBL() { @@ -41,7 +40,7 @@ public class PluginStatusBL { } - public String checkPluginsListAvailability() { + public String getPluginsList() { String result = null; if (pluginsConfiguration == null || pluginsConfiguration.getPluginsList() == null) { @@ -50,20 +49,36 @@ public class PluginStatusBL { } else { log.debug("The value returned from getConfig is {}", pluginsConfiguration); - connectionTimeout = pluginsConfiguration.getConnectionTimeout(); + + 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(); - List availablePluginsList = new ArrayList<>(); - pluginsConfiguration.getPluginsList().forEach(plugin -> { - plugin.setOnline(checkPluginAvailability(plugin)); + Plugin wantedPlugin = pluginsConfiguration.getPluginsList().stream() + .filter(plugin -> plugin.getPluginId().equals(pluginId)) + .findAny() + .orElse(null); - availablePluginsList.add(plugin); - }); - result = gson.toJson(availablePluginsList); + if (wantedPlugin != null) { + result = gson.toJson(checkPluginAvailability(wantedPlugin)); + } } return result; } diff --git a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java index 271a3b2d22..073c79e683 100644 --- a/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java +++ b/catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java @@ -7,9 +7,9 @@ * 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. @@ -30,6 +30,7 @@ import javax.servlet.ServletContext; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; import javax.ws.rs.Path; +import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; @@ -42,42 +43,74 @@ import javax.ws.rs.core.Response.Status; @Path("/config") public class ConfigServlet extends LoggingServlet { - private static final Logger log = LoggerFactory.getLogger(ConfigServlet.class.getName()); + private static final Logger log = LoggerFactory.getLogger(ConfigServlet.class.getName()); - @GET - @Path("/ui/plugins") - @Produces(MediaType.APPLICATION_JSON) - public Response getPluginsConfiguration(@Context final HttpServletRequest request) { + @GET + @Path("/ui/plugins") + @Produces(MediaType.APPLICATION_JSON) + public Response getPluginsConfiguration(@Context final HttpServletRequest request) { - try { - logFeRequest(request); + try { + logFeRequest(request); - ServletContext context = request.getSession().getServletContext(); + ServletContext context = request.getSession().getServletContext(); - PluginStatusBL pluginStatusBL = (PluginStatusBL) context.getAttribute(Constants.PLUGIN_BL_COMPONENT); + PluginStatusBL pluginStatusBL = (PluginStatusBL) context.getAttribute(Constants.PLUGIN_BL_COMPONENT); - String result = pluginStatusBL.checkPluginsListAvailability(); + String result = pluginStatusBL.getPluginsList(); - Response response = Response.status(Status.OK).entity(result).build(); + Response response = Response.status(Status.OK).entity(result).build(); - logFeResponse(request, response); + logFeResponse(request, response); - return response; - } catch (Exception e) { - FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response"); - log.error("Unexpected FE response logging error :", e); - return Response.status(Status.INTERNAL_SERVER_ERROR).entity("{}").build(); - } + return response; + } catch (Exception e) { + FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response"); + log.error("Unexpected FE response logging error :", e); + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("{}").build(); + } - } + } + + @GET + @Path("/ui/plugins/{pluginId}/online") + @Produces(MediaType.APPLICATION_JSON) + public Response getPluginOnlineState(@PathParam("pluginId") final String pluginId, @Context final HttpServletRequest request) { + + try { + logFeRequest(request); + + ServletContext context = request.getSession().getServletContext(); + + PluginStatusBL pluginStatusBL = (PluginStatusBL) context.getAttribute(Constants.PLUGIN_BL_COMPONENT); + + String result = pluginStatusBL.getPluginAvailability(pluginId); + + if (result == null) { + log.debug("Plugin with pluginId: {} was not found in the configuration", pluginId); + return Response.status(Status.NOT_FOUND).entity("Plugin with pluginId:\"" + pluginId + "\" was not found in the configuration").build(); + } + + Response response = Response.status(Status.OK).entity(result).build(); + + logFeResponse(request, response); + + return response; + } catch (Exception e) { + FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response"); + log.error("Unexpected FE response logging error :", e); + return Response.status(Status.INTERNAL_SERVER_ERROR).entity("{}").build(); + } + } - protected void inHttpRequest(HttpServletRequest httpRequest) { + protected void inHttpRequest(HttpServletRequest httpRequest) { log.info("{} {} {}", httpRequest.getMethod(), httpRequest.getRequestURI(), httpRequest.getProtocol()); } /** * Extracted for purpose of clear method name, for logback %M parameter + * * @param response http response */ protected void outHttpResponse(Response response) { diff --git a/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/PluginStatusBLTest.java b/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/PluginStatusBLTest.java index e1d93b702d..731516e65b 100644 --- a/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/PluginStatusBLTest.java +++ b/catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/PluginStatusBLTest.java @@ -20,6 +20,7 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.when; @@ -63,24 +64,33 @@ public class PluginStatusBLTest { } @Test - public void TestOfflinePluginBeingReturnedWithIsOnlineValueFalse() throws ClientProtocolException, IOException { + public void TestPluginsConfigurationListReturnsWithWantedPlugins() { testPluginsList.add(offlinePlugin); + testPluginsList.add(onlinePlugin); when(pluginsConfiguration.getPluginsList()).thenReturn(testPluginsList); - - when(statusLine.getStatusCode()).thenReturn(404); - when(httpResponse.getStatusLine()).thenReturn(statusLine); - when(httpClient.execute(Mockito.any(HttpHead.class))).thenReturn(httpResponse); - offlinePlugin.setOnline(false); assertPluginList.add(offlinePlugin); + assertPluginList.add(onlinePlugin); String result = gson.toJson(assertPluginList); - String actualResult = pluginStatusBL.checkPluginsListAvailability(); + String actualResult = pluginStatusBL.getPluginsList(); - System.out.println(result); - System.out.println(actualResult); + assertEquals(actualResult, result); + } + + @Test + public void TestGetPluginAvailabilityShouldReturnFalseWhenPluginIsOffline() throws ClientProtocolException, IOException { + testPluginsList.add(offlinePlugin); + when(pluginsConfiguration.getPluginsList()).thenReturn(testPluginsList); - assertTrue(pluginStatusBL.checkPluginsListAvailability().equals(result)); + when(statusLine.getStatusCode()).thenReturn(404); + when(httpResponse.getStatusLine()).thenReturn(statusLine); + when(httpClient.execute(Mockito.any(HttpHead.class))).thenReturn(httpResponse); + + String result = gson.toJson(false); + String actualResult = pluginStatusBL.getPluginAvailability(offlinePlugin.getPluginId()); + + assertEquals(actualResult, result); } @Test @@ -92,13 +102,9 @@ public class PluginStatusBLTest { when(httpResponse.getStatusLine()).thenReturn(statusLine); when(httpClient.execute(Mockito.any())).thenReturn(httpResponse); - onlinePlugin.setOnline(true); - assertPluginList.add(onlinePlugin); + String result = gson.toJson(true); + String actualResult = pluginStatusBL.getPluginAvailability(onlinePlugin.getPluginId()); - String result = gson.toJson(assertPluginList); - - assertTrue(pluginStatusBL.checkPluginsListAvailability().equals(result)); - + assertEquals(actualResult, result); } - } diff --git a/catalog-ui/configurations/dev.js b/catalog-ui/configurations/dev.js index 6ca5445ba4..d1c9fe7c69 100644 --- a/catalog-ui/configurations/dev.js +++ b/catalog-ui/configurations/dev.js @@ -27,6 +27,7 @@ const SDC_CONFIG = { "GET_resource_api_artifact": "/v1/catalog/:type/:entityId/artifacts/api/:id", "GET_configuration_ui": "/v1/configuration/ui", "GET_plugins_configuration": "/config/ui/plugins", + "GET_plugin_online_state": "/config/ui/plugins/:pluginId/online", "GET_resource_validate_name": "/v1/catalog/resources/validate-name/:name", "GET_activity_log": "/v1/catalog/audit-records/:type/:id", "GET_service": "/v1/catalog/services/:id", diff --git a/catalog-ui/configurations/prod.js b/catalog-ui/configurations/prod.js index 08fd20f8e5..2cd6860595 100644 --- a/catalog-ui/configurations/prod.js +++ b/catalog-ui/configurations/prod.js @@ -27,6 +27,7 @@ const SDC_CONFIG = { "GET_resource_api_artifact": "/v1/catalog/:type/:entityId/artifacts/api/:id", "GET_configuration_ui": "/v1/configuration/ui", "GET_plugins_configuration": "/config/ui/plugins", + "GET_plugin_online_state": "/config/ui/plugins/:pluginId/online", "GET_resource_validate_name": "/v1/catalog/resources/validate-name/:name", "GET_activity_log": "/v1/catalog/audit-records/:type/:id", "GET_service": "/v1/catalog/services/:id", diff --git a/catalog-ui/src/app/models/app-config.ts b/catalog-ui/src/app/models/app-config.ts index a0ebb54638..0e6284c669 100644 --- a/catalog-ui/src/app/models/app-config.ts +++ b/catalog-ui/src/app/models/app-config.ts @@ -54,6 +54,7 @@ export interface IApi { GET_activity_log:string; GET_configuration_ui:string; GET_plugins_configuration:string; + GET_plugin_online_state:string; GET_service:string; GET_ecomp_menu_items:string; GET_service_validate_name:string; diff --git a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.html b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.html index 54a5c2648c..cce1c40765 100644 --- a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.html +++ b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.html @@ -13,10 +13,10 @@ ~ See the License for the specific language governing permissions and ~ limitations under the License. --> - +
- +
diff --git a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts index cd92cca2f7..067bb96d8e 100644 --- a/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts +++ b/catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts @@ -2,6 +2,7 @@ import {Component, Inject, Input, Output, OnInit, EventEmitter} from "@angular/c import {URLSearchParams} from '@angular/http'; import {Plugin} from "app/models"; import {EventBusService} from "../../../services/event-bus.service"; +import {PluginsService} from "../../../services/plugins.service"; @Component({ selector: 'plugin-frame', @@ -17,17 +18,26 @@ export class PluginFrameComponent implements OnInit { pluginUrl: string; private urlSearchParams: URLSearchParams; private isClosed: boolean; + private isPluginCheckDone: boolean; constructor(private eventBusService: EventBusService, + private pluginsService: PluginsService, @Inject('$scope') private $scope: ng.IScope, @Inject('$state') private $state: ng.ui.IStateService) { this.urlSearchParams = new URLSearchParams(); + this.isPluginCheckDone = false; } ngOnInit(): void { - if (this.plugin.isOnline) { - this.initPlugin(); - } + this.pluginsService.isPluginOnline(this.plugin.pluginId).subscribe(isPluginOnline => { + this.plugin.isOnline = isPluginOnline; + this.isPluginCheckDone = true; + + if (this.plugin.isOnline) { + this.initPlugin(); + } + }) + } private initPlugin() { diff --git a/catalog-ui/src/app/ng2/services/plugins.service.ts b/catalog-ui/src/app/ng2/services/plugins.service.ts index 7a85b6e1b6..2a3b68fe25 100644 --- a/catalog-ui/src/app/ng2/services/plugins.service.ts +++ b/catalog-ui/src/app/ng2/services/plugins.service.ts @@ -1,10 +1,19 @@ -import { Injectable } from '@angular/core'; -import {Plugin, PluginsConfiguration} from "app/models"; +import { Injectable, Inject } from '@angular/core'; +import {Observable} from 'rxjs/Observable'; +import {Http, Response} from '@angular/http'; +import {IApi, IAppConfigurtaion, Plugin, Plugins, PluginsConfiguration} from "app/models"; +import {ISdcConfig, SdcConfigToken} from "../config/sdc-config.config"; @Injectable() export class PluginsService { - constructor() { + private baseUrl; + public configuration: IAppConfigurtaion; + public api: IApi; + + constructor(private http: Http, @Inject(SdcConfigToken) private sdcConfig:ISdcConfig) { + this.api = this.sdcConfig.api; + this.baseUrl = this.api.root + this.sdcConfig.api.component_api_root; } public getPluginByStateUrl = (stateUrl: string) => { @@ -20,4 +29,12 @@ export class PluginsService { plugin.pluginDisplayOptions["context"].displayRoles.includes(userRole) && plugin.pluginDisplayOptions["context"].displayContext.indexOf(contextType) !== -1 }; + + public isPluginOnline = (pluginId: string): Observable => { + let url:string = this.api.no_proxy_root + this.api.GET_plugin_online_state.replace(':pluginId', pluginId); + return this.http.get(url).map((res: Response) => { + return res.json() + }) + .catch(error => Observable.of(false)); + } } 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 55c7a11cf4..b3b57e3182 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 @@ -80,14 +80,6 @@ public class PluginsConfiguration extends BasicConfiguration { this.pluginDisplayOptions = pluginDisplayOptions; } - public boolean isOnline() { - return isOnline; - } - - public void setOnline(boolean online) { - isOnline = online; - } - } public static class PluginDisplayOptions { -- cgit 1.2.3-korg