Add timeout and connection status 37/36037/2
authorIdan Amit <ia096e@intl.att.com>
Thu, 15 Mar 2018 16:07:16 +0000 (18:07 +0200)
committerMichael Lando <ml636r@att.com>
Sun, 18 Mar 2018 08:39:31 +0000 (08:39 +0000)
Added timeout and connection status to the plugins configuration.
Added support in ui to display a temporary error screen in case a plugin in offline

Change-Id: Id4a0909cc704903be6183f22c67caec6f5050103
Issue-ID: SDC-1081
Signed-off-by: Idan Amit <ia096e@intl.att.com>
14 files changed:
catalog-fe/sdc-frontend/chef-repo/cookbooks/sdc-catalog-fe/templates/default/FE-plugins-configuration.yaml.erb
catalog-fe/src/main/java/org/openecomp/sdc/fe/impl/PluginStatusBL.java
catalog-fe/src/main/resources/config/plugins-configuration.yaml
catalog-fe/src/test/java/org/openecomp/sdc/fe/servlets/PluginStatusBLTest.java
catalog-ui/src/app/models/plugins-config.ts
catalog-ui/src/app/view-models/plugins/plugins-tab-view-model.ts
catalog-ui/src/app/view-models/plugins/plugins-tab-view.html
catalog-ui/src/app/view-models/plugins/plugins-tab.less [new file with mode: 0644]
catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view-model.ts
catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context-view.html
catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context.less [new file with mode: 0644]
catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-tab.less [deleted file]
catalog-ui/src/assets/styles/app.less
common-app-api/src/main/java/org/openecomp/sdc/fe/config/PluginsConfiguration.java

index a21a7ab..0da7973 100644 (file)
@@ -18,5 +18,7 @@ pluginsList:
             displayRoles: ["DESIGNER", "TESTER"]
         context:
             displayName: "Workflow Designer"
