Plugin load by the UI 83/70083/2
authorIdan Amit <ia096e@intl.att.com>
Tue, 9 Oct 2018 15:45:52 +0000 (18:45 +0300)
committerMichael Lando <michael.lando@intl.att.com>
Wed, 10 Oct 2018 14:16:02 +0000 (14:16 +0000)
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 <ia096e@intl.att.com>
catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/PluginStatusBL.java
catalog-fe/src/main/java/org/openecomp/sdc/fe/servlets/ConfigServlet.java
catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/PluginStatusBLTest.java
catalog-ui/configurations/dev.js
catalog-ui/configurations/prod.js
catalog-ui/src/app/models/app-config.ts
catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.html
catalog-ui/src/app/ng2/components/ui/plugin/plugin-frame.component.ts
catalog-ui/src/app/ng2/services/plugins.service.ts
common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java

index f4cbe9a..460d6de 100644 (file)
@@ -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<Plugin> 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;
        }
index 271a3b2..073c79e 100644 (file)
@@ -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) {
index e1d93b7..731516e 100644 (file)
@@ -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);
        }
-
 }
index 6ca5445..d1c9fe7 100644 (file)
@@ -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",
index 08fd20f..2cd6860 100644 (file)
@@ -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",
index a0ebb54..0e6284c 100644 (file)
@@ -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;
index 54a5c26..cce1c40 100644 (file)
   ~ See the License for the specific language governing permissions and
   ~ limitations under the License.
   -->
-  
+
 <div class="plugin-frame">
     <div class="w-sdc-main-container">
         <iframe *ngIf="plugin.isOnline" class="plugin-iframe" [src]="pluginUrl | safeUrlSanitizer"></iframe>
-        <plugin-not-connected [pluginName]="plugin.pluginId" *ngIf="!plugin.isOnline"></plugin-not-connected>
+        <plugin-not-connected [pluginName]="plugin.pluginId" *ngIf="!plugin.isOnline && isPluginCheckDone"></plugin-not-connected>
     </div>
 </div>
index cd92cca..067bb96 100644 (file)
@@ -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() {
index 7a85b6e..2a3b68f 100644 (file)
@@ -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<boolean> => {
+        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));
+    }
 }
index 55c7a11..b3b57e3 100644 (file)
@@ -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 {