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>
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
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;
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);
}
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);
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
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;
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";
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));
}
pluginSourceUrl: string;
pluginStateUrl: string;
pluginDisplayOptions: Map<string, PluginDisplayOptions>;
+ isOnline: boolean;
}
export class PluginDisplayOptions {
export class PluginsConfiguration {
static plugins: Plugins;
+ static connectionTimeout: boolean;
}
}
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,
-<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>
--- /dev/null
+.plugins-tab-container {
+
+ text-align: center;
+
+ .offline-plugin-message {
+ top: 50px;
+ position: relative;
+ display: inline-block;
+ }
+}
user:IUserProperties;
queryParams: Object;
isLoading: boolean;
+ show: boolean;
onLoadingDone(plugin: Plugin): void;
}
}
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,
<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>
--- /dev/null
+.workspace-plugins {
+
+ text-align: center;
+
+ .offline-plugin-message {
+ display: inline-block;
+ }
+}
+++ /dev/null
-.workspace-plugins {
-
-}
@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';
public class PluginsConfiguration extends BasicConfiguration {
private List<Plugin> pluginsList;
+ private Integer connectionTimeout;
public List<Plugin> getPluginsList() {
return pluginsList;
this.pluginsList = pluginsList;
}
+ public Integer getConnectionTimeout() {
+ return connectionTimeout;
+ }
+
+ public void setConnectionTimeout(Integer connectionTimeout) {
+ this.connectionTimeout = connectionTimeout;
+ }
+
public PluginsConfiguration() {
this.pluginsList = new ArrayList<>();
}
private String pluginSourceUrl;
private String pluginStateUrl;
private Map<String, PluginDisplayOptions> pluginDisplayOptions;
+ private boolean isOnline;
public String getPluginId() {
return pluginId;
this.pluginDisplayOptions = pluginDisplayOptions;
}
+ public boolean isOnline() {
+ return isOnline;
+ }
+
+ public void setOnline(boolean online) {
+ isOnline = online;
+ }
+
}
public static class PluginDisplayOptions {