--- /dev/null
+package org.openecomp.sdc.fe.impl;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.HttpHead;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.openecomp.sdc.fe.config.DesignersConfiguration;
+import org.openecomp.sdc.fe.config.DesignersConfiguration.Designer;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class DesignerStatusBL {
+
+ private static Logger log = LoggerFactory.getLogger(DesignerStatusBL.class.getName());
+ private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
+ private CloseableHttpClient client = null;
+
+ public DesignerStatusBL() {
+ this.client = HttpClients.createDefault();
+ }
+
+ public DesignerStatusBL(CloseableHttpClient client) {
+ this.client = client;
+
+ }
+
+ public String checkDesinerListAvailability() {
+ String result = null;
+
+ DesignersConfiguration designersConfiguarion = ConfigurationManager.getConfigurationManager()
+ .getDesignersConfiguration();
+
+ if (designersConfiguarion == null || designersConfiguarion.getDesignersList() == null) {
+ log.warn("Configuration of type {} was not found", DesignersConfiguration.class);
+ } else {
+ log.debug("The value returned from getConfig is {}", designersConfiguarion);
+
+ Map<String, Designer> avaiableDesignersMap = new HashMap<String, Designer>();
+
+ designersConfiguarion.getDesignersList().forEach((key, value) -> {
+ if (CheckDesignerAvailabilty(value)) {
+ avaiableDesignersMap.put(key, value);
+ }
+
+ });
+ result = gson.toJson(avaiableDesignersMap);
+ }
+ return result;
+ }
+
+ private boolean CheckDesignerAvailabilty(Designer designer) {
+
+ StringBuilder requestString = new StringBuilder();
+ boolean result = false;
+
+ requestString.append(designer.getDesignerProtocol()).append("://").append(designer.getDesignerHost()).append(":")
+ .append(designer.getDesignerPort()).append(designer.getDesignerPath());
+
+ HttpHead head = new HttpHead(requestString.toString());
+
+ try (CloseableHttpResponse response = this.client.execute(head)) {
+ result = response != null && response.getStatusLine().getStatusCode() == 200;
+ } catch (IOException e) {
+ log.debug("The designer {} is offline", designer);
+ }
+
+ return result;
+ }
+
+}
import org.openecomp.sdc.common.impl.ExternalConfiguration;
import org.openecomp.sdc.common.listener.AppContextListener;
import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.openecomp.sdc.fe.impl.DesignerStatusBL;
import org.openecomp.sdc.fe.monitoring.FeMonitoringService;
import org.openecomp.sdc.fe.servlets.HealthCheckService;
import org.slf4j.Logger;
log.debug("loading configuration from configDir:{} appName:{}", ExternalConfiguration.getConfigDir(),
ExternalConfiguration.getAppName());
context.getServletContext().setAttribute(Constants.CONFIGURATION_MANAGER_ATTR, configurationManager);
+
+ DesignerStatusBL dsbl = new DesignerStatusBL();
+ context.getServletContext().setAttribute(Constants.DESIGNER_BL_COMPONENT, dsbl);
// Health Check service
HealthCheckService hcs = new HealthCheckService(context.getServletContext());
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.Status;
import org.openecomp.sdc.common.api.ConfigurationSource;
import org.openecomp.sdc.common.api.Constants;
import org.openecomp.sdc.common.servlets.BasicServlet;
import org.openecomp.sdc.fe.config.Configuration;
+import org.openecomp.sdc.fe.impl.DesignerStatusBL;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@Path("/config")
public class ConfigServlet extends BasicServlet {
+ private static final long serialVersionUID = 1L;
private static Logger log = LoggerFactory.getLogger(ConfigServlet.class.getName());
- @GET
- @Path("/get")
- @Produces(MediaType.APPLICATION_JSON)
+ //@GET
+ //@Path("/get")
+ //@Produces(MediaType.APPLICATION_JSON)
public String getConfig(@Context final HttpServletRequest request) {
String result = null;
}
- @GET
- @Path("/asyncget")
+ //@GET
+ //@Path("/asyncget")
public void asyncGet(@Suspended final AsyncResponse asyncResponse) {
asyncResponse.setTimeoutHandler(new TimeoutHandler() {
}).start();
}
+ @GET
+ @Path("/ui/designers")
+ @Produces(MediaType.APPLICATION_JSON)
+ public Response getDesignersConfiguration(@Context final HttpServletRequest request) {
+ String result = null;
+
+ ServletContext context = request.getSession().getServletContext();
+
+ DesignerStatusBL designerStatusBL = (DesignerStatusBL) context.getAttribute(Constants.DESIGNER_BL_COMPONENT);
+
+ result = designerStatusBL.checkDesinerListAvailability();
+
+ return Response.status(Status.OK).entity(result).build();
+
+ }
}
--- /dev/null
+designersList:
+ DCAE:
+ displayName: DCAE
+ designerHost: 192.168.50.5
+ designerPort: 8080
+ designerPath: "/dcae"
+ designerProtocol: http
+ WORKFLOW:
+ displayName: WORKFLOW
+ designerHost: 192.168.50.5
+ designerPort: 9527
+ designerPath: ""
+ designerProtocol: http
\ No newline at end of file
--- /dev/null
+package org.openecomp.sdc.fe.servlets;
+
+import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.when;
+
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.http.StatusLine;
+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.BeforeClass;
+import org.junit.Test;
+import org.mockito.Mockito;
+import org.openecomp.sdc.fe.config.ConfigurationManager;
+import org.openecomp.sdc.fe.config.DesignersConfiguration;
+import org.openecomp.sdc.fe.config.DesignersConfiguration.Designer;
+import org.openecomp.sdc.fe.impl.DesignerStatusBL;
+
+import com.google.gson.Gson;
+import com.google.gson.GsonBuilder;
+
+public class DesignerStatusBLTest {
+
+ final static CloseableHttpClient httpClient = Mockito.mock(CloseableHttpClient.class);
+ DesignerStatusBL designerStatusBL = new DesignerStatusBL(httpClient);
+ private static Gson gson = new GsonBuilder().setPrettyPrinting().create();
+
+ final static ConfigurationManager configurationManager = Mockito.mock(ConfigurationManager.class);
+ final static DesignersConfiguration designersConfiguraiton = Mockito.mock(DesignersConfiguration.class);
+ final static Designer offlineDesigner = new Designer();
+ final static Designer onlineDesinger = new Designer();
+ final static CloseableHttpResponse httpResponse = Mockito.mock(CloseableHttpResponse.class);
+ final static StatusLine statusLine = Mockito.mock(StatusLine.class);
+ final static Map<String, Designer> testDesignersList = new HashMap<String, Designer>();
+
+ final static String offlineDesignerDisplayName = "offlineDesigner";
+ final static String offlineDesignerHost = "192.168.10.1";
+ final static int offlineDesignerPort = 1000;
+ final static String offlineDesignerPath = "/offline";
+ final static String offlineDesignerProtocol = "http";
+
+ final static String onlineDesignerDisplayName = "onlineDesigner";
+ final static String onlineDesignerHost = "192.168.20.2";
+ final static int onlineDesignerPort = 2000;
+ final static String onlineDesignerPath = "/online";
+ final static String onlineDesignerProtocol = "http";
+
+ StringBuilder offlineRequestString = new StringBuilder();
+ StringBuilder onlineRequestString = new StringBuilder();
+
+ @BeforeClass
+ public static void beforeClass() {
+ ConfigurationManager.setTestInstance(configurationManager);
+ when(configurationManager.getDesignersConfiguration()).thenReturn(designersConfiguraiton);
+
+ offlineDesigner.setDisplayName(offlineDesignerDisplayName);
+ offlineDesigner.setDesignerHost(offlineDesignerHost);
+ offlineDesigner.setDesignerPort(offlineDesignerPort);
+ offlineDesigner.setDesignerPath(offlineDesignerPath);
+ offlineDesigner.setDesignerProtocol(offlineDesignerProtocol);
+
+ StringBuilder offlineRequestString = new StringBuilder();
+ offlineRequestString.append(offlineDesignerProtocol).append("://").append(onlineDesignerHost).append(":")
+ .append(offlineDesignerPort).append(offlineDesignerPath);
+
+ onlineDesinger.setDisplayName(onlineDesignerDisplayName);
+ onlineDesinger.setDesignerHost(onlineDesignerHost);
+ onlineDesinger.setDesignerPort(onlineDesignerPort);
+ onlineDesinger.setDesignerPath(onlineDesignerPath);
+ onlineDesinger.setDesignerProtocol(onlineDesignerProtocol);
+
+ StringBuilder onlineRequestString = new StringBuilder();
+ onlineRequestString.append(onlineDesignerProtocol).append("://").append(onlineDesignerHost).append(":")
+ .append(offlineDesignerPort).append(offlineDesignerPath);
+
+ }
+
+ @Test
+ public void TestOfflineDesignerNotBeingReturnedWhenCallingCheckDesinerListAvailability() throws ClientProtocolException, IOException {
+ testDesignersList.put("offlineDesigner", offlineDesigner);
+ when(designersConfiguraiton.getDesignersList()).thenReturn(testDesignersList);
+
+ when(statusLine.getStatusCode()).thenReturn(404);
+ when(httpResponse.getStatusLine()).thenReturn(statusLine);
+ when(httpClient.execute(Mockito.any(HttpHead.class))).thenReturn(httpResponse);
+
+ assertTrue(designerStatusBL.checkDesinerListAvailability().equals("{}"));
+
+ }
+
+ @Test
+ public void TestOnlineDesignerNotBeingReturnedWhenCallingCheckDesinerListAvailability() throws ClientProtocolException, IOException {
+ testDesignersList.put("onlineDesigner", onlineDesinger);
+ when(designersConfiguraiton.getDesignersList()).thenReturn(testDesignersList);
+
+ when(statusLine.getStatusCode()).thenReturn(200);
+ when(httpResponse.getStatusLine()).thenReturn(statusLine);
+ when(httpClient.execute(Mockito.any())).thenReturn(httpResponse);
+
+ String result = gson.toJson(testDesignersList);
+
+ assertTrue(designerStatusBL.checkDesinerListAvailability().equals(result));
+
+ }
+
+}
"GET_resource_interface_artifact": "/v1/catalog/:type/:entityId/standard/:operation/artifacts/:id",
"GET_resource_api_artifact": "/v1/catalog/:type/:entityId/artifacts/api/:id",
"GET_configuration_ui": "/v1/configuration/ui",
+ "GET_designers_configuration": "/config/ui/designers",
"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",
"GET_lifecycle_state_CERTIFICATIONREQUEST":"lifecycleState/CERTIFICATIONREQUEST",
"GET_lifecycle_state_UNDOCHECKOUT":"lifecycleState/UNDOCHECKOUT",
"root": "/sdc1/feProxy/rest",
+ "no_proxy_root": "/sdc1/rest",
"PUT_service": "/v1/catalog/services/:id/metadata",
"GET_download_artifact": "/v1/catalog/",
"GET_SDC_Version": "/version",
* 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.
GET_resource_artifact_types:string;
GET_activity_log:string;
GET_configuration_ui:string;
+ GET_designers_configuration:string;
GET_service:string;
GET_ecomp_menu_items:string;
GET_service_validate_name:string;
GET_lifecycle_state_CERTIFICATIONREQUEST:string;
GET_lifecycle_state_UNDOCHECKOUT:string;
root:string;
+ no_proxy_root:string;
PUT_service:string;
GET_download_artifact:string;
GET_SDC_Version:string;
* 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.
export const upgradeAdapter = new UpgradeAdapter(forwardRef(() => AppModule));
export function configServiceFactory(config:ConfigService) {
- return () => config.loadValidationConfiguration();
+ return () => {
+ config.loadValidationConfiguration();
+ config.loadDesignersConfiguration();
+ }
}
* 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.
import { Http, Response } from '@angular/http';
import 'rxjs/add/operator/toPromise';
import {IAppConfigurtaion, ValidationConfiguration, Validations} from "app/models";
+import {IApi} from "app/models/app-config";
import {SdcConfigToken, ISdcConfig} from "../config/sdc-config.config";
@Injectable()
private baseUrl;
public configuration: IAppConfigurtaion;
+ public api:IApi;
constructor(private http: Http, @Inject(SdcConfigToken) private sdcConfig:ISdcConfig) {
- this.baseUrl = this.sdcConfig.api.root + this.sdcConfig.api.component_api_root;
+ this.api = this.sdcConfig.api;
+ this.baseUrl = this.api.root + this.api.component_api_root;
}
loadValidationConfiguration(): Promise<ValidationConfiguration> {
ValidationConfiguration.validation = validationData;
}).catch((ex) => {
console.error('Error loading validation.json configuration file, using fallback data', ex);
-
+
let fallback:Validations = {
"propertyValue": {
"max": 2500,
"integer": "^(([-+]?\\d+)|([-+]?0x[0-9a-fA-F]+))$"
}
};
-
+
ValidationConfiguration.validation = fallback;
-
+
});
return promise;
}
+ loadDesignersConfiguration(): void {
+ let url:string = this.api.no_proxy_root + this.api.GET_designers_configuration;
+ let promise: Promise<any> = this.http.get(url).map((res: Response) => res.json()).toPromise();
+
+ promise.then((config:any) => {
+ console.log(config);
+ }).catch((ex) => {
+ console.error('Error was:', ex);
+ })
+ }
+
}
secure: false
}));
+ middlewares.push(
+ proxy(['/sdc1/rest'],{
+ target: 'http://localhost:' + fePort,
+ changeOrigin: true,
+ secure: false
+ }));
+
// Redirect dcae urls to feHost
middlewares.push(
proxy(['/dcae','/sdc1/feProxy/dcae-api'],{
};
return ServerConfig;
-}
\ No newline at end of file
+}
//external HealthCheck components
public static final String HC_COMPONENT_ON_BOARDING = "ON_BOARDING";
public static final String HC_COMPONENT_DCAE = "DCAE";
+
+ //Designer BL
+ public static final String DESIGNER_BL_COMPONENT = "designerStatusBL";
}
import org.openecomp.sdc.common.config.EcompErrorConfiguration;
import org.openecomp.sdc.common.config.IEcompConfigurationManager;
import org.openecomp.sdc.common.rest.api.RestConfigurationInfo;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
public class ConfigurationManager implements FileChangeCallback, IEcompConfigurationManager {
ConfigurationSource configurationSource = null;
private static ConfigurationManager instance;
+ private static Logger log = LoggerFactory.getLogger(ConfigurationManager.class.getName());
public ConfigurationManager(ConfigurationSource configurationSource) {
super();
loadConfigurationClass(Configuration.class);
loadConfigurationClass(RestConfigurationInfo.class);
loadConfigurationClass(EcompErrorConfiguration.class);
+ loadConfigurationClass(DesignersConfiguration.class);
}
private <T extends BasicConfiguration> void loadConfigurationClass(Class<T> clazz) {
ConfigurationListener configurationListener = new ConfigurationListener(clazz, this);
+
+ log.info("created listener for class {}: {}", clazz.getName(), configurationListener);
T object = configurationSource.getAndWatchConfiguration(clazz, configurationListener);
return (EcompErrorConfiguration) configurations.get(getKey(EcompErrorConfiguration.class));
}
+
+ public DesignersConfiguration getDesignersConfiguration() {
+
+ log.info("requested designers configuration and got this:{}", (DesignersConfiguration) configurations.get(getKey(DesignersConfiguration.class)));
+
+ return (DesignersConfiguration) configurations.get(getKey(DesignersConfiguration.class));
+ }
public Configuration getConfigurationAndWatch(ConfigurationListener configurationListener) {
public static ConfigurationManager getConfigurationManager() {
return instance;
}
+
+ public static void setTestInstance(ConfigurationManager configurationManagerInstance) {
+ instance = configurationManagerInstance;
+ }
}
--- /dev/null
+package org.openecomp.sdc.fe.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.openecomp.sdc.common.api.BasicConfiguration;
+
+public class DesignersConfiguration extends BasicConfiguration {
+
+ private Map<String,Designer> designersList;
+
+ public Map<String,Designer> getDesignersList() {
+ return designersList;
+ }
+
+ public void setDesignersList(Map<String,Designer> designersList) {
+ this.designersList = designersList;
+ }
+
+ public DesignersConfiguration() {
+ this.designersList = new HashMap<String, Designer>();
+ }
+
+ public static class Designer {
+
+ private String displayName;
+ private String designerHost;
+ private Integer designerPort;
+ private String designerPath;
+ private String designerProtocol;
+
+
+ public String getDesignerProtocol() {
+ return designerProtocol;
+ }
+
+ public void setDesignerProtocol(String designerProtocol) {
+ this.designerProtocol = designerProtocol;
+ }
+
+ public String getDisplayName() {
+ return displayName;
+ }
+
+ public void setDisplayName(String displayName) {
+ this.displayName = displayName;
+ }
+
+ public String getDesignerHost() {
+ return designerHost;
+ }
+
+ public void setDesignerHost(String designerHost) {
+ this.designerHost = designerHost;
+ }
+
+ public Integer getDesignerPort() {
+ return designerPort;
+ }
+
+ public void setDesignerPort(Integer designerPort) {
+ this.designerPort = designerPort;
+ }
+
+ public String getDesignerPath() {
+ return designerPath;
+ }
+
+ public void setDesignerPath(String designerPath) {
+ this.designerPath = designerPath;
+ }
+
+ }
+
+}
+
+
"FE": "yyy",
"ES": "yyy",
"KB": "yyy"
+ },
+ "Designers": {
+ "DCAE": {
+ "dcae_host": "yyy",
+ "dcae_port": "yyy",
+ "dcae_path": "yyy",
+ "dcae_protocol": "yyy"
+ },
+ "WORKFLOW": {
+ "workflow_host": "yyy",
+ "workflow_port": "yyy",
+ "workflow_path": "yyy",
+ "workflow_protocol": "yyy"
+ }
}
},
"override_attributes": {
})
end
+template "designers-fe-config" do
+ path "#{jetty_base}/config/catalog-fe/designers-configuration.yaml"
+ source "FE-designers-configuration.yaml.erb"
+ owner "jetty"
+ group "jetty"
+ mode "0755"
+ variables({
+ :dcae_host => node['Designers']['DCAE']['dcae_host'],
+ :dcae_port => node['Designers']['DCAE']['dcae_port'],
+ :dcae_path => node['Designers']['DCAE']['dcae_path'],
+ :dcae_protocol => node['Designers']['DCAE']['dcae_protocol'],
+ :workflow_host => node['Designers']['WORKFLOW']['workflow_host'],
+ :workflow_port => node['Designers']['WORKFLOW']['workflow_port'],
+ :workflow_path => node['Designers']['WORKFLOW']['workflow_path'],
+ :workflow_protocol => node['Designers']['WORKFLOW']['workflow_protocol']
+ })
+end
+
template "onboarding-fe-config" do
path "#{jetty_base}/config/onboarding-fe/onboarding_configuration.yaml"
--- /dev/null
+designersList:
+ DCAE:
+ displayName: DCAE
+ designerHost: <%= @dcae_host %>
+ designerPort: <%= @dcae_port %>
+ designerPath: <%= @dcae_path %>
+ designerProtocol: <%= @dcae_protocol %>
+ WORKFLOW:
+ displayName: WORKFLOW
+ designerHost: <%= @workflow_host %>
+ designerPort: <%= @workflow_port %>
+ designerPath: <%= @workflow_path %>
+ designerProtocol: <%= @workflow_protocol %>
\ No newline at end of file
echo "normal['HOST_IP'] = \"${HOST_IP}\"" > /root/chef-solo/cookbooks/sdc-catalog-fe/attributes/default.rb
chef-solo -c solo.rb -E ${CHEFNAME}
-sed -i '/^set -e/aJAVA_OPTIONS=\"-XX:MaxPermSize=256m -Xmx512m -Dconfig.home=${JETTY_BASE}\/config -Dlog.home=${JETTY_BASE}\/logs -Dlogback.configurationFile=${JETTY_BASE}\/config\/catalog-fe\/logback.xml -Dconfiguration.yaml=${JETTY_BASE}\/config\/catalog-fe\/configuration.yaml -Donboarding_configuration.yaml=${JETTY_BASE}\/config\/onboarding-fe\/onboarding_configuration.yaml\"' /docker-entrypoint.sh
+sed -i '/^set -e/aJAVA_OPTIONS=\" -Xdebug -agentlib:jdwp=transport=dt_socket,address=6000,server=y,suspend=n -XX:MaxPermSize=256m -Xmx512m -Dconfig.home=${JETTY_BASE}\/config -Dlog.home=${JETTY_BASE}\/logs -Dlogback.configurationFile=${JETTY_BASE}\/config\/catalog-fe\/logback.xml -Dconfiguration.yaml=${JETTY_BASE}\/config\/catalog-fe\/configuration.yaml -Donboarding_configuration.yaml=${JETTY_BASE}\/config\/onboarding-fe\/onboarding_configuration.yaml\"' /docker-entrypoint.sh
sed -i '/^set -e/aTMPDIR=${JETTY_BASE}\/temp' /docker-entrypoint.sh
cd /var/lib/jetty