From c73866cf44cad2be9a91ea1e2a3a77fcc29d9c2a Mon Sep 17 00:00:00 2001 From: "Kotagiri, Ramprasad (rp5662)" Date: Mon, 3 Feb 2020 13:43:25 -0500 Subject: [PATCH] DCAE dashboard security fixes Portal SDK ver 2.6.0, non-root user for docker container Change label on Dashboard Home page, API changes, Container optimization Change-Id: Ie2c8efd76d34fddc2b182d5ed494761522695914 Issue-ID: DCAEGEN2-1638 Issue-ID: CCSDK-1485 Issue-ID: DCAEGEN2-1921 Issue-ID: DCAEGEN2-1915 Issue-ID: DCAEGEN2-1856 Issue-ID: DCAEGEN2-1556 Issue-ID: DCAEGEN2-1592 Signed-off-by: Kotagiri, Ramprasad (rp5662) --- ccsdk-app-common/pom.xml | 13 +- .../dashboard/controller/CloudifyController.java | 201 ---- .../dashboard/controller/CommonApiController.java | 2 +- ccsdk-app-os/Dockerfile | 45 +- ccsdk-app-os/create_table.sql | 113 +- ccsdk-app-os/docker-dashboard-installation.sh | 13 + ccsdk-app-os/pom.xml | 48 +- .../org/onap/portalapp/conf/ExternalAppConfig.java | 2 +- ccsdk-app-os/src/main/resources/swagger.json | 1221 ++++++++++++++++++++ .../main/webapp/WEB-INF/conf/dashboard.properties | 30 +- .../webapp/WEB-INF/conf/system.properties.template | 5 +- .../webapp/WEB-INF/fusion/conf/fusion.properties | 6 +- .../main/webapp/{oom-api.html => api-specs.html} | 1105 ++++++++---------- ccsdk-app-overlay/pom.xml | 4 +- .../webapp/app/ccsdk/home/api-docs-controller.js | 42 + .../src/main/webapp/app/ccsdk/home/api_doc.html | 26 + .../src/main/webapp/app/ccsdk/home/appDS2.js | 25 +- .../webapp/app/ccsdk/home/controller-service.js | 35 + .../webapp/app/ccsdk/home/executions_view.html | 2 +- .../src/main/webapp/app/ccsdk/home/oom-router.js | 42 +- .../src/main/webapp/app/ccsdk/home/oom_spa.html | 47 +- .../main/webapp/app/ccsdk/home/rest-api-spec.html | 27 + .../app/fusion/scripts/DS2-view-models/footer.html | 13 + .../scripts/DS2-view-models/header-logo.html | 3 + .../fusion/scripts/DS2-view-models/welcome.html | 2 +- pom.xml | 2 +- 26 files changed, 2056 insertions(+), 1018 deletions(-) create mode 100644 ccsdk-app-os/src/main/resources/swagger.json rename ccsdk-app-os/src/main/webapp/{oom-api.html => api-specs.html} (94%) create mode 100644 ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api-docs-controller.js create mode 100644 ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api_doc.html create mode 100644 ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/rest-api-spec.html create mode 100644 ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/footer.html create mode 100644 ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html diff --git a/ccsdk-app-common/pom.xml b/ccsdk-app-common/pom.xml index 112f3ac..48a6521 100644 --- a/ccsdk-app-common/pom.xml +++ b/ccsdk-app-common/pom.xml @@ -6,12 +6,12 @@ org.onap.ccsdk.dashboard ccsdk-app-parent - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT org.onap.ccsdk.dashboard ccsdk-app-common - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT jar ONAP Operations Manager Dashboard common CCSDK Dashboard common Java code @@ -22,7 +22,7 @@ 4.3.22.RELEASE 4.3.11.Final 1.0.0 - 2.5.0 + 2.6.0 https://nexus.onap.org content/repositories/snapshots/ content/repositories/releases/ @@ -285,13 +285,6 @@ - org.springframework spring-tx diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CloudifyController.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CloudifyController.java index 16949cd..93748f3 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CloudifyController.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CloudifyController.java @@ -211,35 +211,6 @@ public class CloudifyController extends DashboardRestrictedBaseController { return outboundJson; } - /** - * Serves one page of blueprints - * - * @param request HttpServletRequest - * @return List of CloudifyBlueprint objects - */ - /* - * @RequestMapping(value = { BLUEPRINTS_PATH }, method = RequestMethod.GET, - * produces = "application/json") - * - * @ResponseBody public String getBlueprintsByPage(HttpServletRequest request) { - * preLogAudit(request); String json = getItemListForPageWrapper(request, - * CloudifyDataItem.BLUEPRINT); postLogAudit(request); return json; } - */ - /** - * Serves one page of deployments - * - * @param request HttpServletRequest - * @return List of CloudifyDeployment objects - */ - - /* - * @RequestMapping(value = { DEPLOYMENTS_PATH }, method = RequestMethod.GET, - * produces = "application/json") - * - * @ResponseBody public String getDeploymentsByPage(HttpServletRequest request) - * { preLogAudit(request); String json = getItemListForPageWrapper(request, - * CloudifyDataItem.DEPLOYMENT); postLogAudit(request); return json; } - */ /** * gets the tenants list * @@ -297,106 +268,6 @@ public class CloudifyController extends DashboardRestrictedBaseController { return objectMapper.writeValueAsString(result); } - /** - * Gets the specified blueprint content for viewing. - * - * @param id Blueprint ID - * @param request HttpServletRequest - * @return Blueprint as YAML; or error. - * @throws Exception on serialization error - * - */ - /* - * @RequestMapping(value = { VIEW_BLUEPRINTS_PATH + "/{id}" }, method = - * RequestMethod.GET, produces = "application/yaml") - * - * @ResponseBody public String viewBlueprintContentById(@PathVariable("id") - * String id, HttpServletRequest request) throws Exception { - * preLogAudit(request); ECTransportModel result = null; try { result = - * cloudifyClient.viewBlueprint(id); } catch (HttpStatusCodeException e) { - * MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", "ERROR"); - * MDC.put("ErrorDescription", "Viewing blueprint " + id + " failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "viewBlueprintContentById caught exception"); result = new - * RestResponseError(e.getResponseBodyAsString()); } catch (Throwable t) { - * MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", "ERROR"); - * MDC.put("ErrorDescription", "Viewing blueprint " + id + " failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "viewBlueprintContentById caught exception"); result = new - * RestResponseError("getBlueprintContentById failed", t); } finally { - * postLogAudit(request); } return objectMapper.writeValueAsString(result); } - */ - /** - * Processes request to upload a blueprint from a remote server. - * - * @param request HttpServletRequest - * @param blueprint Cloudify blueprint - * @return Blueprint as uploaded; or error. - * @throws Exception on serialization error - */ - /* - * @RequestMapping(value = { BLUEPRINTS_PATH }, method = RequestMethod.POST, - * produces = "application/json") - * - * @ResponseBody public String uploadBlueprint(HttpServletRequest - * request, @RequestBody CloudifyBlueprintUpload blueprint) throws Exception { - * preLogAudit(request); ECTransportModel result = null; try { result = - * cloudifyClient.uploadBlueprint(blueprint); } catch (HttpStatusCodeException - * e) { MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", "ERROR"); - * MDC.put("ErrorDescription", "Uploading blueprint failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "uploadBlueprint caught exception"); result = new - * RestResponseError(e.getResponseBodyAsString()); } catch (Throwable t) { - * MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", "ERROR"); - * MDC.put("ErrorDescription", "Uploading blueprint failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "uploadBlueprint caught exception"); result = new - * RestResponseError("uploadBlueprint failed", t); } finally { - * postLogAudit(request); } return objectMapper.writeValueAsString(result); } - */ - /** - * Deletes the specified blueprint. - * - * @param id Blueprint ID - * @param request HttpServletRequest - * @param response HttpServletResponse - * @return No content on success; error on failure. - * @throws Exception On serialization failure - */ - - /* - * @RequestMapping(value = { BLUEPRINTS_PATH + "/{id}" }, method = - * RequestMethod.DELETE, produces = "application/json") - * - * @ResponseBody public String deleteBlueprint(@PathVariable("id") String id, - * HttpServletRequest request, HttpServletResponse response) throws Exception { - * preLogAudit(request); ECTransportModel result = null; try { int code = - * cloudifyClient.deleteBlueprint(id); response.setStatus(code); } catch - * (HttpStatusCodeException e) { MDC.put(SystemProperties.STATUS_CODE, "ERROR"); - * MDC.put("TargetEntity", "Cloudify Manager"); MDC.put("TargetServiceName", - * "Cloudify Manager"); MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", - * "ERROR"); MDC.put("ErrorDescription", "Deleting blueprint " + id + - * " failed!"); logger.error(EELFLoggerDelegate.errorLogger, - * "deleteBlueprint caught exception"); result = new - * RestResponseError(e.getResponseBodyAsString()); } catch (Throwable t) { - * MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", "ERROR"); - * MDC.put("ErrorDescription", "Deleting blueprint " + id + " failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "deleteBlueprint caught exception"); result = new - * RestResponseError("deleteBlueprint failed on ID " + id, t); } finally { - * postLogAudit(request); } if (result == null) return null; else return - * objectMapper.writeValueAsString(result); } - */ /** * Gets the specified deployment. * @@ -553,78 +424,6 @@ public class CloudifyController extends DashboardRestrictedBaseController { return outboundJson; } - /** - * Processes request to create a deployment based on a blueprint. - * - * @param request HttpServletRequest - * @param deployment Deployment to upload - * @return Body of deployment; error on failure - * @throws Exception On serialization failure - */ - /* - * @RequestMapping(value = { DEPLOYMENTS_PATH }, method = RequestMethod.POST, - * produces = "application/json") - * - * @ResponseBody public String createDeployment(HttpServletRequest - * request, @RequestBody CloudifyDeploymentRequest deployment) throws Exception - * { preLogAudit(request); ECTransportModel result = null; try { result = - * cloudifyClient.createDeployment(deployment); } catch (HttpStatusCodeException - * e) { MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", "ERROR"); - * MDC.put("ErrorDescription", "Creating deployment failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "createDeployment caught exception"); result = new - * RestResponseError(e.getResponseBodyAsString()); } catch (Throwable t) { - * MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", "ERROR"); - * MDC.put("ErrorDescription", "Creating deployment failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "createDeployment caught exception"); result = new - * RestResponseError("createDeployment failed", t); } finally { - * postLogAudit(request); } return objectMapper.writeValueAsString(result); } - */ - /** - * Deletes the specified deployment. - * - * @param id Deployment ID - * @param ignoreLiveNodes Boolean indicator whether to force a delete in case of - * live nodes - * @param request HttpServletRequest - * @param response HttpServletResponse - * @return Passes thru HTTP status code from remote endpoint; no body on success - * @throws Exception on serialization failure - */ - - /* - * @RequestMapping(value = { DEPLOYMENTS_PATH + "/{id}" }, method = - * RequestMethod.DELETE, produces = "application/json") - * - * @ResponseBody public String deleteDeployment(@PathVariable("id") String id, - * - * @RequestParam(value = "ignore_live_nodes", required = false) Boolean - * ignoreLiveNodes, HttpServletRequest request, HttpServletResponse response) - * throws Exception { preLogAudit(request); ECTransportModel result = null; try - * { int code = cloudifyClient.deleteDeployment(id, ignoreLiveNodes == null ? - * false : ignoreLiveNodes); response.setStatus(code); } catch - * (HttpStatusCodeException e) { MDC.put(SystemProperties.STATUS_CODE, "ERROR"); - * MDC.put("TargetEntity", "Cloudify Manager"); MDC.put("TargetServiceName", - * "Cloudify Manager"); MDC.put("ErrorCode", "300"); MDC.put("ErrorCategory", - * "ERROR"); MDC.put("ErrorDescription", "Deleting deployment " + id + - * " failed!"); logger.error(EELFLoggerDelegate.errorLogger, - * "deleteDeployment caught exception"); result = new - * RestResponseError(e.getResponseBodyAsString()); } catch (Throwable t) { - * MDC.put(SystemProperties.STATUS_CODE, "ERROR"); MDC.put("TargetEntity", - * "Cloudify Manager"); MDC.put("TargetServiceName", "Cloudify Manager"); - * MDC.put("ErrorCategory", "ERROR"); MDC.put("ErrorDescription", - * "Deleting deployment " + id + " failed!"); - * logger.error(EELFLoggerDelegate.errorLogger, - * "deleteDeployment caught exception"); result = new - * RestResponseError("deleteDeployment failed on ID " + id, t); } finally { - * postLogAudit(request); } if (result == null) return null; else return - * objectMapper.writeValueAsString(result); } - */ /** * Gets and serves one page of executions: *
    diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CommonApiController.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CommonApiController.java index c63f263..bd53145 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CommonApiController.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/CommonApiController.java @@ -96,7 +96,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.core.type.TypeReference; @RestController -@RequestMapping("/api-if") +@RequestMapping("/nb-api") public class CommonApiController extends DashboardRestrictedBaseController { private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CommonApiController.class); diff --git a/ccsdk-app-os/Dockerfile b/ccsdk-app-os/Dockerfile index 81f3cb3..1e66e38 100644 --- a/ccsdk-app-os/Dockerfile +++ b/ccsdk-app-os/Dockerfile @@ -1,38 +1,33 @@ -# Use an official Tomcat image -FROM tomcat:8 +# Use an official Tomcat base image +FROM tomcat:8.5-alpine ENV APPDIR /usr/local/tomcat -WORKDIR ${APPDIR} - -# Create deployments directory -RUN mkdir /home/deployments - -# update apt-get -RUN apt-get update - -# Install zip -RUN apt-get -y --allow-unauthenticated install zip +ENV APPUSER dash -# Install vim -RUN apt-get -y --allow-unauthenticated install vim +RUN adduser -u 1000 -D ${APPUSER} -# Install dos2unix -RUN apt-get install dos2unix -f --allow-unauthenticated - -# Install postgresql -RUN apt-get -y install postgresql --allow-unauthenticated +WORKDIR ${APPDIR} -# Download required scripts COPY docker-dashboard-installation.sh /tmp/docker-dashboard-installation.sh COPY create_table.sql /tmp/create_table.sql + +RUN mkdir /home/deployments \ + && chown -R 1000:1000 ${APPDIR} \ + && chown -R 1000:1000 /home/deployments \ + && apk update \ + && apk add zip \ + && apk add vim \ + && apk add dos2unix \ + && apk add postgresql \ + && dos2unix /tmp/create_table.sql \ + && dos2unix /tmp/docker-dashboard-installation.sh \ + && chmod +x /tmp/create_table.sql \ + && chmod +x /tmp/docker-dashboard-installation.sh + ARG WAR_FILE COPY target/${WAR_FILE} /home/deployments/ccsdk-app.war -# Run docker-dashboard-installation.sh -RUN dos2unix /tmp/create_table.sql -RUN dos2unix /tmp/docker-dashboard-installation.sh -RUN chmod +x /tmp/create_table.sql -RUN chmod +x /tmp/docker-dashboard-installation.sh +USER ${APPUSER} CMD ["/tmp/docker-dashboard-installation.sh"] diff --git a/ccsdk-app-os/create_table.sql b/ccsdk-app-os/create_table.sql index 60b7414..e7a7f67 100644 --- a/ccsdk-app-os/create_table.sql +++ b/ccsdk-app-os/create_table.sql @@ -1,3 +1,19 @@ +-- ================================================================================ +-- Copyright (c) 2019-2020 AT&T Intellectual Property. All rights reserved. +-- ================================================================================ +-- 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. +-- See the License for the specific language governing permissions and +-- limitations under the License. +-- ============LICENSE_END========================================================= + CREATE SCHEMA IF NOT EXISTS dashboard_pg_db_common AUTHORIZATION dashboard_pg_admin; CREATE TABLE IF NOT EXISTS dashboard_pg_db_common.service( @@ -1001,8 +1017,6 @@ Insert into dashboard_pg_db_common.fn_role_function (ROLE_ID,FUNCTION_CD) values -- fn_user -- This row defines a superuser which is accepted by login_extern.htm --- The superuser entry is disabled in this checked-in version, ACTIVE = N, --- because it is a security hole that should not exist in IST, ETE and PROD. Insert into dashboard_pg_db_common.fn_user (USER_ID,ORG_ID,MANAGER_ID,FIRST_NAME,MIDDLE_NAME,LAST_NAME,PHONE,FAX,CELLULAR,EMAIL,ADDRESS_ID,ALERT_METHOD_CD,HRID,ORG_USER_ID,ORG_CODE,LOGIN_ID,LOGIN_PWD,LAST_LOGIN_DATE,ACTIVE_YN,CREATED_ID,CREATED_DATE,MODIFIED_ID,MODIFIED_DATE,IS_INTERNAL_YN,ADDRESS_LINE_1,ADDRESS_LINE_2,CITY,STATE_CD,ZIP_CODE,COUNTRY_CD,LOCATION_CLLI,ORG_MANAGER_USERID,COMPANY,DEPARTMENT_NAME,JOB_TITLE,TIMEZONE,DEPARTMENT,BUSINESS_UNIT,BUSINESS_UNIT_NAME,COST_CENTER,FIN_LOC_CODE,SILO_STATUS) values @@ -1010,28 +1024,15 @@ Insert into dashboard_pg_db_common.fn_user ; -- fn_app --- Use name "DMAAP-BC-APP" (originally "Default") Insert into dashboard_pg_db_common.fn_app (APP_ID,APP_NAME,APP_IMAGE_URL,APP_DESCRIPTION,APP_NOTES,APP_URL,APP_ALTERNATE_URL,APP_REST_ENDPOINT,ML_APP_NAME,ML_APP_ADMIN_ID,MOTS_ID,APP_PASSWORD,OPEN,ENABLED,THUMBNAIL,APP_USERNAME,UEB_KEY,UEB_SECRET,UEB_TOPIC_NAME) VALUES (1,'EC-DASH-APP','assets/images/tmp/portal1.png','Some Default Description','Some Default Note','http://www.att.com','http://www.att.com',null,'ECPP','?','1','JuCerIRKt/faEcx8QdgncLEEv+IOZjpHe7Pi5DEPqKs=','N','Y',null,'Default',null,null,'ECOMP-PORTAL-INBOX'); -- fn_user_role Insert into dashboard_pg_db_common.fn_user_role (USER_ID,ROLE_ID,PRIORITY,APP_ID) values (1,1,null,1); --- --------------------------------------------------------------------------------------------------------------- --- This script populates tables for the ECOMP Controller Dashboard web app. --- in the 1707 release with data for the internal AT&T version. --- --------------------------------------------------------------------------------------------------------------- - ---- SET SEARCH_PATH = ecd_att_1707; - --- fn_menu -INSERT INTO dashboard_pg_db_common.fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) - VALUES (92, 'Import from WEBPHONE', 9, 30, 'ecd#/post_search', 'menu_profile_import', 'Y', NULL, NULL, NULL, NULL, 'APP', 'N', NULL); - - ALTER ROLE dashboard_pg_admin SET search_path TO dashboard_pg_db_common; -- --------------------------------------------------------------------------------------------------------------- --- This script creates and populates component table for the ECOMP Controller Dashboard web app. +-- This script creates and populates component table -- --------------------------------------------------------------------------------------------------------------- CREATE SEQUENCE IF NOT EXISTS dashboard_pg_db_common.seq_ecd_component; @@ -1137,67 +1138,19 @@ update dashboard_pg_db_common.fn_function set type = 'menu' , action = '*' wher update dashboard_pg_db_common.fn_function set type = 'menu' , action = '*' where function_cd = 'menu_logout'; update dashboard_pg_db_common.fn_function set type = 'menu' , action = '*' where function_cd = 'login'; --- 1902 feature set changes - --- Insert rows into fn_function table - -INSERT INTO dashboard_pg_db_common.fn_function(function_cd, function_name, type, action) VALUES ('menu_ops', 'OPS Tools', '*', '*'); -INSERT INTO dashboard_pg_db_common.fn_function(function_cd, function_name, type, action) VALUES ('menu_cnsl', 'Consul', '*', '*'); -INSERT INTO dashboard_pg_db_common.fn_function(function_cd, function_name, type, action) VALUES ('menu_cfy', 'Cloudify Manager', '*', '*'); -INSERT INTO dashboard_pg_db_common.fn_function(function_cd, function_name, type, action) VALUES ('menu_grf', 'Grafana', '*', '*'); -INSERT INTO dashboard_pg_db_common.fn_function(function_cd, function_name, type, action) VALUES ('menu_prometh', 'Prometheus', '*', '*'); -INSERT INTO dashboard_pg_db_common.fn_function(function_cd, function_name, type, action) VALUES ('menu_k8s', 'Kubernetes Dashboard', '*', '*'); -INSERT INTO dashboard_pg_db_common.fn_function(function_cd, function_name, type, action) VALUES ('menu_dbcl', 'DBCL Dashboard', '*', '*'); - --- Insert rows into fn_menu table - -INSERT INTO dashboard_pg_db_common.fn_menu( - menu_id, label, parent_id, sort_order, action, function_cd, active_yn, servlet, query_string, external_url, target, menu_set_cd, separator_yn, image_src) - VALUES (6, 'OPS Tools', 1, 60, '#', 'menu_ops', 'Y', 'NULL', 'NULL', 'NULL', 'NULL', 'APP', 'N', 'icon-building-factory'); -INSERT INTO dashboard_pg_db_common.fn_menu( - menu_id, label, parent_id, sort_order, action, function_cd, active_yn, servlet, query_string, external_url, target, menu_set_cd, separator_yn, image_src) - VALUES (7, 'DMaaP Bus Controller', 1, 70, '#', 'menu_dbcl', 'Y', 'NULL', 'NULL', 'NULL', 'NULL', 'APP', 'N', 'icon-building-factory'); -INSERT INTO dashboard_pg_db_common.fn_menu( - menu_id, label, parent_id, sort_order, action, function_cd, active_yn, servlet, query_string, external_url, target, menu_set_cd, separator_yn, image_src) - VALUES (61, 'Cloudify Manager', 6, 10, 'ecd#/cfy', 'menu_cfy', 'Y', 'NULL', 'NULL', 'NULL', 'NULL', 'APP', 'N', 'NULL'); -INSERT INTO dashboard_pg_db_common.fn_menu( - menu_id, label, parent_id, sort_order, action, function_cd, active_yn, servlet, query_string, external_url, target, menu_set_cd, separator_yn, image_src) - VALUES (62, 'Consul', 6, 20, 'ecd#/cnsl', 'menu_cnsl', 'Y', 'NULL', 'NULL', 'NULL', 'NULL', 'APP', 'N', 'NULL'); -INSERT INTO dashboard_pg_db_common.fn_menu( - menu_id, label, parent_id, sort_order, action, function_cd, active_yn, servlet, query_string, external_url, target, menu_set_cd, separator_yn, image_src) - VALUES (63, 'Kubernetes Dashboard', 6, 30, 'ecd#/k8s', 'menu_k8s', 'Y', 'NULL', 'NULL', 'NULL', 'NULL', 'APP', 'N', 'NULL'); -INSERT INTO dashboard_pg_db_common.fn_menu( - menu_id, label, parent_id, sort_order, action, function_cd, active_yn, servlet, query_string, external_url, target, menu_set_cd, separator_yn, image_src) - VALUES (64, 'Grafana', 6, 40, 'ecd#/grf', 'menu_grf', 'Y', 'NULL', 'NULL', 'NULL', 'NULL', 'APP', 'N', 'NULL'); -INSERT INTO dashboard_pg_db_common.fn_menu( - menu_id, label, parent_id, sort_order, action, function_cd, active_yn, servlet, query_string, external_url, target, menu_set_cd, separator_yn, image_src) - VALUES (65, 'Prometheus', 6, 50, 'ecd#/prom', 'menu_prometh', 'Y', 'NULL', 'NULL', 'NULL', 'NULL', 'APP', 'N', 'NULL'); - - --- Insert rows into fn_role_function - -INSERT INTO dashboard_pg_db_common.fn_role_function( - role_id, function_cd) - VALUES (1, 'menu_ops'); -INSERT INTO dashboard_pg_db_common.fn_role_function( - role_id, function_cd) - VALUES (1, 'menu_dbcl'); -INSERT INTO dashboard_pg_db_common.fn_role_function( - role_id, function_cd) - VALUES (1, 'menu_cfy'); -INSERT INTO dashboard_pg_db_common.fn_role_function( - role_id, function_cd) - VALUES (1, 'menu_cnsl'); -INSERT INTO dashboard_pg_db_common.fn_role_function( - role_id, function_cd) - VALUES (1,'menu_k8s'); -INSERT INTO dashboard_pg_db_common.fn_role_function( - role_id, function_cd) - VALUES (1, 'menu_grf'); -INSERT INTO dashboard_pg_db_common.fn_role_function( - role_id, function_cd) - VALUES (1, 'menu_prometh'); - --- Update action for DBCL menu - -update fn_menu set action='ecd#/dbcl' where function_cd='menu_dbcl'; \ No newline at end of file +-- REST API docs +Insert into ecompc_db_common.fn_function (FUNCTION_CD,FUNCTION_NAME,TYPE,ACTION) values ('menu_api','API Menu','menu','*'); + +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) + VALUES (20,'REST API', 1, 35,'#', 'menu_api', 'Y','N/A','N/A','N/A','N/A','APP','N','icon-arrows-upload'); + +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) + VALUES (21,'Documentation', 20, 35,'ecd#/api', 'menu_api', 'Y','N/A','N/A','N/A','N/A','APP','N',''); + +INSERT INTO fn_menu (MENU_ID, LABEL, PARENT_ID, SORT_ORDER, ACTION, FUNCTION_CD, ACTIVE_YN, SERVLET, QUERY_STRING, EXTERNAL_URL, TARGET, MENU_SET_CD, SEPARATOR_YN, IMAGE_SRC) + VALUES (22,'Swagger Spec', 20, 40,'ecd#/api-spec', 'menu_api', 'Y','N/A','N/A','N/A','N/A','APP','N',''); + +Insert into dashboard_pg_db_common.fn_role_function (ROLE_ID,FUNCTION_CD) values (1,'menu_api'); +Insert into dashboard_pg_db_common.fn_role_function (ROLE_ID,FUNCTION_CD) values (2,'menu_api'); +Insert into dashboard_pg_db_common.fn_role_function (ROLE_ID,FUNCTION_CD) values (3,'menu_api'); +Insert into dashboard_pg_db_common.fn_role_function (ROLE_ID,FUNCTION_CD) values (16,'menu_api'); \ No newline at end of file diff --git a/ccsdk-app-os/docker-dashboard-installation.sh b/ccsdk-app-os/docker-dashboard-installation.sh index d658490..030e75a 100644 --- a/ccsdk-app-os/docker-dashboard-installation.sh +++ b/ccsdk-app-os/docker-dashboard-installation.sh @@ -47,5 +47,18 @@ export PGPASSWORD=$postgres_password_dashboard psql -h $postgres_ip -U $postgres_user_dashboard $postgres_db_name -f /tmp/create_table.sql psql -h $postgres_ip -U $postgres_user_dashboard $postgres_db_name -c "update FN_APP set app_username='${aaf_app_user}' where app_id=1" +# Update tomcat server.xml to enable HTTPS protocol +if [[ -f /usr/local/share/ca-certificates/cert.jks && $CATALINA_HOME/conf/server.xml ]] +then + echo "" >> enablehttps.txt + sed '/Service name=\"Catalina\">/r enablehttps.txt' $CATALINA_HOME/conf/server.xml > $CATALINA_HOME/conf/server-https.xml + mv $CATALINA_HOME/conf/server-https.xml $CATALINA_HOME/conf/server.xml +fi + # Start the tomcat server catalina.sh run diff --git a/ccsdk-app-os/pom.xml b/ccsdk-app-os/pom.xml index f4c24fa..f0764d4 100644 --- a/ccsdk-app-os/pom.xml +++ b/ccsdk-app-os/pom.xml @@ -6,12 +6,12 @@ org.onap.ccsdk.dashboard ccsdk-app-parent - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT org.onap.ccsdk.dashboard ccsdk-app-os - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT war ONAP Operations Manager Dashboard app CCSDK Dashboard Web Application for external release @@ -20,7 +20,7 @@ UTF-8 4.3.22.RELEASE 4.3.11.Final - 2.5.0 + 2.6.0 ${project.version} https://nexus.onap.org content/repositories/snapshots/ @@ -251,6 +251,48 @@ jest + + + + org.springframework + spring-context + ${springframework.version} + + + org.springframework + spring-context-support + ${springframework.version} + + + org.springframework + spring-core + ${springframework.version} + + + commons-logging + commons-logging + + + + + org.springframework + spring-aop + ${springframework.version} + + + org.springframework + spring-tx + ${springframework.version} + + + org.springframework + spring-web + ${springframework.version} + + + org.springframework + spring-webmvc + ${springframework.version} diff --git a/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java b/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java index 2f328eb..807ae78 100644 --- a/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java +++ b/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppConfig.java @@ -142,7 +142,7 @@ public class ExternalAppConfig extends AppConfig implements Configurable { public void addInterceptors(InterceptorRegistry registry) { super.setExcludeUrlPathsForSessionTimeout("/login_external", "*/login_external.htm", "login", "/login.htm", "/api*", "/single_signon.htm", "/single_signon", "/health*", - "/ecomp-api/**"); + "/nb-api/**"); super.addInterceptors(registry); } diff --git a/ccsdk-app-os/src/main/resources/swagger.json b/ccsdk-app-os/src/main/resources/swagger.json new file mode 100644 index 0000000..de1bf0b --- /dev/null +++ b/ccsdk-app-os/src/main/resources/swagger.json @@ -0,0 +1,1221 @@ +{ + "swagger": "2.0", + "info": { + "description": "API to manage deployment of microservices using blueprints.", + "version": "1.0.0", + "title": "DCAE Dashboard API", + "contact": { + "email": "rp5662@att.com" + } + }, + "host": "dcae-dashboard:8080", + "basePath": "/ccsdk-app-os/nb-api", + "tags": [ + { + "name": "Blueprints", + "description": "Query blueprint information" + }, + { + "name": "Deployments", + "description": "Manage deployments" + }, + { + "name": "Tenants", + "description": "Query Cloudify Tenants" + }, + { + "name": "Components", + "description": "Query on-boarded components" + } + ], + "schemes": [ + "https", + "http" + ], + "paths": { + "/tenants": { + "get": { + "tags": [ + "Tenants" + ], + "summary": "Lists all Cloudify Tenants", + "description": "Query all Tenant names from Cloudify", + "operationId": "List Tenants", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Tenant" + } + } + }, + "400": { + "description": "Invalid status value" + } + } + } + }, + "/components": { + "get": { + "tags": [ + "Components" + ], + "summary": "Lists all application components", + "description": "Query all components from database", + "operationId": "List Components", + "produces": [ + "application/json" + ], + "parameters": [], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/Component" + } + } + }, + "400": { + "description": "Invalid status value" + } + } + }, + "post": { + "tags": [ + "Components" + ], + "summary": "add an application component", + "description": "Insert a component into database", + "operationId": "Add Component", + "consumes": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "New component input", + "required": true, + "schema": { + "$ref": "#/definitions/ComponentInput" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object" + } + }, + "400": { + "description": "Invalid status value" + } + } + } + }, + "/deployments": { + "get": { + "tags": [ + "Deployments" + ], + "summary": "Lists all Deployments", + "description": "Query all deployments or Service objects from Inventory", + "operationId": "List Deployments", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "pageNum", + "in": "query", + "description": "pagination control - page number", + "required": true, + "type": "string" + }, + { + "name": "viewPerPage", + "in": "query", + "description": "pagination control - page size", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DCAEService" + } + } + }, + "400": { + "description": "Invalid status value" + } + } + }, + "post": { + "tags": [ + "Deployments" + ], + "summary": "Initiate a deployment (install) operation for an application or service", + "description": "Controller sends the blueprint and required inputs to Deployment Handler microservice to initiate the deployment process", + "operationId": "Create Deployment", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "Inputs to initiate a deployment: blueprint ID from inventory, Cloudify tenant name, blueprint inputs", + "required": true, + "schema": { + "$ref": "#/definitions/DeploymentInput" + } + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/DeploymentResource" + } + }, + "405": { + "description": "Invalid input" + } + } + } + }, + "/deployments/{deploymentId}": { + "delete": { + "tags": [ + "Deployments" + ], + "summary": "Initiate an uninstall operation for an application or service", + "description": "Controller sends the deployment reference to Deployment Handler microservice to initiate the uninstall process", + "operationId": "Delete Deployment", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "description": "ID of deployment to query", + "required": true, + "type": "string" + }, + { + "name": "tenant", + "in": "query", + "description": "Cloudify Tenant name", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "string" + } + }, + "400": { + "description": "Invalid status value" + } + } + }, + "put": { + "tags": [ + "Deployments" + ], + "summary": "Upgrade or Rollback an existing deployment using Cloudify Helm plugin", + "description": "Upgrade or Rollback an existing deployment using Cloudify Helm plugin", + "operationId": "Upgrade/Rollback Deployment", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "description": "ID of deployment in context", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Cloudify Execution Request object that has parameters to start either an upgrade or a rollback execution workflow", + "required": true, + "schema": { + "$ref": "#/definitions/CloudifyDeploymentUpgradeRequest" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Deployment not found" + }, + "405": { + "description": "Validation exception" + } + } + }, + "get": { + "tags": [ + "Deployments" + ], + "summary": "Gets a Deployment", + "description": "Query a deployment or Service object from Inventory", + "operationId": "Get Deployment", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "description": "ID of deployment to query", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/DCAEService" + } + } + }, + "400": { + "description": "Invalid status value" + } + } + } + }, + "/deployments/{deploymentId}/update": { + "put": { + "tags": [ + "Deployments" + ], + "summary": "Update an existing deployment", + "description": "Dispatch a request to Deployment handler mS to use Cloudify deployment update operation ", + "operationId": "Update Deployment", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "description": "ID of deployment to update", + "required": true, + "type": "string" + }, + { + "in": "body", + "name": "body", + "description": "Inputs to initiate a deployment: blueprint ID from inventory, Cloudify tenant name, blueprint inputs", + "required": true, + "schema": { + "$ref": "#/definitions/DeploymentInput" + } + } + ], + "responses": { + "400": { + "description": "Invalid ID supplied" + }, + "404": { + "description": "Deployment not found" + }, + "405": { + "description": "Validation exception" + } + } + } + }, + "/deployments/{deploymentId}/executions": { + "get": { + "tags": [ + "Deployments" + ], + "summary": "Deployment execution status", + "description": "Query deployment workflow execution status", + "operationId": "Deployment Status", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "description": "ID of deployment to query execution status", + "required": true, + "type": "string" + }, + { + "name": "tenant", + "in": "query", + "description": "tenant name associated with the deployment", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/execution" + } + } + }, + "400": { + "description": "Invalid status value" + } + } + } + }, + "/deployments/{deploymentId}/health": { + "get": { + "tags": [ + "Deployments" + ], + "summary": "Deployment health status", + "description": "Query consul for service health using deployment ID filter", + "operationId": "Deployment health", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "description": "ID of deployment to query service health", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "$ref": "#/definitions/serviceHealth" + } + } + } + } + }, + "/deployments/{deploymentId}/inputs": { + "get": { + "tags": [ + "Deployments" + ], + "summary": "Deployment inputs", + "description": "Get blueprint inputs used to create deployment", + "operationId": "Deployment Inputs", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "deploymentId", + "in": "path", + "description": "ID of deployment to query execution status", + "required": true, + "type": "string" + }, + { + "name": "tenant", + "in": "query", + "description": "tenant name associated with the deployment", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation", + "schema": { + "type": "object", + "items": { + "$ref": "#/definitions/deploymentInputs" + } + } + }, + "400": { + "description": "Invalid status value" + } + } + } + }, + "/blueprints": { + "get": { + "tags": [ + "Blueprints" + ], + "summary": "Find all blueprint templates", + "description": "Fetch the blueprints data from inventory", + "operationId": "List Blueprints", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "pageNum", + "in": "query", + "description": "pagination control - page number", + "required": true, + "type": "string" + }, + { + "name": "viewPerPage", + "in": "query", + "description": "pagination control - page size", + "required": true, + "type": "string" + }, + { + "name": "_include", + "in": "query", + "description": "blueprint object properties need to be considered for filter", + "required": false, + "type": "array", + "items": { + "type": "string", + "enum": [ + "typeName", + "typeId", + "typeVersion" + ], + "default": "typeName" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "List of `DCAEServiceType` objects", + "schema": { + "$ref": "#/definitions/InlineResponse200" + } + }, + "400": { + "description": "Invalid tag value" + } + } + }, + "post": { + "tags": [ + "Blueprints" + ], + "summary": "Create/Upload a new blueprint template", + "description": "Upload a new blueprint template into inventory", + "operationId": "Create Blueprint", + "produces": [ + "application/json" + ], + "parameters": [ + { + "in": "body", + "name": "body", + "description": "upload blueprint request to inventory", + "required": true, + "schema": { + "$ref": "#/definitions/DCAEServiceTypeRequest" + } + } + ], + "responses": { + "200": { + "description": "A `DCAEServiceType` object", + "schema": { + "$ref": "#/definitions/InlineResponse200" + } + }, + "400": { + "description": "Invalid tag value" + } + } + } + }, + "/blueprints/{typeId}": { + "delete": { + "tags": [ + "Blueprints" + ], + "summary": "Delete a blueprint template", + "description": "Delete a blueprint template from inventory", + "operationId": "Delete Blueprint", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "typeId", + "in": "path", + "description": "ID of blueprint to delete", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/blueprints/{typeId}/services": { + "get": { + "tags": [ + "Blueprints" + ], + "summary": "Get Services mapped to a blueprint template", + "description": "Get Deployment References existing for a blueprint", + "operationId": "Get Deployments for a blueprint", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "typeId", + "in": "path", + "description": "ID of blueprint to query", + "required": true, + "type": "string" + } + ], + "responses": { + "200": { + "description": "successful operation" + } + } + } + }, + "/blueprints/findByName": { + "get": { + "tags": [ + "Blueprints" + ], + "summary": "Find a blueprint by a name pattern", + "description": "Fetch the blueprint objects from inventory whose names match a string pattern", + "operationId": "Get Blueprint", + "produces": [ + "application/json" + ], + "parameters": [ + { + "name": "name", + "in": "query", + "description": "name pattern to filter by", + "required": true, + "type": "string" + }, + { + "name": "_include", + "in": "query", + "description": "blueprint object properties need to be considered for filter", + "required": false, + "type": "array", + "items": { + "type": "string", + "enum": [ + "typeName", + "typeId", + "typeVersion" + ], + "default": "typeName" + }, + "collectionFormat": "multi" + } + ], + "responses": { + "200": { + "description": "List of `DCAEServiceType` objects", + "schema": { + "$ref": "#/definitions/InlineResponse200" + } + }, + "400": { + "description": "Invalid tag value" + } + } + } + } + }, + "responses": { + "UnauthorizedError": { + "description": "Authentication information is missing or invalid", + "headers": { + "WWW_Authenticate": { + "type": "string" + } + } + } + }, + "definitions": { + "Tenant": { + "type": "object", + "properties": { + "name": { + "type": "string", + "description": "cloudify tenant name" + } + } + }, + "Component": { + "type": "object", + "properties": { + "compId": { + "type": "integer" + }, + "cname": { + "type": "string", + "description": "component namespace name" + }, + "dname": { + "type": "string", + "description": "component display name" + } + } + }, + "ComponentInput": { + "type": "object", + "properties": { + "cname": { + "type": "string", + "description": "component namespace name" + }, + "dname": { + "type": "string", + "description": "component display name" + } + } + }, + "InlineResponse200": { + "type": "object", + "properties": { + "links": { + "$ref": "#/definitions/InlineResponse200Links" + }, + "totalCount": { + "type": "integer", + "format": "int32" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/DCAEServiceType" + } + } + } + }, + "InlineResponse200Links": { + "type": "object", + "properties": { + "previousLink": { + "$ref": "#/definitions/Link" + }, + "nextLink": { + "$ref": "#/definitions/Link" + } + }, + "description": "Pagination links" + }, + "ApiResponseMessage": { + "type": "object", + "properties": { + "code": { + "type": "integer", + "format": "int32" + }, + "type": { + "type": "string" + }, + "message": { + "type": "string" + } + } + }, + "DCAEService": { + "type": "object", + "properties": { + "serviceId": { + "type": "string" + }, + "selfLink": { + "description": "Link.title is serviceId", + "$ref": "#/definitions/Link" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "modified": { + "type": "string", + "format": "date-time" + }, + "typeLink": { + "description": "Link.title is typeId", + "$ref": "#/definitions/Link" + }, + "vnfId": { + "type": "string" + }, + "vnfLink": { + "description": "Link.title is vnfId", + "$ref": "#/definitions/Link" + }, + "vnfType": { + "type": "string" + }, + "vnfLocation": { + "type": "string", + "description": "Location information of the associated VNF" + }, + "deploymentRef": { + "type": "string", + "description": "Reference to a Cloudify deployment" + }, + "components": { + "type": "array", + "items": { + "$ref": "#/definitions/DCAEServiceComponent" + } + }, + "tenant": { + "type": "string", + "description": "cloudify tenant name" + } + } + }, + "InlineResponse2001": { + "type": "object", + "properties": { + "links": { + "$ref": "#/definitions/InlineResponse200Links" + }, + "totalCount": { + "type": "integer", + "format": "int32" + }, + "items": { + "type": "array", + "items": { + "$ref": "#/definitions/DCAEService" + } + } + } + }, + "UriBuilder": { + "type": "object" + }, + "Link": { + "type": "object", + "properties": { + "title": { + "type": "string" + }, + "rel": { + "type": "string" + }, + "uri": { + "type": "string", + "format": "uri" + }, + "uriBuilder": { + "$ref": "#/definitions/UriBuilder" + }, + "rels": { + "type": "array", + "items": { + "type": "string" + } + }, + "params": { + "type": "object", + "additionalProperties": { + "type": "string" + } + }, + "type": { + "type": "string" + } + } + }, + "DCAEServiceComponent": { + "type": "object", + "required": [ + "componentId", + "componentLink", + "componentSource", + "componentType", + "created", + "modified", + "shareable" + ], + "properties": { + "componentId": { + "type": "string", + "description": "The id format is unique to the source" + }, + "componentLink": { + "description": "Link to the underlying resource of this component", + "$ref": "#/definitions/Link" + }, + "created": { + "type": "string", + "format": "date-time" + }, + "modified": { + "type": "string", + "format": "date-time" + }, + "componentType": { + "type": "string" + }, + "componentSource": { + "type": "string", + "description": "Specifies the name of the underying source service that is responsible for this components", + "enum": [ + "DCAEController", + "DMaaPController" + ] + }, + "status": { + "type": "string" + }, + "location": { + "type": "string", + "description": "Location information of the component" + }, + "shareable": { + "type": "integer", + "format": "int32", + "description": "Used to determine if this component can be shared amongst different DCAE services" + } + } + }, + "DCAEServiceTypeRequest": { + "type": "object", + "required": [ + "blueprintTemplate", + "owner", + "typeName", + "typeVersion", + "application", + "component" + ], + "properties": { + "owner": { + "type": "string" + }, + "typeName": { + "type": "string", + "description": "Descriptive name for this DCAE service type" + }, + "typeVersion": { + "type": "integer", + "format": "int32", + "description": "Version number for this DCAE service type" + }, + "blueprintTemplate": { + "type": "string", + "description": "String representation of a Cloudify blueprint with unbound variables" + }, + "application": { + "type": "string", + "description": "controller application name" + }, + "component": { + "type": "string", + "description": "onboarding component name" + } + } + }, + "DCAEServiceType": { + "type": "object", + "required": [ + "blueprintTemplate", + "created", + "owner", + "selfLink", + "typeId", + "typeName", + "typeVersion" + ], + "properties": { + "owner": { + "type": "string" + }, + "typeName": { + "type": "string", + "description": "Descriptive name for this DCAE service type" + }, + "typeVersion": { + "type": "integer", + "format": "int32", + "description": "Version number for this DCAE service type" + }, + "blueprintTemplate": { + "type": "string", + "description": "String representation of a Cloudify blueprint with unbound variables" + }, + "serviceIds": { + "type": "array", + "description": "List of service ids that are used to associate with DCAE service type. DCAE service types with this propery as null or empty means them apply for every service id.", + "items": { + "type": "string" + } + }, + "vnfTypes": { + "type": "array", + "items": { + "type": "string" + } + }, + "serviceLocations": { + "type": "array", + "description": "List of service locations that are used to associate with DCAE service type. DCAE service types with this propery as null or empty means them apply for every service location.", + "items": { + "type": "string" + } + }, + "asdcServiceId": { + "type": "string", + "description": "Id of service this DCAE service type is associated with. Value source is from ASDC's notification event's field `serviceInvariantUUID`." + }, + "asdcResourceId": { + "type": "string", + "description": "Id of vf/vnf instance this DCAE service type is associated with. Value source is from ASDC's notification event's field `resourceInvariantUUID`." + }, + "asdcServiceURL": { + "type": "string", + "description": "URL to the ASDC service model" + }, + "typeId": { + "type": "string", + "description": "Unique identifier for this DCAE service type" + }, + "selfLink": { + "description": "Link to self where the Link.title is typeName", + "$ref": "#/definitions/Link" + }, + "created": { + "type": "string", + "format": "date-time", + "description": "Created timestamp for this DCAE service type in epoch time" + }, + "deactivated": { + "type": "string", + "format": "date-time", + "description": "Deactivated timestamp for this DCAE service type in epoch time" + } + } + }, + "CloudifyDeploymentUpgradeRequest": { + "type": "object", + "required": [ + "chartVersion", + "chartRepo", + "config_url", + "config_format", + "tenant", + "workflow" + ], + "properties": { + "chartVersion": { + "type": "string", + "description": "Helm package version used for install" + }, + "chartRepo": { + "type": "string", + "description": "Helm repository URL for the chart" + }, + "config_url": { + "type": "string", + "description": "Helm repository URL for the chart values to update" + }, + "config_format": { + "type": "string", + "description": "yaml format or json format" + }, + "tenant": { + "type": "string", + "description": "cloudify tenant name for the deployment upgrade" + }, + "workflow": { + "type": "string", + "description": "input values are upgrade or rollback - helm upgrade workflow or helm rollback workflow " + } + } + }, + "DeploymentInput": { + "type": "object", + "required": [ + "component", + "tag", + "blueprintName", + "tenant", + "inputs" + ], + "properties": { + "component": { + "type": "string", + "description": "component or namespace for the service" + }, + "tag": { + "type": "string", + "description": "tag to identify the deployment" + }, + "blueprintId": { + "type": "string", + "description": "typeId from inventory, a unique Id for the blueprint" + }, + "blueprintName": { + "type": "string", + "description": "Descriptive name for this DCAE service type" + }, + "blueprintVersion": { + "type": "integer", + "format": "int32", + "description": "Version number for this DCAE service type, optional. Defaults to latest version." + }, + "tenant": { + "type": "string", + "description": "cloudify tenant name" + }, + "inputs": { + "type": "object", + "description": "JSON object containing the input parameter names and values" + } + } + }, + "deploymentInputs": { + "type": "object" + }, + "serviceHealth": { + "type": "object", + "properties": { + "node": { + "type": "string", + "description": "The node where service is deployed" + }, + "checkID": { + "type": "string", + "description": "A unique identifier for the service health check" + }, + "name": { + "type": "string", + "description": "A unique name for this service health check" + }, + "status": { + "type": "string", + "description": "Health check status" + }, + "serviceID": { + "type": "string", + "description": "An identifier containing combination of consul registration ID and consul service name" + }, + "serviceName": { + "type": "string", + "description": "A unique consul service name" + } + } + }, + "execution": { + "type": "object", + "properties": { + "created_at": { + "type": "string", + "description": "The time the execution was queued at" + }, + "deployment_id": { + "type": "string", + "description": "The id of the deployment the execution is in the context of" + }, + "id": { + "type": "string", + "description": "A unique identifier for the execution" + }, + "status": { + "type": "string", + "description": "The executions status" + }, + "workflow_id": { + "type": "string", + "description": "The id/name of the workflow the execution is of" + }, + "tenant_name": { + "type": "string", + "description": "Cloudify tenant name where the deployment was done" + } + } + }, + "DeploymentResourceLinks": { + "type": "object", + "properties": { + "self": { + "description": "Link to retrieve information about the service being deployed", + "type": "string" + }, + "outcome": { + "description": "Link to retrieve information about deployment outcome", + "type": "string" + }, + "status": { + "description": "Link to retrieve information about the status of the installation workflow", + "type": "string" + } + } + }, + "DeploymentResource": { + "type": "object", + "properties": { + "deployment_id": { + "type": "string", + "description": "unique ID for the deployment resource" + }, + "links": { + "$ref": "#/definitions/DeploymentResourceLinks", + "description": "Links that the API client can access" + } + } + } + }, + "externalDocs": { + "description": "Find out more about Swagger", + "url": "http://swagger.io" + } +} \ No newline at end of file diff --git a/ccsdk-app-os/src/main/webapp/WEB-INF/conf/dashboard.properties b/ccsdk-app-os/src/main/webapp/WEB-INF/conf/dashboard.properties index 2496647..9e221cd 100644 --- a/ccsdk-app-os/src/main/webapp/WEB-INF/conf/dashboard.properties +++ b/ccsdk-app-os/src/main/webapp/WEB-INF/conf/dashboard.properties @@ -1,4 +1,23 @@ -# ATT dashboard.properties +############################################################################### +# =============LICENSE_START========================================================= +# +# ================================================================================= +# Copyright (c) 2020 AT&T Intellectual Property. All rights reserved. +# ================================================================================ +# 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. +# See the License for the specific language governing permissions and +# limitations under the License. +# ============LICENSE_END========================================================= +# +############################################################################### # Properties for the ONAP Controller Dashboard webapp @@ -14,11 +33,12 @@ controller.env = dev controller.key.list = dev dev.name = Local -dev.url = https://orcl.com/api/v3.1 -dev.inventory.url = https://inventory.com:30123/ -dev.dhandler.url = https://dplh.com:30125/ -dev.consul.url = http://consul.com:8500/ +dev.url = https://dashboard.onap.svc.cluster.local/api/v3.1 +dev.inventory.url = https://inventory.onap.svc.cluster.local:8443/ +dev.dhandler.url = https://dplh.onap.svc.cluster.local:8443/ +dev.consul.url = https://cnsl.onap.svc.cluster.local:9500/ dev.username = admin dev.password = admin dev.is_encrypted = false + diff --git a/ccsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties.template b/ccsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties.template index 4d66dba..940bcf1 100644 --- a/ccsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties.template +++ b/ccsdk-app-os/src/main/webapp/WEB-INF/conf/system.properties.template @@ -2,7 +2,7 @@ # =============LICENSE_START========================================================= # # ================================================================================= -# Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2020 AT&T Intellectual Property. All rights reserved. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,11 +17,10 @@ # limitations under the License. # ============LICENSE_END========================================================= # -# ECOMP is a trademark and service mark of AT&T Intellectual Property. ############################################################################### # OS system.properties -app_display_name = ONAP Operations UI +app_display_name = DCAE Dashboard # Postgres db.driver=org.postgresql.Driver diff --git a/ccsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties b/ccsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties index 01ba9f7..5374b1a 100644 --- a/ccsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties +++ b/ccsdk-app-os/src/main/webapp/WEB-INF/fusion/conf/fusion.properties @@ -2,7 +2,7 @@ # =============LICENSE_START========================================================= # # ================================================================================= -# Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. +# Copyright (c) 2020 AT&T Intellectual Property. All rights reserved. # ================================================================================ # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -17,10 +17,7 @@ # limitations under the License. # ============LICENSE_END========================================================= # -# ECOMP is a trademark and service mark of AT&T Intellectual Property. ############################################################################### -# OS fusion.properties - # login settings #login_method_csp = csp #login_method_web_junction = web_junction @@ -61,3 +58,4 @@ business_direct_menu_attribute_name = businessDirectMenuData # Role settings sys_admin_role_id = 1 + diff --git a/ccsdk-app-os/src/main/webapp/oom-api.html b/ccsdk-app-os/src/main/webapp/api-specs.html similarity index 94% rename from ccsdk-app-os/src/main/webapp/oom-api.html rename to ccsdk-app-os/src/main/webapp/api-specs.html index 5ed224c..b43fbf4 100644 --- a/ccsdk-app-os/src/main/webapp/oom-api.html +++ b/ccsdk-app-os/src/main/webapp/api-specs.html @@ -7,7 +7,7 @@ - Operations Manager API + DCAE Dashboard API @@ -369,6 +369,21 @@ td, th { padding: 0; } +/* +Copyright 2008-2013 Concur Technologies, Inc. + +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. See the +License for the specific language governing permissions and limitations +under the License. +*/ .content h1, .content h2, .content h3, .content h4, .content h5, .content h6, html, body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; } @@ -413,7 +428,21 @@ th { .toc-wrapper > .search:before { content: "\e607"; } +/* +Copyright 2008-2013 Concur Technologies, Inc. +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. See the +License for the specific language governing permissions and limitations +under the License. +*/ html, body { color: #333; padding: 0; @@ -1138,7 +1167,21 @@ td, th { padding: 0; } +/* +Copyright 2008-2013 Concur Technologies, Inc. +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. See the +License for the specific language governing permissions and limitations +under the License. +*/ .content h1, .content h2, .content h3, .content h4, body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 14px; } @@ -1180,6 +1223,21 @@ th { .content aside.success:before { content: "\e606"; } +/* +Copyright 2008-2013 Concur Technologies, Inc. + +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. See the +License for the specific language governing permissions and limitations +under the License. +*/ .tocify, .toc-footer, .lang-selector, .search, #nav-button { display: none; } @@ -1407,7 +1465,7 @@ Darkula color scheme from the JetBrains family of IDEs var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduce(function(e,t){return e+t.boost},0);return n.some(function(e){return this.tokenStore.has(e)},this)?(n.forEach(function(t,n,s){var a=1/s.length*this._fields.length*o,u=this,c=this.tokenStore.expand(t).reduce(function(n,i){var o=u.corpusTokens.indexOf(i),s=u.idf(i),c=1,l=new e.SortedSet;if(i!==t){var f=Math.max(3,i.length-t.length);c=1/Math.log(f)}return o>-1&&r.insert(o,a*s*c),Object.keys(u.tokenStore.get(i)).forEach(function(e){l.add(e)}),n.union(l)},new e.SortedSet);i.push(c)},this),i.reduce(function(e,t){return e.intersect(t)}).map(function(e){return{ref:e,score:r.similarity(this.documentVector(e))}},this).sort(function(e,t){return t.score-e.score})):[]},e.Index.prototype.documentVector=function(t){for(var n=this.documentStore.get(t),r=n.length,i=new e.Vector,o=0;ot;t+=1)n.push(e[t].listener);return n},r.getListenersAsObject=function(e){var t,n=this.getListeners(e);return n instanceof Array&&(t={},t[e]=n),t||n},r.addListener=function(e,n){var r,i=this.getListenersAsObject(e),o="object"==typeof n;for(r in i)i.hasOwnProperty(r)&&-1===t(i[r],n)&&i[r].push(o?n:{listener:n,once:!1});return this},r.on=n("addListener"),r.addOnceListener=function(e,t){return this.addListener(e,{listener:t,once:!0})},r.once=n("addOnceListener"),r.defineEvent=function(e){return this.getListeners(e),this},r.defineEvents=function(e){for(var t=0;e.length>t;t+=1)this.defineEvent(e[t]);return this},r.removeListener=function(e,n){var r,i,o=this.getListenersAsObject(e);for(i in o)o.hasOwnProperty(i)&&-1!==(r=t(o[i],n))&&o[i].splice(r,1);return this},r.off=n("removeListener"),r.addListeners=function(e,t){return this.manipulateListeners(!1,e,t)},r.removeListeners=function(e,t){return this.manipulateListeners(!0,e,t)},r.manipulateListeners=function(e,t,n){var r,i,o=e?this.removeListener:this.addListener,s=e?this.removeListeners:this.addListeners;if("object"!=typeof t||t instanceof RegExp)for(r=n.length;r--;)o.call(this,t,n[r]);else for(r in t)t.hasOwnProperty(r)&&(i=t[r])&&("function"==typeof i?o.call(this,r,i):s.call(this,r,i));return this},r.removeEvent=function(e){var t,n=typeof e,r=this._getEvents();if("string"===n)delete r[e];else if("object"===n)for(t in r)r.hasOwnProperty(t)&&e.test(t)&&delete r[t];else delete this._events;return this},r.removeAllListeners=n("removeEvent"),r.emitEvent=function(e,t){var n,r,i,o=this.getListenersAsObject(e);for(i in o)if(o.hasOwnProperty(i))for(r=o[i].length;r--;)n=o[i][r],!0===n.once&&this.removeListener(e,n.listener),n.listener.apply(this,t||[])===this._getOnceReturnValue()&&this.removeListener(e,n.listener);return this},r.trigger=n("emitEvent"),r.emit=function(e){var t=Array.prototype.slice.call(arguments,1);return this.emitEvent(e,t)},r.setOnceReturnValue=function(e){return this._onceReturnValue=e,this},r._getOnceReturnValue=function(){return!this.hasOwnProperty("_onceReturnValue")||this._onceReturnValue},r._getEvents=function(){return this._events||(this._events={})},e.noConflict=function(){return i.EventEmitter=o,e},"function"==typeof define&&define.amd?define("eventEmitter/EventEmitter",[],function(){return e}):"object"==typeof module&&module.exports?module.exports=e:this.EventEmitter=e}.call(this),function(e){function t(t){var n=e.event;return n.target=n.target||n.srcElement||t,n}var n=document.documentElement,r=function(){};n.addEventListener?r=function(e,t,n){e.addEventListener(t,n,!1)}:n.attachEvent&&(r=function(e,n,r){e[n+r]=r.handleEvent?function(){var n=t(e);r.handleEvent.call(r,n)}:function(){var n=t(e);r.call(e,n)},e.attachEvent("on"+n,e[n+r])});var i=function(){};n.removeEventListener?i=function(e,t,n){e.removeEventListener(t,n,!1)}:n.detachEvent&&(i=function(e,t,n){e.detachEvent("on"+t,e[t+n]);try{delete e[t+n]}catch(r){e[t+n]=void 0}});var o={bind:r,unbind:i};"function"==typeof define&&define.amd?define("eventie/eventie",o):e.eventie=o}(this),function(e,t){"function"==typeof define&&define.amd?define(["eventEmitter/EventEmitter","eventie/eventie"],function(n,r){return t(e,n,r)}):"object"==typeof exports?module.exports=t(e,require("wolfy87-eventemitter"),require("eventie")):e.imagesLoaded=t(e,e.EventEmitter,e.eventie)}(window,function(e,t,n){function r(e,t){for(var n in t)e[n]=t[n];return e}function i(e){return"[object Array]"===d.call(e)}function o(e){var t=[];if(i(e))t=e;else if("number"==typeof e.length)for(var n=0,r=e.length;r>n;n++)t.push(e[n]);else t.push(e);return t}function s(e,t,n){if(!(this instanceof s))return new s(e,t);"string"==typeof e&&(e=document.querySelectorAll(e)),this.elements=o(e),this.options=r({},this.options),"function"==typeof t?n=t:r(this.options,t),n&&this.on("always",n),this.getImages(),c&&(this.jqDeferred=new c.Deferred);var i=this;setTimeout(function(){i.check()})}function a(e){this.img=e}function u(e){this.src=e,p[e]=this}var c=e.jQuery,l=e.console,f=void 0!==l,d=Object.prototype.toString;s.prototype=new t,s.prototype.options={},s.prototype.getImages=function(){this.images=[];for(var e=0,t=this.elements.length;t>e;e++){var n=this.elements[e];"IMG"===n.nodeName&&this.addImage(n);var r=n.nodeType;if(r&&(1===r||9===r||11===r))for(var i=n.querySelectorAll("img"),o=0,s=i.length;s>o;o++){var a=i[o];this.addImage(a)}}},s.prototype.addImage=function(e){var t=new a(e);this.images.push(t)},s.prototype.check=function(){function e(e,i){return t.options.debug&&f&&l.log("confirm",e,i),t.progress(e),n++,n===r&&t.complete(),!0}var t=this,n=0,r=this.images.length;if(this.hasAnyBroken=!1,!r)return void this.complete();for(var i=0;r>i;i++){var o=this.images[i];o.on("confirm",e),o.check()}},s.prototype.progress=function(e){this.hasAnyBroken=this.hasAnyBroken||!e.isLoaded;var t=this;setTimeout(function(){t.emit("progress",t,e),t.jqDeferred&&t.jqDeferred.notify&&t.jqDeferred.notify(t,e)})},s.prototype.complete=function(){var e=this.hasAnyBroken?"fail":"done";this.isComplete=!0;var t=this;setTimeout(function(){if(t.emit(e,t),t.emit("always",t),t.jqDeferred){var n=t.hasAnyBroken?"reject":"resolve";t.jqDeferred[n](t)}})},c&&(c.fn.imagesLoaded=function(e,t){return new s(this,e,t).jqDeferred.promise(c(this))}),a.prototype=new t,a.prototype.check=function(){var e=p[this.img.src]||new u(this.img.src);if(e.isConfirmed)return void this.confirm(e.isLoaded,"cached was confirmed");if(this.img.complete&&void 0!==this.img.naturalWidth)return void this.confirm(0!==this.img.naturalWidth,"naturalWidth");var t=this;e.on("confirm",function(e,n){return t.confirm(e.isLoaded,n),!0}),e.check()},a.prototype.confirm=function(e,t){this.isLoaded=e,this.emit("confirm",this,t)};var p={};return u.prototype=new t,u.prototype.check=function(){if(!this.isChecked){var e=new Image;n.bind(e,"load",this),n.bind(e,"error",this),e.src=this.src,this.isChecked=!0}},u.prototype.handleEvent=function(e){var t="on"+e.type;this[t]&&this[t](e)},u.prototype.onload=function(e){this.confirm(!0,"onload"),this.unbindProxyEvents(e)},u.prototype.onerror=function(e){this.confirm(!1,"onerror"),this.unbindProxyEvents(e)},u.prototype.confirm=function(e,t){this.isConfirmed=!0,this.isLoaded=e,this.emit("confirm",this,t)},u.prototype.unbindProxyEvents=function(e){n.unbind(e.target,"load",this),n.unbind(e.target,"error",this)},s}),function(){if("ontouchstart"in window){var e,t,n,r,i,o,s={};e=function(e,t){return Math.abs(e[0]-t[0])>5||Math.abs(e[1]-t[1])>5},t=function(e){this.startXY=[e.touches[0].clientX,e.touches[0].clientY],this.threshold=!1},n=function(t){if(this.threshold)return!1;this.threshold=e(this.startXY,[t.touches[0].clientX,t.touches[0].clientY])},r=function(t){if(!this.threshold&&!e(this.startXY,[t.changedTouches[0].clientX,t.changedTouches[0].clientY])){var n=t.changedTouches[0],r=document.createEvent("MouseEvents");r.initMouseEvent("click",!0,!0,window,0,n.screenX,n.screenY,n.clientX,n.clientY,!1,!1,!1,!1,0,null),r.simulated=!0,t.target.dispatchEvent(r)}},i=function(e){var t=Date.now(),n=t-s.time,r=e.clientX,i=e.clientY,a=[Math.abs(s.x-r),Math.abs(s.y-i)],u=o(e.target,"A")||e.target,c=u.nodeName,l="A"===c,f=window.navigator.standalone&&l&&e.target.getAttribute("href");if(s.time=t,s.x=r,s.y=i,(!e.simulated&&(n<500||n<1500&&a[0]<50&&a[1]<50)||f)&&(e.preventDefault(),e.stopPropagation(),!f))return!1;f&&(window.location=u.getAttribute("href")),u&&u.classList&&(u.classList.add("energize-focus"),window.setTimeout(function(){u.classList.remove("energize-focus")},150))},o=function(e,t){for(var n=e;n!==document.body;){if(!n||n.nodeName===t)return n;n=n.parentNode}return null},document.addEventListener("touchstart",t,!1),document.addEventListener("touchmove",n,!1),document.addEventListener("touchend",r,!1),document.addEventListener("click",i,!0)}}(),function(){"use strict";function e(e){if(e&&""!==e){$(".lang-selector a").removeClass("active"),$(".lang-selector a[data-language-name='"+e+"']").addClass("active");for(var t=0;t=1){var e=t(location.search).language;if(e)return e;if(-1!=jQuery.inArray(location.search.substr(1),a))return location.search.substr(1)}return!1}function i(e){var r=t(location.search);return r.language?(r.language=e,n(r)):e}function o(e){if(history){var t=window.location.hash;t&&(t=t.replace(/^#+/,"")),history.pushState({},"","?"+i(e)+"#"+t),localStorage.setItem("language",e)}}function s(t){var n=localStorage.getItem("language");a=t;var i=r();i?(e(i),localStorage.setItem("language",i)):e(null!==n&&-1!=jQuery.inArray(n,a)?n:a[0])}var a=[];window.setupLanguages=s,window.activateLanguage=e,window.getLanguageFromQueryString=r,$(function(){$(".lang-selector a").on("click",function(){var t=$(this).data("language-name");return o(t),e(t),!1})})}(),function(){"use strict";function e(){$("h1, h2").each(function(){var e=$(this),t=e.nextUntil("h1, h2");f.add({id:e.prop("id"),title:e.text(),body:t.text()})}),t()}function t(){f.tokenStore.length>5e3&&(c=300)}function n(){s=$(".content"),a=$(".search-results"),$("#input-search").on("keyup",function(e){!function(){return function(e,t){clearTimeout(l),l=setTimeout(e,t)}}()(function(){r(e)},c)})}function r(e){var t=$("#input-search")[0];if(o(),a.addClass("visible"),27===e.keyCode&&(t.value=""),t.value){var n=f.search(t.value).filter(function(e){return e.score>1e-4});n.length?(a.empty(),$.each(n,function(e,t){var n=document.getElementById(t.ref);a.append("
  1. "+$(n).text()+"
  2. ")}),i.call(t)):(a.html("
  3. "),$(".search-results li").text('No Results Found for "'+t.value+'"'))}else o(),a.removeClass("visible")}function i(){this.value&&s.highlight(this.value,u)}function o(){s.unhighlight(u)}var s,a,u={element:"span",className:"search-highlight"},c=0,l=0,f=new lunr.Index;f.ref("id"),f.field("title",{boost:10}),f.field("body"),f.pipeline.add(lunr.trimmer,lunr.stopWordFilter),$(e),$(n)}(),function(){"use strict";function e(e,i,o,s){var a={},u=0,c=0,l=document.title,f=function(){a={},u=$(document).height(),c=$(window).height(),e.find(i).each(function(){var e=$(this).attr("href");"#"===e[0]&&(a[e]=$(e).offset().top)})},d=function(){var n=$(document).scrollTop()+s;n+c>=u&&(n=u+1e3);var r=null;for(var f in a)(a[f]a[r]||null===r)&&(r=f);n!=s||t||(r=window.location.hash,t=!0);var d=e.find("[href='"+r+"']").first();if(!d.hasClass("active")){e.find(".active").removeClass("active"),e.find(".active-parent").removeClass("active-parent"),d.addClass("active"),d.parents(o).addClass("active").siblings(i).addClass("active-parent"),d.siblings(o).addClass("active"),e.find(o).filter(":not(.active)").slideUp(150),e.find(o).filter(".active").slideDown(150),window.history.replaceState&&window.history.replaceState(null,"",r);var p=d.data("title");void 0!==p&&p.length>0?document.title=p+" – "+l:document.title=l}};!function(){f(),d(),$("#nav-button").click(function(){return $(".toc-wrapper").toggleClass("open"),$("#nav-button").toggleClass("open"),!1}),$(".page-wrapper").click(r),$(".toc-link").click(r),e.find(i).click(function(){setTimeout(function(){d()},0)}),$(window).scroll(n(d,200)),$(window).resize(n(f,200))}(),window.recacheHeights=f,window.refreshToc=d}var t=!1,n=function(e,t){var n=!1;return function(){!1===n&&(setTimeout(function(){e(),n=!1},t),n=!0)}},r=function(){$(".toc-wrapper").removeClass("open"),$("#nav-button").removeClass("open")};window.loadToc=e}(),$(function(){loadToc($("#toc"),".toc-link",".toc-list-h2, .toc-list-h3, .toc-list-h4, .toc-list-h5, .toc-list-h6",10),setupLanguages($("body").data("languages")),$(".content").imagesLoaded(function(){window.recacheHeights(),window.refreshToc()})}),window.onpopstate=function(){activateLanguage(getLanguageFromQueryString())}; - + @@ -1442,42 +1500,37 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
    • - Operations Manager API v1.0.0 + DCAE Dashboard API v1.0.0
    • - Authentication - -
    • - -
    • - Blueprints + Blueprints
      • - List Blueprints + Find all blueprint templates
      • - Create Blueprint + Create/Upload a new blueprint template
      • - Delete Blueprint + Delete a blueprint template
      • - Get Deployments for a blueprint + Get Services mapped to a blueprint template
      • - Get Blueprint + Find a blueprint by a name pattern
      • @@ -1486,47 +1539,52 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
      • - Deployments + Deployments
        • - List Deployments + Lists all Deployments + +
        • + +
        • + Initiate a deployment (install) operation for an application or service
        • - Create Deployment + Initiate an uninstall operation for an application or service
        • - Delete Deployment + Upgrade or Rollback an existing deployment using Cloudify Helm plugin
        • - Upgrade_Rollback Deployment + Gets a Deployment
        • - Get Deployment + Update an existing deployment
        • - Update Deployment + Deployment execution status
        • - Deployment Status + Deployment health status
        • - Deployment Inputs + Deployment inputs
        • @@ -1535,12 +1593,12 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
        • - Tenants + Tenants
          • - List Tenants + Lists all Cloudify Tenants
          • @@ -1549,17 +1607,17 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
          • - Components + Components
            • - List Components + Lists all application components
            • - Add Component + add an application component
            • @@ -1573,97 +1631,102 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
              • - Tenant + Tenant
              • - Component + Component
              • - ComponentInput + ComponentInput
              • - InlineResponse200 + InlineResponse200
              • - InlineResponse200Links + InlineResponse200Links
              • - ApiResponseMessage + ApiResponseMessage
              • - DCAEService + DCAEService
              • - InlineResponse2001 + InlineResponse2001
              • - UriBuilder + UriBuilder
              • - Link + Link
              • - DCAEServiceComponent + DCAEServiceComponent
              • - DCAEServiceTypeRequest + DCAEServiceTypeRequest
              • - DCAEServiceType + DCAEServiceType
              • - CloudifyDeploymentUpgradeRequest + CloudifyDeploymentUpgradeRequest
              • - DeploymentInput + DeploymentInput
              • - deploymentInputs + deploymentInputs
              • - execution + serviceHealth
              • - DeploymentResourceLinks + execution
              • - DeploymentResource + DeploymentResourceLinks + +
              • + +
              • + DeploymentResource
              • @@ -1684,28 +1747,24 @@ var n=this.pipeline.run(e.tokenizer(t)),r=new e.Vector,i=[],o=this._fields.reduc
                -

                Operations Manager API v1.0.0

                +

                DCAE Dashboard API v1.0.0

                Scroll down for code samples, example requests and responses. Select a language for code samples from the tabs above or the mobile navigation menu.

                -

                API interface to manage deployments of blueprints. HTTP Basic authorization schema is required to authenticate users for all the resource endpoints.

                +

                API to manage deployment of microservices using blueprints.

                Base URLs:

                Email: Support

                -

                Authentication

                -
                  -
                • HTTP Authentication, scheme: basic
                • -
                -

                Blueprints

                +

                Blueprints

                Query blueprint information

                -

                List Blueprints

                +

                Find all blueprint templates

                Code samples

                @@ -1715,26 +1774,25 @@ headers = { 'Accept': 'application/json' } -r = requests.get('https://oom-server:30129/ccsdk-app/api-if/blueprints', params={ - +r = requests.get('https://dcae-dashboard:8080/ccsdk-app-os/nb-api/blueprints', params={ + 'pageNum': 'string', 'viewPerPage': 'string' }, headers = headers) print r.json()
                # You can also use wget
                -curl -X GET https://oom-server:30129/ccsdk-app/api-if/blueprints \
                +curl -X GET https://dcae-dashboard:8080/ccsdk-app-os/nb-api/blueprints?pageNum=string&viewPerPage=string \
                   -H 'Accept: application/json'
                 
                 

                GET /blueprints

                -

                Find all blueprint templates

                Fetch the blueprints data from inventory

                -

                Parameters

                +

                Parameters

                - + @@ -1743,6 +1801,20 @@ curl -X GET https://oom-server:30129/ccsdk-app/api-if/blueprints \ + + + + + + + + + + + + + + @@ -1845,13 +1917,13 @@ curl -X GET https://oom-server:30129/ccsdk-app/api-if/blueprints \ }, "type": "string" }, - "created": "2019-05-08T15:25:24Z", - "deactivated": "2019-05-08T15:25:24Z" + "created": "2020-02-05T21:21:26Z", + "deactivated": "2020-02-05T21:21:26Z" } ] } -

                Responses

                +

                Responses

                ParameterName In Type Required
                pageNumquerystringtruepagination control - page number
                viewPerPagequerystringtruepagination control - page size
                _include query array[string]
                @@ -1874,40 +1946,12 @@ curl -X GET https://oom-server:30129/ccsdk-app/api-if/blueprints \ - - - - - -
                Invalid tag value None
                401UnauthorizedAuthentication information is missing or invalidNone
                -

                Response Headers

                - - - - - - - - - - - - - - - - - - - -
                StatusHeaderTypeFormatDescription
                401WWW_Authenticatestringnone
                -
                diff --git a/ccsdk-app-overlay/pom.xml b/ccsdk-app-overlay/pom.xml index 135ba23..b9b7809 100644 --- a/ccsdk-app-overlay/pom.xml +++ b/ccsdk-app-overlay/pom.xml @@ -6,12 +6,12 @@ org.onap.ccsdk.dashboard ccsdk-app-parent - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT org.onap.ccsdk.dashboard ccsdk-app-overlay - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT war ONAP Operations Manager Dashboard overlay CCSDK Dashboard web resources diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api-docs-controller.js b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api-docs-controller.js new file mode 100644 index 0000000..6ac9839 --- /dev/null +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api-docs-controller.js @@ -0,0 +1,42 @@ +/******************************************************************************* + * =============LICENSE_START========================================================= + * + * ================================================================================= + * Copyright (c) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + *******************************************************************************/ + +appDS2.controller('apiDocsController',function( + $scope, ControllerService){ + + 'use strict'; + + // this object holds all app data and functions + $scope.ecdapp = {}; + $scope.ecdapp.apiSpec = ''; + + var getApiSpecs = function(){ + ControllerService.getApiSwaggerSpec().then(function(jsonObj) { + $scope.ecdapp.apiSpec = JSON.stringify(jsonObj, undefined, 4); + }, function(error) { + alert('Failed to get REST API spec file'); + }); + } + + // Populate the page on load + getApiSpecs(); + +}); diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api_doc.html b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api_doc.html new file mode 100644 index 0000000..342406c --- /dev/null +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/api_doc.html @@ -0,0 +1,26 @@ + +
                + +
                \ No newline at end of file diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/appDS2.js b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/appDS2.js index c8f7071..ebb35cd 100644 --- a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/appDS2.js +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/appDS2.js @@ -1,3 +1,24 @@ +/******************************************************************************* + * =============LICENSE_START========================================================= + * + * ================================================================================= + * Copyright (c) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + *******************************************************************************/ + /* Angular application for the EC Dashboard web UI */ var appDS2 = angular.module("abs", [ @@ -6,6 +27,4 @@ var appDS2 = angular.module("abs", 'b2b.att', 'modalServices' ] - ).config(function($sceDelegateProvider) { - $sceDelegateProvider.resourceUrlWhitelist(['**']); - }); + ); diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/controller-service.js b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/controller-service.js index 389a44c..65495f1 100644 --- a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/controller-service.js +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/controller-service.js @@ -1,3 +1,24 @@ +/******************************************************************************* + * =============LICENSE_START========================================================= + * + * ================================================================================= + * Copyright (c) 2020 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * See the License for the specific language governing permissions and + * limitations under the License. + * ============LICENSE_END========================================================= + * + *******************************************************************************/ + appDS2.factory('ControllerService', function ($http, $q, $log) { return { /** @@ -18,6 +39,20 @@ appDS2.factory('ControllerService', function ($http, $q, $log) { return $q.reject(error.statusText); }); }, + getApiSwaggerSpec: function() { + return $http({ + method: 'GET', + url: 'nb-api/api-docs', + cache: true, + responseType: 'json' + }).then(function(response) { + return response.data; + }, + function(error) { + $log.error('ControllerService.getApiSwaggerSpec failed: ' + JSON.stringify(error)); + return $q.reject(error.statusText); + }); + }, /** * Gets the cloudify tenant names. * diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/executions_view.html b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/executions_view.html index f8acb8b..5623b1c 100644 --- a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/executions_view.html +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/executions_view.html @@ -1,5 +1,5 @@
                -

                ONAP Operations Manager {{ecdapp.appLabel}}

                +

                DCAE Dashboard

                diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom-router.js b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom-router.js index 7ec5537..592ab15 100644 --- a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom-router.js +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom-router.js @@ -2,7 +2,7 @@ * =============LICENSE_START========================================================= * * ================================================================================= - * Copyright (c) 2017 AT&T Intellectual Property. All rights reserved. + * Copyright (c) 2020 AT&T Intellectual Property. All rights reserved. * ================================================================================ * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -17,14 +17,16 @@ * limitations under the License. * ============LICENSE_END========================================================= * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. *******************************************************************************/ appDS2.config(function($routeProvider) { $routeProvider - .when('/orgchart', { - /* horizontal layout */ - templateUrl: 'app/ccsdk/home/tree_view.html', - controller : 'treeViewController' + .when('/api', { + templateUrl: 'app/ccsdk/home/api_doc.html', + controller : '' + }) + .when('/api-spec', { + templateUrl: 'app/ccsdk/home/rest-api-spec.html', + controller : 'apiDocsController' }) .when('/ibp', { templateUrl: 'app/ccsdk/inventory/inventory_blueprint_table.html', @@ -82,34 +84,6 @@ appDS2.config(function($routeProvider) { templateUrl: 'app/fusion/scripts/DS2-view-models/ds2-admin/usage.html', controller: 'usageListControllerDS2' }) - .when('/cfy', { - templateUrl: 'app/ccsdk/ops/tabs_view.html', - controller: 'tabsController', - item: 'cfy' - }) - .when('/cnsl', { - templateUrl: 'app/ccsdk/ops/tabs_view.html', - controller: 'tabsController', - item: 'cnsl' - }) - .when('/grf', { - templateUrl: 'app/ccsdk/ops/tabs_view.html', - controller: 'tabsController', - item: 'grf' - }) - .when('/k8s', { - templateUrl: 'app/ccsdk/ops/tabs_view.html', - controller: 'tabsController', - item: 'k8s' - }) - .when('/prom', { - templateUrl: 'app/ecdapp/ops/tabs_view.html', - controller: 'tabsController', - item: 'prom' - }) - .when('/dbcl', { - templateUrl: 'app/ecdapp/ops/dbcl_view.html' - }) .otherwise({ templateUrl: 'app/ccsdk/home/executions_view.html', controller : 'executionsViewController' diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom_spa.html b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom_spa.html index 74651a9..fabb450 100644 --- a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom_spa.html +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/oom_spa.html @@ -1,20 +1,42 @@ + + - + - OOM Dashboard + DCAE Dashboard - - - - - - + + + + + + - + @@ -48,12 +70,15 @@ + + + + diff --git a/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/rest-api-spec.html b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/rest-api-spec.html new file mode 100644 index 0000000..56ee149 --- /dev/null +++ b/ccsdk-app-overlay/src/main/webapp/app/ccsdk/home/rest-api-spec.html @@ -0,0 +1,27 @@ + +
                +

                REST API Specifications

                +
                +{{ecdapp.apiSpec}}
                +
                +
                \ No newline at end of file diff --git a/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/footer.html b/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/footer.html new file mode 100644 index 0000000..65ac372 --- /dev/null +++ b/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/footer.html @@ -0,0 +1,13 @@ +
                +
                + +
                +
                \ No newline at end of file diff --git a/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html b/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html new file mode 100644 index 0000000..942af9b --- /dev/null +++ b/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/header-logo.html @@ -0,0 +1,3 @@ +
                + DCAE Dashboard +
                \ No newline at end of file diff --git a/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/welcome.html b/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/welcome.html index 66c38e0..1c90f97 100644 --- a/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/welcome.html +++ b/ccsdk-app-overlay/src/main/webapp/app/fusion/scripts/DS2-view-models/welcome.html @@ -10,7 +10,7 @@

                - Redirecting to the ONAP Operations Manager Dashboard.. + Redirecting to the DCAE Dashboard..

                diff --git a/pom.xml b/pom.xml index a3fc796..903095a 100644 --- a/pom.xml +++ b/pom.xml @@ -14,7 +14,7 @@ org.onap.ccsdk.dashboard ccsdk-app-parent - 1.2.0-SNAPSHOT + 1.3.0-SNAPSHOT pom ccsdk-dashboard -- 2.16.6