-            displayContext: ["VF"]
-            displayRoles: ["DESIGNER", "TESTER"]
\ No newline at end of file
+            displayContext: ["VF", "SERVICE"]
+            displayRoles: ["DESIGNER", "TESTER"]
+
+connectionTimeout: 1000
index 563dc22..5ed4585 100644 (file)
@@ -23,11 +23,13 @@ public class PluginStatusBL {
        private static Logger log = LoggerFactory.getLogger(PluginStatusBL.class.getName());
        private static  Gson gson = new GsonBuilder().setPrettyPrinting().create();
        private CloseableHttpClient client = null;
-       
+       private PluginsConfiguration pluginsConfiguration = ConfigurationManager.getConfigurationManager().getPluginsConfiguration();
+       private Integer connectionTimeout;
+
        public PluginStatusBL() {
                this.client = HttpClients.createDefault();
        }
-       
+
        public PluginStatusBL(CloseableHttpClient client) {
                this.client = client;
                                
@@ -36,21 +38,18 @@ public class PluginStatusBL {
        public String checkPluginsListAvailability() {
                String result = null;
 
-               PluginsConfiguration pluginsConfiguration = ConfigurationManager.getConfigurationManager()
-                               .getPluginsConfiguration();
-
                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);
+                       connectionTimeout = pluginsConfiguration.getConnectionTimeout();
 
                        List<Plugin> availablePluginsList = new ArrayList<>();
 
-                       pluginsConfiguration.getPluginsList().forEach(value -> {
-                               if (checkPluginAvailability(value)) {
-                                       availablePluginsList.add(value);
-                               }
+                       pluginsConfiguration.getPluginsList().forEach(plugin -> {
+                               plugin.setOnline(checkPluginAvailability(plugin));
 
+                               availablePluginsList.add(plugin);
                        });
                        result = gson.toJson(availablePluginsList);
                }
@@ -62,9 +61,9 @@ public class PluginStatusBL {
 
                HttpHead head = new HttpHead(plugin.getPluginDiscoveryUrl());
                RequestConfig requestConfig = RequestConfig.custom()
-                               .setSocketTimeout(1000)
-                               .setConnectTimeout(1000)
-                               .setConnectionRequestTimeout(1000).build();
+                               .setSocketTimeout(connectionTimeout)
+                               .setConnectTimeout(connectionTimeout)
+                               .setConnectionRequestTimeout(connectionTimeout).build();
 
                head.setConfig(requestConfig);
 
index 69598e0..eb36945 100644 (file)
@@ -17,5 +17,7 @@ pluginsList:
             displayName: "WORKFLOW"
         context:
             displayName: "Workflow Designer"
-            displayContext: ["VF"]
-            displayRoles: ["DESIGNER", "TESTER"]
\ No newline at end of file
+            displayContext: ["VF", "SERVICE"]
+            displayRoles: ["DESIGNER", "TESTER"]
+
+connectionTimeout: 1000
\ No newline at end of file
index baef685..25fef89 100644 (file)
@@ -12,6 +12,7 @@ import org.apache.http.client.ClientProtocolException;
 import org.apache.http.client.methods.CloseableHttpResponse;
 import org.apache.http.client.methods.HttpHead;
 import org.apache.http.impl.client.CloseableHttpClient;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -35,7 +36,8 @@ public class PluginStatusBLTest {
        final static Plugin onlinePlugin = new Plugin();
        final static CloseableHttpResponse httpResponse = Mockito.mock(CloseableHttpResponse.class);
        final static StatusLine statusLine = Mockito.mock(StatusLine.class); 
-       final static List<Plugin> testPluginsList = new ArrayList<>();
+       static List<Plugin> testPluginsList = new ArrayList<>();
+       static List<Plugin> assertPluginList = new ArrayList<>();
 
        final static String offlinePluginsDisplayName = "offlinePlugin";
        final static String offlinePluginDiscoveryPath = "http://192.168.10.1:1000/offline";
@@ -53,34 +55,50 @@ public class PluginStatusBLTest {
 
                onlinePlugin.setPluginId(onlinePluginDisplayName);
                onlinePlugin.setPluginDiscoveryUrl(onlinePluginDiscoveryPath);
-               
+       }
+
+       @Before
+       public void beforeTest() {
+               testPluginsList = new ArrayList<>();
+               assertPluginList = new ArrayList<>();
        }
 
        @Test
-       public void TestOfflinePluginNotBeingReturnedWhenCallingCheckPluginsListAvailability() throws ClientProtocolException, IOException {
+       public void TestOfflinePluginBeingReturnedWithIsOnlineValueFalse() throws ClientProtocolException, IOException {
                testPluginsList.add(offlinePlugin);
                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);
+
+               String result = gson.toJson(assertPluginList);
+               String actualResult = pluginStatusBL.checkPluginsListAvailability();
+
+               System.out.println(result);
+               System.out.println(actualResult);
                
-               assertTrue(pluginStatusBL.checkPluginsListAvailability().equals("[]"));
-               
+               assertTrue(pluginStatusBL.checkPluginsListAvailability().equals(result));
        }
        
        @Test
-       public void TestOnlinePluginNotBeingReturnedWhenCallingCheckPluginsListAvailability() throws ClientProtocolException, IOException {
+       public void TestOnlinePluginBeingReturnedWithIsOnlineValueTrue() throws ClientProtocolException, IOException {
                testPluginsList.add(onlinePlugin);
                when(pluginsConfiguration.getPluginsList()).thenReturn(testPluginsList);
                
                when(statusLine.getStatusCode()).thenReturn(200);               
                when(httpResponse.getStatusLine()).thenReturn(statusLine);              
                when(httpClient.execute(Mockito.any())).thenReturn(httpResponse);
+
+               onlinePlugin.setOnline(true);
+               assertPluginList.add(onlinePlugin);
+
+               String result = gson.toJson(assertPluginList);
                
-               String result = gson.toJson(testPluginsList);
-               
-               assertTrue(pluginStatusBL.checkPluginsListAvailability().contains(result));
+               assertTrue(pluginStatusBL.checkPluginsListAvailability().equals(result));
                
        }
 
index 3f687a3..e69501a 100644 (file)
@@ -5,6 +5,7 @@ export class Plugin {
     pluginSourceUrl: string;
     pluginStateUrl: string;
     pluginDisplayOptions: Map<string, PluginDisplayOptions>;
+    isOnline: boolean;
 }
 
 export class PluginDisplayOptions {
@@ -17,4 +18,5 @@ export type Plugins = Array<Plugin>;
 
 export class PluginsConfiguration {
     static plugins: Plugins;
+    static connectionTimeout: boolean;
 }
index 438cf4a..cb3f842 100644 (file)
@@ -30,11 +30,15 @@ export class PluginsTabViewModel {
     }
 
     private initScope = ():void => {
-        this.$scope.isLoading = true;
         this.$scope.plugin = this.pluginsService.getPluginByStateUrl(this.$stateParams.path);
         this.$scope.version = this.cacheService.get('version');
         this.$scope.user = this.cacheService.get('user');
 
+        // Don't show the loader if the plugin isn't online
+        if (this.$scope.plugin.isOnline) {
+            this.$scope.isLoading = true;
+        }
+
         this.$scope.queryParams = {
             userId: this.$scope.user.userId,
             userRole: this.$scope.user.role,
index bc404b4..6ee4855 100644 (file)
@@ -1,5 +1,6 @@
-<div class="sdc-catalog-container">
+<div class="sdc-catalog-container plugins-tab-container">
     <loader display="isLoading"></loader>
     <top-nav [version]="version" [hide-search]="true"></top-nav>
-    <plugin-frame (on-loading-done)="onLoadingDone(plugin)" [plugin]="plugin" [query-params]="queryParams"></plugin-frame>
+    <plugin-frame data-ng-if="plugin.isOnline" (on-loading-done)="onLoadingDone(plugin)" [plugin]="plugin" [query-params]="queryParams"></plugin-frame>
+    <div class="offline-plugin-message" data-ng-if="!plugin.isOnline">The plugin {{plugin.pluginId}} is offline. Please try again later</div>
 </div>
diff --git a/catalog-ui/src/app/view-models/plugins/plugins-tab.less b/catalog-ui/src/app/view-models/plugins/plugins-tab.less
new file mode 100644 (file)
index 0000000..f821041
--- /dev/null
@@ -0,0 +1,10 @@
+.plugins-tab-container {
+
+    text-align: center;
+
+    .offline-plugin-message {
+        top: 50px;
+        position: relative;
+        display: inline-block;
+    }
+}
index 550fb84..3e0fb44 100644 (file)
@@ -9,6 +9,7 @@ interface IPluginsContextViewModelScope extends IWorkspaceViewModelScope {
     user:IUserProperties;
     queryParams: Object;
     isLoading: boolean;
+    show: boolean;
 
     onLoadingDone(plugin: Plugin): void;
 }
@@ -30,10 +31,15 @@ export class PluginsContextViewModel {
     }
 
     private initScope = ():void => {
-        this.$scope.isLoading = true;
+        this.$scope.show = false;
         this.$scope.plugin = this.pluginsService.getPluginByStateUrl(this.$stateParams.path);
         this.$scope.user = this.cacheService.get('user');
 
+        // Don't show loader if the plugin isn't online
+        if (this.$scope.plugin.isOnline) {
+            this.$scope.isLoading = true;
+        }
+
         this.$scope.queryParams = {
             userId: this.$scope.user.userId,
             userRole: this.$scope.user.role,
index d70717a..6c34749 100644 (file)
@@ -1,4 +1,5 @@
 <loader display="isLoading"></loader>
 <div class="workspace-plugins">
-    <plugin-frame (on-loading-done)="onLoadingDone(plugin)" [plugin]="plugin" [query-params]="queryParams"></plugin-frame>
+    <plugin-frame data-ng-if="plugin.isOnline" (on-loading-done)="onLoadingDone(plugin)" [plugin]="plugin" [query-params]="queryParams"></plugin-frame>
+    <div class="offline-plugin-message" data-ng-if="!plugin.isOnline">The plugin {{plugin.pluginId}} is offline. Please try again later</div>
 </div>
diff --git a/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context.less b/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-context.less
new file mode 100644 (file)
index 0000000..dd0b751
--- /dev/null
@@ -0,0 +1,8 @@
+.workspace-plugins {
+
+    text-align: center;
+
+    .offline-plugin-message {
+        display: inline-block;
+    }
+}
diff --git a/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-tab.less b/catalog-ui/src/app/view-models/workspace/tabs/plugins/plugins-tab.less
deleted file mode 100644 (file)
index 7798e36..0000000
+++ /dev/null
@@ -1,3 +0,0 @@
-.workspace-plugins {
-
-}
index f48fd86..6eabc7e 100644 (file)
@@ -93,6 +93,7 @@
 @import '../../app/view-models/modals/onboarding-modal/onboarding-modal.less';
 @import '../../app/view-models/modals/icons-modal/icons-modal-view.less';
 @import '../../app/view-models/onboard-vendor/onboard-vendor.less';
+@import '../../app/view-models/plugins/plugins-tab.less';
 @import '../../app/view-models/support/support.less';
 @import '../../app/view-models/tabs/general-tab.less';
 @import '../../app/view-models/tabs/hierarchy/hierarchy.less';
 @import '../../app/view-models/workspace/tabs/req-and-capabilities/req-and-capabilities.less';
 @import '../../app/view-models/workspace/tabs/tosca-artifacts/tosca-artifacts.less';
 @import '../../app/view-models/workspace/workspace.less';
+@import '../../app/view-models/workspace/tabs/plugins/plugins-context.less';
index 7865abd..3dbf31b 100644 (file)
@@ -9,6 +9,7 @@ import org.openecomp.sdc.common.api.BasicConfiguration;
 public class PluginsConfiguration extends BasicConfiguration {
 
     private List<Plugin> pluginsList;
+    private Integer connectionTimeout;
 
     public List<Plugin> getPluginsList() {
         return pluginsList;
@@ -18,6 +19,14 @@ public class PluginsConfiguration extends BasicConfiguration {
         this.pluginsList = pluginsList;
     }
 
+    public Integer getConnectionTimeout() {
+        return connectionTimeout;
+    }
+
+    public void setConnectionTimeout(Integer connectionTimeout) {
+        this.connectionTimeout = connectionTimeout;
+    }
+
     public PluginsConfiguration() {
         this.pluginsList = new ArrayList<>();
     }
@@ -29,6 +38,7 @@ public class PluginsConfiguration extends BasicConfiguration {
         private String pluginSourceUrl;
         private String pluginStateUrl;
         private Map<String, PluginDisplayOptions> pluginDisplayOptions;
+        private boolean isOnline;
 
         public String getPluginId() {
             return pluginId;
@@ -70,6 +80,14 @@ public class PluginsConfiguration extends BasicConfiguration {
             this.pluginDisplayOptions = pluginDisplayOptions;
         }
 
+        public boolean isOnline() {
+            return isOnline;
+        }
+
+        public void setOnline(boolean online) {
+            isOnline = online;
+        }
+
     }
 
     public static class PluginDisplayOptions {