diff options
author | Hong Guan <hg4105@att.com> | 2018-03-07 12:21:17 -0500 |
---|---|---|
committer | Hong Guan <hg4105@att.com> | 2018-03-07 12:21:17 -0500 |
commit | 3df51c6bb79df182be4f0f1bac20bde75f434494 (patch) | |
tree | 65a3ed0a009a2e198f932ba186a2cdcd5bf2d221 | |
parent | 8e60d8171fd7e42c4a2089f50ce751a695dab018 (diff) |
Fix dashboard repo issue
Change-Id: I264bc0ec06bc308816bd96982efdfef28264978c
Issue-ID: CCSDK-196
Signed-off-by: Hong Guan <hg4105@att.com>
27 files changed, 4689 insertions, 4658 deletions
@@ -1,4 +1,4 @@ [gerrit] -host=gerrit.openecomp.org +host=gerrit.onap.org port=29418 project=ccsdk/dashboard.git diff --git a/ccsdk-app-common/pom.xml b/ccsdk-app-common/pom.xml index b28b292..be05119 100644 --- a/ccsdk-app-common/pom.xml +++ b/ccsdk-app-common/pom.xml @@ -1,244 +1,244 @@ -<?xml version="1.0"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>org.onap.ccsdk.dashboard</groupId> - <artifactId>ccsdk-app-common</artifactId> - <version>1.1.0-SNAPSHOT</version> - <packaging>jar</packaging> - <name>ONAP Operations Manager Dashboard common</name> - <description>CCSDK Dashboard common Java code</description> - - <properties> - <encoding>UTF-8</encoding> - <springframework.version>4.2.0.RELEASE</springframework.version> - <hibernate.version>4.3.11.Final</hibernate.version> - <eelf.version>1.0.0</eelf.version> - <epsdk.version>1.1.0</epsdk.version> - <nexusproxy>https://nexus.onap.org</nexusproxy> - <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath> - <releaseNexusPath>/content/repositories/releases/</releaseNexusPath> - <skipTests>true</skipTests> - </properties> - - <repositories> - <repository> - <!-- Releases repository has ECOMP release artifacts --> - <id>ecomp-releases</id> - <name>OpenECOMP - Release Repository</name> - <url>${nexusproxy}/${releaseNexusPath}</url> - </repository> - <repository> - <!-- Snapshots repository has ECOMP snapshot artifacts --> - <id>ecomp-snapshots</id> - <name>OpenECOMP - Snapshot Repository</name> - <url>${nexusproxy}/${snapshotNexusPath}</url> - </repository> - </repositories> - - <!-- disable doclint, a new feature in Java 8, when generating javadoc --> - <profiles> - <profile> - <id>doclint-java8-disable</id> - <activation> - <jdk>[1.8,)</jdk> - </activation> - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <configuration> - <additionalparam>-Xdoclint:none</additionalparam> - </configuration> - </plugin> - </plugins> - </build> - </profile> - </profiles> - - <build> - <plugins> - - <!-- Compile to Java 1.8 class output format --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>3.1</version> - <configuration> - <source>1.8</source> - <target>1.8</target> - </configuration> - </plugin> - - <!-- Put version into jar also --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-jar-plugin</artifactId> - <version>2.6</version> - <configuration> - <archive> - <manifestEntries> - <archive-version>${project.version}</archive-version> - </manifestEntries> - </archive> - </configuration> - </plugin> - - <!-- Generate javadoc jar; see profile for Java 8 --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-javadoc-plugin</artifactId> - <version>2.10.3</version> - <executions> - <execution> - <id>attach-javadocs</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - - <!-- Generate source jar --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-source-plugin</artifactId> - <version>3.0.0</version> - <executions> - <execution> - <id>attach-sources</id> - <goals> - <goal>jar</goal> - </goals> - </execution> - </executions> - </plugin> - - <!-- no deployment needed --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-deploy-plugin</artifactId> - <version>2.8</version> - <configuration> - <skip>true</skip> - </configuration> - </plugin> - - </plugins> - - </build> - - <dependencies> - <!-- For using HTTP Basic Auth in uService REST client --> - <dependency> - <groupId>org.apache.httpcomponents</groupId> - <artifactId>httpclient</artifactId> - <version>4.3.5</version> - </dependency> - <!-- Postgresql driver --> - <dependency> - <groupId>org.postgresql</groupId> - <artifactId>postgresql</artifactId> - <version>9.3-1100-jdbc41</version> - </dependency> - <!-- SDK components --> - <dependency> - <groupId>org.openecomp.ecompsdkos</groupId> - <artifactId>epsdk-core</artifactId> - <version>${epsdk.version}</version> - <exclusions> - <exclusion> - <groupId>mysql</groupId> - <artifactId>mysql-connector-java</artifactId> - </exclusion> - <exclusion> - <groupId>org.elasticsearch</groupId> - <artifactId>elasticsearch</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>com.att.eelf</groupId> - <artifactId>eelf-core</artifactId> - <version>${eelf.version}</version> - </dependency> - <!-- Mapper --> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-annotations</artifactId> - <version>2.6.3</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-core</artifactId> - <version>2.6.3</version> - </dependency> - <dependency> - <groupId>com.fasterxml.jackson.core</groupId> - <artifactId>jackson-databind</artifactId> - <version>2.6.3</version> - </dependency> - <dependency> - <groupId>com.mchange</groupId> - <artifactId>c3p0</artifactId> - <version>0.9.5.2</version> - </dependency> - <dependency> - <groupId>javax.servlet</groupId> - <artifactId>javax.servlet-api</artifactId> - <version>3.1.0</version> - </dependency> - <dependency> - <groupId>junit</groupId> - <artifactId>junit</artifactId> - <version>4.12</version> - </dependency> - <dependency> - <groupId>org.json</groupId> - <artifactId>json</artifactId> - <version>20160212</version> - </dependency> - <!-- bridge to implement commons-logging using slf4j --> - <dependency> - <groupId>org.slf4j</groupId> - <artifactId>jcl-over-slf4j</artifactId> - <version>1.7.12</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-context-support</artifactId> - <version>${springframework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-core</artifactId> - <version>${springframework.version}</version> - <exclusions> - <exclusion> - <groupId>commons-logging</groupId> - <artifactId>commons-logging</artifactId> - </exclusion> - </exclusions> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-tx</artifactId> - <version>${springframework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-web</artifactId> - <version>${springframework.version}</version> - </dependency> - <dependency> - <groupId>org.springframework</groupId> - <artifactId>spring-webmvc</artifactId> - <version>${springframework.version}</version> - </dependency> - </dependencies> - - <!-- no distributionManagement section; no jars pushed to Maven central --> - -</project> +<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.onap.ccsdk.dashboard</groupId>
+ <artifactId>ccsdk-app-common</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ <packaging>jar</packaging>
+ <name>ONAP Operations Manager Dashboard common</name>
+ <description>CCSDK Dashboard common Java code</description>
+
+ <properties>
+ <encoding>UTF-8</encoding>
+ <springframework.version>4.2.0.RELEASE</springframework.version>
+ <hibernate.version>4.3.11.Final</hibernate.version>
+ <eelf.version>1.0.0</eelf.version>
+ <epsdk.version>2.1.0</epsdk.version>
+ <nexusproxy>https://nexus.onap.org</nexusproxy>
+ <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
+ <releaseNexusPath>/content/repositories/releases/</releaseNexusPath>
+ <skipTests>true</skipTests>
+ </properties>
+
+ <repositories>
+ <repository>
+ <!-- Releases repository has ECOMP release artifacts -->
+ <id>ecomp-releases</id>
+ <name>OpenECOMP - Release Repository</name>
+ <url>${nexusproxy}/${releaseNexusPath}</url>
+ </repository>
+ <repository>
+ <!-- Snapshots repository has ECOMP snapshot artifacts -->
+ <id>ecomp-snapshots</id>
+ <name>OpenECOMP - Snapshot Repository</name>
+ <url>${nexusproxy}/${snapshotNexusPath}</url>
+ </repository>
+ </repositories>
+
+ <!-- disable doclint, a new feature in Java 8, when generating javadoc -->
+ <profiles>
+ <profile>
+ <id>doclint-java8-disable</id>
+ <activation>
+ <jdk>[1.8,)</jdk>
+ </activation>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <configuration>
+ <additionalparam>-Xdoclint:none</additionalparam>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ </profile>
+ </profiles>
+
+ <build>
+ <plugins>
+
+ <!-- Compile to Java 1.8 class output format -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+
+ <!-- Put version into jar also -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-jar-plugin</artifactId>
+ <version>2.6</version>
+ <configuration>
+ <archive>
+ <manifestEntries>
+ <archive-version>${project.version}</archive-version>
+ </manifestEntries>
+ </archive>
+ </configuration>
+ </plugin>
+
+ <!-- Generate javadoc jar; see profile for Java 8 -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-javadoc-plugin</artifactId>
+ <version>2.10.3</version>
+ <executions>
+ <execution>
+ <id>attach-javadocs</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- Generate source jar -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-source-plugin</artifactId>
+ <version>3.0.0</version>
+ <executions>
+ <execution>
+ <id>attach-sources</id>
+ <goals>
+ <goal>jar</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+
+ <!-- no deployment needed -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8</version>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+
+ </plugins>
+
+ </build>
+
+ <dependencies>
+ <!-- For using HTTP Basic Auth in uService REST client -->
+ <dependency>
+ <groupId>org.apache.httpcomponents</groupId>
+ <artifactId>httpclient</artifactId>
+ <version>4.3.5</version>
+ </dependency>
+ <!-- Postgresql driver -->
+ <dependency>
+ <groupId>org.postgresql</groupId>
+ <artifactId>postgresql</artifactId>
+ <version>9.3-1100-jdbc41</version>
+ </dependency>
+ <!-- SDK components -->
+ <dependency>
+ <groupId>org.onap.portal.sdk</groupId>
+ <artifactId>epsdk-core</artifactId>
+ <version>${epsdk.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.elasticsearch</groupId>
+ <artifactId>elasticsearch</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>com.att.eelf</groupId>
+ <artifactId>eelf-core</artifactId>
+ <version>${eelf.version}</version>
+ </dependency>
+ <!-- Mapper -->
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-annotations</artifactId>
+ <version>2.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-core</artifactId>
+ <version>2.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.fasterxml.jackson.core</groupId>
+ <artifactId>jackson-databind</artifactId>
+ <version>2.6.3</version>
+ </dependency>
+ <dependency>
+ <groupId>com.mchange</groupId>
+ <artifactId>c3p0</artifactId>
+ <version>0.9.5.2</version>
+ </dependency>
+ <dependency>
+ <groupId>javax.servlet</groupId>
+ <artifactId>javax.servlet-api</artifactId>
+ <version>3.1.0</version>
+ </dependency>
+ <dependency>
+ <groupId>junit</groupId>
+ <artifactId>junit</artifactId>
+ <version>4.12</version>
+ </dependency>
+ <dependency>
+ <groupId>org.json</groupId>
+ <artifactId>json</artifactId>
+ <version>20160212</version>
+ </dependency>
+ <!-- bridge to implement commons-logging using slf4j -->
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>jcl-over-slf4j</artifactId>
+ <version>1.7.12</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-context-support</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-core</artifactId>
+ <version>${springframework.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>commons-logging</groupId>
+ <artifactId>commons-logging</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-tx</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-web</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>org.springframework</groupId>
+ <artifactId>spring-webmvc</artifactId>
+ <version>${springframework.version}</version>
+ </dependency>
+ </dependencies>
+
+ <!-- no distributionManagement section; no jars pushed to Maven central -->
+
+</project>
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 1962c4f..7b05841 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 @@ -1,637 +1,637 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.controller; - -import com.fasterxml.jackson.core.JsonProcessingException; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.onap.ccsdk.dashboard.model.CloudifyDeploymentList; -import org.onap.ccsdk.dashboard.model.CloudifyExecutionRequest; -import org.onap.ccsdk.dashboard.exception.DashboardControllerException; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprint; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprintUpload; -import org.onap.ccsdk.dashboard.model.CloudifyDeployment; -import org.onap.ccsdk.dashboard.model.CloudifyDeploymentRequest; -import org.onap.ccsdk.dashboard.model.CloudifyExecution; -import org.onap.ccsdk.dashboard.model.CloudifyExecutionList; -import org.onap.ccsdk.dashboard.model.ECTransportModel; -import org.onap.ccsdk.dashboard.model.RestResponseError; -import org.onap.ccsdk.dashboard.model.RestResponsePage; -import org.onap.ccsdk.dashboard.rest.IControllerRestClient; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.util.SystemProperties; -import org.openecomp.portalsdk.core.web.support.UserUtils; -import org.slf4j.MDC; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.client.HttpStatusCodeException; - -/** - * Controller for Cloudify features: blueprints, deployments, executions. - * Methods serve Ajax requests made by Angular scripts on pages that show - * content. - */ -@Controller -@RequestMapping("/") -public class CloudifyController extends DashboardRestrictedBaseController { - - private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CloudifyController.class); - - /** - * Enum for selecting an item type. - */ - public enum CloudifyDataItem { - BLUEPRINT, DEPLOYMENT, EXECUTION; - } - - private static final String BLUEPRINTS_PATH = "blueprints"; - private static final String VIEW_BLUEPRINTS_PATH = "viewblueprints"; - private static final String DEPLOYMENTS_PATH = "deployments"; - private static final String EXECUTIONS_PATH = "executions"; - - /** - * Supports sorting blueprints by ID - */ - private static Comparator<CloudifyBlueprint> blueprintComparator = Comparator.comparing(o -> o.id); - - /** - * Supports sorting deployments by ID - */ - private static Comparator<CloudifyDeployment> deploymentComparator = Comparator.comparing(o -> o.id); - - /** - * Supports sorting executions by ID - */ - private static Comparator<CloudifyExecution> executionComparator = Comparator.comparing(o -> o.id); - - /** - * Gets one page of objects and supporting information via the REST client. - * On success, returns a PaginatedRestResponse object as String. - * - * @param option - * Specifies which item list type to get - * @param pageNum - * Page number of results - * @param pageSize - * Number of items per browser page - * @return JSON block as String, see above. - * @throws DashboardControllerException - * On any error; e.g., Network failure. - */ - @SuppressWarnings({"rawtypes", "unchecked"}) - private String getItemListForPage(long userId, CloudifyDataItem option, int pageNum, int pageSize) - throws DashboardControllerException, JsonProcessingException { - IControllerRestClient restClient = getControllerRestClient(userId); - List itemList; - switch (option) { - case BLUEPRINT: - itemList = restClient.getBlueprints().items; - itemList.sort(blueprintComparator); - break; - case DEPLOYMENT: - itemList = restClient.getDeployments().items; - itemList.sort(deploymentComparator); - break; - default: - throw new DashboardControllerException( - "getItemListForPage failed: unimplemented case: " + option.name()); - } - - // Shrink if needed - final int totalItems = itemList.size(); - final int pageCount = (int) Math.ceil((double) totalItems / pageSize); - if (totalItems > pageSize) { - itemList = getPageOfList(pageNum, pageSize, itemList); - } - RestResponsePage<List> model = new RestResponsePage<>(totalItems, pageCount, itemList); - return objectMapper.writeValueAsString(model); - } - - /** - * Gets one page of the specified items. This method traps exceptions and - * constructs an appropriate JSON block to report errors. - * - * @param request - * Inbound request - * @param option - * Item type to get - * @return JSON with one page of objects; or an error. - */ - protected String getItemListForPageWrapper(HttpServletRequest request, CloudifyDataItem option) { - String outboundJson = null; - try { - User appUser = UserUtils.getUserSession(request); - if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) { - throw new DashboardControllerException("getItemListForPageWrapper: Failed to get application user"); - } - int pageNum = getRequestPageNumber(request); - int pageSize = getRequestPageSize(request); - outboundJson = getItemListForPage(appUser.getId(), option, pageNum, pageSize); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "getItemListForPageWrapper caught exception", ex); - RestResponseError result; - if (ex instanceof HttpStatusCodeException) { - result = new RestResponseError(((HttpStatusCodeException) ex).getResponseBodyAsString()); - } else { - result = new RestResponseError("Failed to get " + option.name(), ex); - } - try { - outboundJson = objectMapper.writeValueAsString(result); - } catch (JsonProcessingException jpe) { - // Should never, ever happen - outboundJson = "{ \"error\" : \"" + jpe.toString() + "\"}"; - } - } - 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) { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - String json = getItemListForPageWrapper(request, CloudifyDataItem.BLUEPRINT); - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - 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) { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - String json = getItemListForPageWrapper(request, CloudifyDataItem.DEPLOYMENT); - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return json; - } - - /** - * Gets the specified blueprint metadata. - * - * @param id - * Blueprint ID - * @param request - * HttpServletRequest - * @return Blueprint as JSON; or error. - * @throws JsonProcessingException - * on serialization error - * - */ - @RequestMapping(value = {BLUEPRINTS_PATH + "/{id}"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getBlueprintById(@PathVariable("id") String id, HttpServletRequest request) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.getBlueprint(id); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("getBlueprintById failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - 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 JsonProcessingException - * 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 JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.viewBlueprint(id); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("getBlueprintContentById failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - 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 JsonProcessingException - * on serialization error - */ - @RequestMapping(value = {BLUEPRINTS_PATH}, method = RequestMethod.POST, produces = "application/json") - @ResponseBody - public String uploadBlueprint(HttpServletRequest request, @RequestBody CloudifyBlueprintUpload blueprint) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.uploadBlueprint(blueprint); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("uploadBlueprint failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - 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 JsonProcessingException - * 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 JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - int code = restClient.deleteBlueprint(id); - response.setStatus(code); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("deleteBlueprint failed on ID " + id, t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - if (result == null) { - return null; - } else { - return objectMapper.writeValueAsString(result); - } - } - - /** - * Gets the specified deployment. - * - * @param id - * Deployment ID - * @param request - * HttpServletRequest - * @return Deployment for the specified ID; error on failure. - * @throws JsonProcessingException - * On serialization failure - * - */ - @RequestMapping(value = {DEPLOYMENTS_PATH + "/{id}"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getDeploymentById(@PathVariable("id") String id, HttpServletRequest request) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.getDeployment(id); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("getDeploymentById failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * 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 JsonProcessingException - * On serialization failure - */ - @RequestMapping(value = {DEPLOYMENTS_PATH}, method = RequestMethod.POST, produces = "application/json") - @ResponseBody - public String createDeployment(HttpServletRequest request, @RequestBody CloudifyDeploymentRequest deployment) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.createDeployment(deployment); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("createDeployment failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - 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 through HTTP status code from remote endpoint; no body on - * success - * @throws JsonProcessingException - * 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 JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - int code = restClient.deleteDeployment(id, ignoreLiveNodes == null ? false : ignoreLiveNodes); - response.setStatus(code); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("deleteDeployment failed on ID " + id, t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - if (result == null) { - return null; - } else { - return objectMapper.writeValueAsString(result); - } - } - - /** - * Gets and serves one page of executions: - * <OL> - * <LI>Gets all deployments; OR uses the specified deployment ID if the - * query parameter is present - * <LI>Gets executions for each deployment ID - * <LI>Sorts by execution ID - * <LI>Reduces the list to the page size (if needed) - * <LI>If the optional request parameter "status" is present, reduces the - * list to the executions with that status. - * </OL> - * - * @param request - * HttpServletRequest - * @param deployment_id - * Optional request parameter; if found, only executions for that - * deployment ID are returned. - * @param status - * Optional request parameter; if found, only executions with - * that status are returned. - * @return List of CloudifyExecution objects - * @throws JsonProcessingException - * on serialization failure - */ - @SuppressWarnings("unchecked") - @RequestMapping(value = {EXECUTIONS_PATH}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getExecutionsByPage(HttpServletRequest request, - @RequestParam(value = "deployment_id", required = false) String deployment_id, - @RequestParam(value = "status", required = false) String status) throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - List<CloudifyExecution> itemList = new ArrayList<>(); - IControllerRestClient restClient = getControllerRestClient(request); - List<String> depIds = new ArrayList<>(); - if (deployment_id == null) { - CloudifyDeploymentList depList = restClient.getDeployments(); - for (CloudifyDeployment cd : depList.items) { - depIds.add(cd.id); - } - } else { - depIds.add(deployment_id); - } - for (String depId : depIds) { - CloudifyExecutionList exeList = restClient.getExecutions(depId); - itemList.addAll(exeList.items); - } - // Filter down to specified status as needed - if (status != null) { - itemList.removeIf(ce -> !status.equals(ce.status)); - } - itemList.sort(executionComparator); - - // Paginate - final int pageNum = getRequestPageNumber(request); - final int pageSize = getRequestPageSize(request); - final int totalItems = itemList.size(); - final int pageCount = (int) Math.ceil((double) totalItems / pageSize); - // Shrink if needed - if (totalItems > pageSize) { - itemList = getPageOfList(pageNum, pageSize, itemList); - } - result = new RestResponsePage<>(totalItems, pageCount, itemList); - } catch (Exception t) { - result = new RestResponseError("getExecutionsByPage failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Gets the specified execution for one deployment. - * - * It's not clear why the deployment ID is needed. - * - * @param execution_id - * Execution ID (path variable) - * @param deployment_id - * Deployment ID (query parameter) - * @param request - * HttpServletRequest - * @return CloudifyExecutionList - * @throws JsonProcessingException - * on serialization failure - */ - @RequestMapping(value = {EXECUTIONS_PATH + "/{id}"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getExecutionByIdAndDeploymentId(@PathVariable("id") String execution_id, - @RequestParam("deployment_id") String deployment_id, HttpServletRequest request) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.getExecutions(deployment_id); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("getExecutionByIdAndDeploymentId failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Processes request to create an execution based on a deployment. - * - * @param request - * HttpServletRequest - * @param execution - * Execution model - * @return Information about the execution - * @throws JsonProcessingException - * on serialization failure - */ - @RequestMapping(value = {EXECUTIONS_PATH}, method = RequestMethod.POST, produces = "application/json") - @ResponseBody - public String startExecution(HttpServletRequest request, @RequestBody CloudifyExecutionRequest execution) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.startExecution(execution); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("startExecution failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Cancels an execution. - * - * @param id - * Execution ID - * @param deploymentId - * Deployment ID (not clear why this is needed) - * @param action - * Action to perform (not clear why this is needed) - * @param request - * HttpServletRequest - * @param response - * HttpServletRequest - * @return Passes through HTTP status code from remote endpoint; no body on success - * @throws JsonProcessingException - * on serialization failure - */ - @RequestMapping(value = {EXECUTIONS_PATH + "/{id}"}, method = RequestMethod.DELETE, produces = "application/json") - @ResponseBody - public String cancelExecution(@PathVariable("id") String id, - @RequestParam(value = "deployment_id") String deploymentId, @RequestParam(value = "action") String action, - HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - int code = restClient.cancelExecution(id, deploymentId, action); - response.setStatus(code); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("cancelExecution failed on ID " + id, t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - if (result == null) { - return null; - } else { - return objectMapper.writeValueAsString(result); - } - } -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.onap.ccsdk.dashboard.model.CloudifyDeploymentList;
+import org.onap.ccsdk.dashboard.model.CloudifyExecutionRequest;
+import org.onap.ccsdk.dashboard.exception.DashboardControllerException;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprint;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprintUpload;
+import org.onap.ccsdk.dashboard.model.CloudifyDeployment;
+import org.onap.ccsdk.dashboard.model.CloudifyDeploymentRequest;
+import org.onap.ccsdk.dashboard.model.CloudifyExecution;
+import org.onap.ccsdk.dashboard.model.CloudifyExecutionList;
+import org.onap.ccsdk.dashboard.model.ECTransportModel;
+import org.onap.ccsdk.dashboard.model.RestResponseError;
+import org.onap.ccsdk.dashboard.model.RestResponsePage;
+import org.onap.ccsdk.dashboard.rest.IControllerRestClient;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.HttpStatusCodeException;
+
+/**
+ * Controller for Cloudify features: blueprints, deployments, executions.
+ * Methods serve Ajax requests made by Angular scripts on pages that show
+ * content.
+ */
+@Controller
+@RequestMapping("/")
+public class CloudifyController extends DashboardRestrictedBaseController {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(CloudifyController.class);
+
+ /**
+ * Enum for selecting an item type.
+ */
+ public enum CloudifyDataItem {
+ BLUEPRINT, DEPLOYMENT, EXECUTION;
+ }
+
+ private static final String BLUEPRINTS_PATH = "blueprints";
+ private static final String VIEW_BLUEPRINTS_PATH = "viewblueprints";
+ private static final String DEPLOYMENTS_PATH = "deployments";
+ private static final String EXECUTIONS_PATH = "executions";
+
+ /**
+ * Supports sorting blueprints by ID
+ */
+ private static Comparator<CloudifyBlueprint> blueprintComparator = Comparator.comparing(o -> o.id);
+
+ /**
+ * Supports sorting deployments by ID
+ */
+ private static Comparator<CloudifyDeployment> deploymentComparator = Comparator.comparing(o -> o.id);
+
+ /**
+ * Supports sorting executions by ID
+ */
+ private static Comparator<CloudifyExecution> executionComparator = Comparator.comparing(o -> o.id);
+
+ /**
+ * Gets one page of objects and supporting information via the REST client.
+ * On success, returns a PaginatedRestResponse object as String.
+ *
+ * @param option
+ * Specifies which item list type to get
+ * @param pageNum
+ * Page number of results
+ * @param pageSize
+ * Number of items per browser page
+ * @return JSON block as String, see above.
+ * @throws DashboardControllerException
+ * On any error; e.g., Network failure.
+ */
+ @SuppressWarnings({"rawtypes", "unchecked"})
+ private String getItemListForPage(long userId, CloudifyDataItem option, int pageNum, int pageSize)
+ throws DashboardControllerException, JsonProcessingException {
+ IControllerRestClient restClient = getControllerRestClient(userId);
+ List itemList;
+ switch (option) {
+ case BLUEPRINT:
+ itemList = restClient.getBlueprints().items;
+ itemList.sort(blueprintComparator);
+ break;
+ case DEPLOYMENT:
+ itemList = restClient.getDeployments().items;
+ itemList.sort(deploymentComparator);
+ break;
+ default:
+ throw new DashboardControllerException(
+ "getItemListForPage failed: unimplemented case: " + option.name());
+ }
+
+ // Shrink if needed
+ final int totalItems = itemList.size();
+ final int pageCount = (int) Math.ceil((double) totalItems / pageSize);
+ if (totalItems > pageSize) {
+ itemList = getPageOfList(pageNum, pageSize, itemList);
+ }
+ RestResponsePage<List> model = new RestResponsePage<>(totalItems, pageCount, itemList);
+ return objectMapper.writeValueAsString(model);
+ }
+
+ /**
+ * Gets one page of the specified items. This method traps exceptions and
+ * constructs an appropriate JSON block to report errors.
+ *
+ * @param request
+ * Inbound request
+ * @param option
+ * Item type to get
+ * @return JSON with one page of objects; or an error.
+ */
+ protected String getItemListForPageWrapper(HttpServletRequest request, CloudifyDataItem option) {
+ String outboundJson = null;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) {
+ throw new DashboardControllerException("getItemListForPageWrapper: Failed to get application user");
+ }
+ int pageNum = getRequestPageNumber(request);
+ int pageSize = getRequestPageSize(request);
+ outboundJson = getItemListForPage(appUser.getId(), option, pageNum, pageSize);
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getItemListForPageWrapper caught exception", ex);
+ RestResponseError result;
+ if (ex instanceof HttpStatusCodeException) {
+ result = new RestResponseError(((HttpStatusCodeException) ex).getResponseBodyAsString());
+ } else {
+ result = new RestResponseError("Failed to get " + option.name(), ex);
+ }
+ try {
+ outboundJson = objectMapper.writeValueAsString(result);
+ } catch (JsonProcessingException jpe) {
+ // Should never, ever happen
+ outboundJson = "{ \"error\" : \"" + jpe.toString() + "\"}";
+ }
+ }
+ 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) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ String json = getItemListForPageWrapper(request, CloudifyDataItem.BLUEPRINT);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ 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) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ String json = getItemListForPageWrapper(request, CloudifyDataItem.DEPLOYMENT);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return json;
+ }
+
+ /**
+ * Gets the specified blueprint metadata.
+ *
+ * @param id
+ * Blueprint ID
+ * @param request
+ * HttpServletRequest
+ * @return Blueprint as JSON; or error.
+ * @throws JsonProcessingException
+ * on serialization error
+ *
+ */
+ @RequestMapping(value = {BLUEPRINTS_PATH + "/{id}"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getBlueprintById(@PathVariable("id") String id, HttpServletRequest request)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.getBlueprint(id);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("getBlueprintById failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ 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 JsonProcessingException
+ * 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 JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.viewBlueprint(id);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("getBlueprintContentById failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ 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 JsonProcessingException
+ * on serialization error
+ */
+ @RequestMapping(value = {BLUEPRINTS_PATH}, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String uploadBlueprint(HttpServletRequest request, @RequestBody CloudifyBlueprintUpload blueprint)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.uploadBlueprint(blueprint);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("uploadBlueprint failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ 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 JsonProcessingException
+ * 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 JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ int code = restClient.deleteBlueprint(id);
+ response.setStatus(code);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("deleteBlueprint failed on ID " + id, t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ if (result == null) {
+ return null;
+ } else {
+ return objectMapper.writeValueAsString(result);
+ }
+ }
+
+ /**
+ * Gets the specified deployment.
+ *
+ * @param id
+ * Deployment ID
+ * @param request
+ * HttpServletRequest
+ * @return Deployment for the specified ID; error on failure.
+ * @throws JsonProcessingException
+ * On serialization failure
+ *
+ */
+ @RequestMapping(value = {DEPLOYMENTS_PATH + "/{id}"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getDeploymentById(@PathVariable("id") String id, HttpServletRequest request)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.getDeployment(id);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("getDeploymentById failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * 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 JsonProcessingException
+ * On serialization failure
+ */
+ @RequestMapping(value = {DEPLOYMENTS_PATH}, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String createDeployment(HttpServletRequest request, @RequestBody CloudifyDeploymentRequest deployment)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.createDeployment(deployment);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("createDeployment failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ 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 through HTTP status code from remote endpoint; no body on
+ * success
+ * @throws JsonProcessingException
+ * 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 JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ int code = restClient.deleteDeployment(id, ignoreLiveNodes == null ? false : ignoreLiveNodes);
+ response.setStatus(code);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("deleteDeployment failed on ID " + id, t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ if (result == null) {
+ return null;
+ } else {
+ return objectMapper.writeValueAsString(result);
+ }
+ }
+
+ /**
+ * Gets and serves one page of executions:
+ * <OL>
+ * <LI>Gets all deployments; OR uses the specified deployment ID if the
+ * query parameter is present
+ * <LI>Gets executions for each deployment ID
+ * <LI>Sorts by execution ID
+ * <LI>Reduces the list to the page size (if needed)
+ * <LI>If the optional request parameter "status" is present, reduces the
+ * list to the executions with that status.
+ * </OL>
+ *
+ * @param request
+ * HttpServletRequest
+ * @param deployment_id
+ * Optional request parameter; if found, only executions for that
+ * deployment ID are returned.
+ * @param status
+ * Optional request parameter; if found, only executions with
+ * that status are returned.
+ * @return List of CloudifyExecution objects
+ * @throws JsonProcessingException
+ * on serialization failure
+ */
+ @SuppressWarnings("unchecked")
+ @RequestMapping(value = {EXECUTIONS_PATH}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getExecutionsByPage(HttpServletRequest request,
+ @RequestParam(value = "deployment_id", required = false) String deployment_id,
+ @RequestParam(value = "status", required = false) String status) throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ List<CloudifyExecution> itemList = new ArrayList<>();
+ IControllerRestClient restClient = getControllerRestClient(request);
+ List<String> depIds = new ArrayList<>();
+ if (deployment_id == null) {
+ CloudifyDeploymentList depList = restClient.getDeployments();
+ for (CloudifyDeployment cd : depList.items) {
+ depIds.add(cd.id);
+ }
+ } else {
+ depIds.add(deployment_id);
+ }
+ for (String depId : depIds) {
+ CloudifyExecutionList exeList = restClient.getExecutions(depId);
+ itemList.addAll(exeList.items);
+ }
+ // Filter down to specified status as needed
+ if (status != null) {
+ itemList.removeIf(ce -> !status.equals(ce.status));
+ }
+ itemList.sort(executionComparator);
+
+ // Paginate
+ final int pageNum = getRequestPageNumber(request);
+ final int pageSize = getRequestPageSize(request);
+ final int totalItems = itemList.size();
+ final int pageCount = (int) Math.ceil((double) totalItems / pageSize);
+ // Shrink if needed
+ if (totalItems > pageSize) {
+ itemList = getPageOfList(pageNum, pageSize, itemList);
+ }
+ result = new RestResponsePage<>(totalItems, pageCount, itemList);
+ } catch (Exception t) {
+ result = new RestResponseError("getExecutionsByPage failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Gets the specified execution for one deployment.
+ *
+ * It's not clear why the deployment ID is needed.
+ *
+ * @param execution_id
+ * Execution ID (path variable)
+ * @param deployment_id
+ * Deployment ID (query parameter)
+ * @param request
+ * HttpServletRequest
+ * @return CloudifyExecutionList
+ * @throws JsonProcessingException
+ * on serialization failure
+ */
+ @RequestMapping(value = {EXECUTIONS_PATH + "/{id}"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getExecutionByIdAndDeploymentId(@PathVariable("id") String execution_id,
+ @RequestParam("deployment_id") String deployment_id, HttpServletRequest request)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.getExecutions(deployment_id);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("getExecutionByIdAndDeploymentId failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Processes request to create an execution based on a deployment.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param execution
+ * Execution model
+ * @return Information about the execution
+ * @throws JsonProcessingException
+ * on serialization failure
+ */
+ @RequestMapping(value = {EXECUTIONS_PATH}, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String startExecution(HttpServletRequest request, @RequestBody CloudifyExecutionRequest execution)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.startExecution(execution);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("startExecution failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Cancels an execution.
+ *
+ * @param id
+ * Execution ID
+ * @param deploymentId
+ * Deployment ID (not clear why this is needed)
+ * @param action
+ * Action to perform (not clear why this is needed)
+ * @param request
+ * HttpServletRequest
+ * @param response
+ * HttpServletRequest
+ * @return Passes through HTTP status code from remote endpoint; no body on success
+ * @throws JsonProcessingException
+ * on serialization failure
+ */
+ @RequestMapping(value = {EXECUTIONS_PATH + "/{id}"}, method = RequestMethod.DELETE, produces = "application/json")
+ @ResponseBody
+ public String cancelExecution(@PathVariable("id") String id,
+ @RequestParam(value = "deployment_id") String deploymentId, @RequestParam(value = "action") String action,
+ HttpServletRequest request, HttpServletResponse response) throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ int code = restClient.cancelExecution(id, deploymentId, action);
+ response.setStatus(code);
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("cancelExecution failed on ID " + id, t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ if (result == null) {
+ return null;
+ } else {
+ return objectMapper.writeValueAsString(result);
+ }
+ }
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ConsulController.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ConsulController.java index 9f22456..8350737 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ConsulController.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ConsulController.java @@ -1,445 +1,445 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.controller; - -import com.fasterxml.jackson.core.JsonProcessingException; -import java.net.URI; -import java.time.Instant; -import java.util.ArrayList; -import java.util.Comparator; -import java.util.Date; -import java.util.List; -import javax.servlet.http.HttpServletRequest; - -import org.onap.ccsdk.dashboard.model.ConsulHealthServiceRegistration; -import org.onap.ccsdk.dashboard.model.ConsulNodeInfo; -import org.onap.ccsdk.dashboard.model.ConsulServiceHealth; -import org.onap.ccsdk.dashboard.model.RestResponsePage; -import org.onap.ccsdk.dashboard.rest.IControllerRestClient; -import org.onap.ccsdk.dashboard.exception.DashboardControllerException; -import org.onap.ccsdk.dashboard.model.ConsulServiceInfo; -import org.onap.ccsdk.dashboard.model.ECTransportModel; -import org.onap.ccsdk.dashboard.model.RestResponseError; -import org.onap.ccsdk.dashboard.model.RestResponseSuccess; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.util.SystemProperties; -import org.openecomp.portalsdk.core.web.support.UserUtils; -import org.slf4j.MDC; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.client.HttpStatusCodeException; - -/** - * Controller for Consul features: health checks of services, nodes, data - * centers. Methods serve Ajax requests made by Angular scripts on pages that - * show content. - */ -@Controller -@RequestMapping("/healthservices") -public class ConsulController extends DashboardRestrictedBaseController { - - private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ConsulController.class); - - /** - * Enum for selecting an item type. - */ - public enum ConsulDataItem { - SERVICE_INFO, SERVICE_HEALTH, NODES, DATACENTERS; - } - - private static final String NODES_PATH = "/nodes"; - private static final String SERVICES_PATH = "/services"; - - /** - * Supports sorting results by node name - */ - private static Comparator<ConsulNodeInfo> nodeHealthComparator = Comparator.comparing(o -> o.node); - - /** - * Supports sorting results by service name - */ - private static Comparator<ConsulServiceHealth> serviceHealthComparator = Comparator.comparing(o -> o.serviceName); - - /** - * Supports sorting results by service name - */ - private static Comparator<ConsulServiceInfo> serviceInfoComparator = Comparator.comparing(o -> o.name); - - /** - * Gets one page of objects and supporting information via the REST client. On - * success, returns a page of objects as String. - * - * @param option - * Specifies which item type to get - * @param pageNum - * Page number of results - * @param pageSize - * Number of items per browser page - * @return JSON block as String, see above. - * @throws DashboardControllerException, - * JsonProcessingException On any error; e.g., Network failure. - */ - @SuppressWarnings({"unchecked", "rawtypes"}) - private String getItemListForPage(long userId, ConsulDataItem option, int pageNum, int pageSize) - throws DashboardControllerException, JsonProcessingException { - IControllerRestClient restClient = getControllerRestClient(userId); - List itemList; - switch (option) { - case NODES: - itemList = restClient.getNodes(); - itemList.sort(nodeHealthComparator); - break; - case DATACENTERS: - itemList = restClient.getDatacenters(); - break; - default: - throw new DashboardControllerException( - "getItemListForPage failed: unimplemented case: " + option.name()); - } - - // Shrink if needed - if (itemList.size() > pageSize) { - itemList = getPageOfList(pageNum, pageSize, itemList); - } - int pageCount = (int) Math.ceil((double) itemList.size() / pageSize); - RestResponsePage<List> model = new RestResponsePage<>(itemList.size(), pageCount, itemList); - return objectMapper.writeValueAsString(model); - } - - /** - * Gets one page of the specified items. This method traps exceptions and - * constructs an appropriate JSON block to report errors. - * - * @param request - * Inbound request - * @param option - * Item type to get - * @return JSON with one page of objects; or an error. - */ - protected String getItemListForPageWrapper(HttpServletRequest request, ConsulDataItem option) { - String outboundJson; - try { - User appUser = UserUtils.getUserSession(request); - if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) { - throw new DashboardControllerException("getItemListForPageWrapper: Failed to get application user"); - } - int pageNum = getRequestPageNumber(request); - int pageSize = getRequestPageSize(request); - outboundJson = getItemListForPage(appUser.getId(), option, pageNum, pageSize); - } catch (Exception ex) { - // Remote service failed; build descriptive error message - logger.error(EELFLoggerDelegate.errorLogger, "getItemListForPageWrapper caught exception", ex); - RestResponseError result = new RestResponseError("Failed to get " + option.name(), ex); - try { - outboundJson = objectMapper.writeValueAsString(result); - } catch (JsonProcessingException jpe) { - // Should never, ever happen - outboundJson = "{ \"error\" : \"" + jpe.toString() + "\"}"; - } - } - return outboundJson; - } - - /** - * Serves all service details. - * - * @param request - * HttpServletRequest - * @return List of ConsulServiceInfo objects, as JSON - * @throws JsonProcessingException - * if serialization fails - */ - @RequestMapping(value = {SERVICES_PATH}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getServices(HttpServletRequest request) throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - Object result; - try { - IControllerRestClient restClient = getControllerRestClient(request); - List<ConsulServiceInfo> itemList = restClient.getServices(); - itemList.sort(serviceInfoComparator); - result = itemList; - } catch (Exception t) { - result = new RestResponseError("getServices failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Serves service health details - not paginated. - * - * @param request - * HttpServletRequest - * @param serviceId - * Service ID - * @return List of ConsulServiceHealth objects as JSON - * @throws JsonProcessingException - * if serialization fails - */ - @RequestMapping(value = { - SERVICES_PATH + "/{serviceId}"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getServiceHealthDetails(HttpServletRequest request, @PathVariable String serviceId) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - Object result; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.getServiceHealth(serviceId); - } catch (Exception t) { - result = new RestResponseError("getServiceHealthDetails failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Serves service health historical data - not paginated. - * - * @param request - * HttpServletRequest - * @param serviceName - * Service name as path parameter - * @param start - * Earliest date-time as an ISO 8061 value, such as - * 2007-12-03T10:15:30+01:00 - * @param end - * Latest date-time as an ISO 8061 value, such as - * 2007-12-03T10:15:30+01:00 - * @return List of ConsulServiceHealth objects as JSON - * @throws JsonProcessingException - * if serialization fails - */ - @RequestMapping(value = {"/svchist/{serviceName}"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getServiceHealthHistory(HttpServletRequest request, // - @PathVariable String serviceName, // - @RequestParam String start, // - @RequestParam String end) throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - Object result = null; - try { - Instant startDateTime = Instant.parse(start); - Instant endDateTime = Instant.parse(end); - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.getServiceHealthHistory(serviceName, startDateTime, endDateTime); - } catch (HttpStatusCodeException e) { - // Rare, but can happen - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - // Work around the hack to report no-match. - result = new RestResponseError("getServiceHealthHistory failed: " + t.getMessage()); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Serves one page of service health information by getting all service names, - * then iterating over them to get the health of each service. - * - * ECOMP-C does NOT provide an API to get the health of all services in one - * request. - * - * @param request - * HttpServletRequest - * @return List of ConsulServiceHealth objects, as JSON - * @throws JsonProcessingException - * on serialization exception - */ - @SuppressWarnings("unchecked") - @RequestMapping(value = {"/serviceshealth"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getServicesHealth(HttpServletRequest request) throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - List<ConsulServiceHealth> itemList = new ArrayList<>(); - IControllerRestClient restClient = getControllerRestClient(request); - List<ConsulServiceInfo> svcInfoList = restClient.getServices(); - for (ConsulServiceInfo csi : svcInfoList) { - List<ConsulServiceHealth> csh = restClient.getServiceHealth(csi.name); - itemList.addAll(csh); - } - itemList.sort(serviceHealthComparator); - // Paginate - final int pageNum = getRequestPageNumber(request); - final int pageSize = getRequestPageSize(request); - final int totalItems = itemList.size(); - final int pageCount = (int) Math.ceil((double) totalItems / pageSize); - // Shrink if needed - if (totalItems > pageSize) { - itemList = getPageOfList(pageNum, pageSize, itemList); - } - result = new RestResponsePage<>(totalItems, pageCount, itemList); - } catch (Exception t) { - result = new RestResponseError("getServicesHealth failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Serves one page of node information. - * - * @param request - * HttpServletRequest - * @return List of ConsulNodeInfo objects, as JSON - */ - @RequestMapping(value = {NODES_PATH}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getNodesInfo(HttpServletRequest request) { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - String json = getItemListForPageWrapper(request, ConsulDataItem.NODES); - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return json; - } - - /** - * Serves node services health details - not paginated. - * - * @param request - * HttpServletRequest - * @param nodeName - * Node name - * @return List of ConsulServiceHealth objects as JSON - * @throws JsonProcessingException - * if serialization fails - */ - @RequestMapping(value = {NODES_PATH + "/{nodeName}"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getNodeServicesHealth(HttpServletRequest request, @PathVariable String nodeName) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - Object result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - result = restClient.getNodeServicesHealth(nodeName); - } catch (Exception t) { - result = new RestResponseError("getNodeServicesHealth failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Serves one page of data centers health. - * - * @param request - * HttpServletRequest - * @return List of ConsulHealthStatus objects - */ - @RequestMapping(value = {"/datacenters"}, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getDatacentersHealth(HttpServletRequest request) { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - String json = getItemListForPageWrapper(request, ConsulDataItem.DATACENTERS); - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return json; - } - - /** - * Processes request to register a service for health checks. - * - * @param request - * HttpServletRequest - * @param registration - * Consul service registration - * @return URI of the newly registered resource - * @throws JsonProcessingException - * on serialization error - */ - @RequestMapping(value = {"/register"}, method = RequestMethod.POST, produces = "application/json") - @ResponseBody - public String registerService(HttpServletRequest request, @RequestBody ConsulHealthServiceRegistration registration) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - URI uri = restClient.registerService(registration); - result = new RestResponseSuccess(uri.toString()); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("registerService failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } - - /** - * Processes request to deregister a service for health checks. - * - * @param request - * HttpServletRequest - * @param serviceName - * Consul service name to deregister - * @return Success or error indicator - * @throws JsonProcessingException - * on serialization error - */ - @RequestMapping(value = { - "/deregister" + "/{serviceName}"}, method = RequestMethod.POST, produces = "application/json") - @ResponseBody - public String deregisterService(HttpServletRequest request, @PathVariable String serviceName) - throws JsonProcessingException { - MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date())); - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - ECTransportModel result = null; - try { - IControllerRestClient restClient = getControllerRestClient(request); - int code = restClient.deregisterService(serviceName); - result = new RestResponseSuccess("Deregistration yielded code " + Integer.toString(code)); - } catch (HttpStatusCodeException e) { - result = new RestResponseError(e.getResponseBodyAsString()); - } catch (Exception t) { - result = new RestResponseError("deregisterService failed", t); - } - MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date())); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - return objectMapper.writeValueAsString(result); - } -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.controller;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import java.net.URI;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+
+import org.onap.ccsdk.dashboard.model.ConsulHealthServiceRegistration;
+import org.onap.ccsdk.dashboard.model.ConsulNodeInfo;
+import org.onap.ccsdk.dashboard.model.ConsulServiceHealth;
+import org.onap.ccsdk.dashboard.model.RestResponsePage;
+import org.onap.ccsdk.dashboard.rest.IControllerRestClient;
+import org.onap.ccsdk.dashboard.exception.DashboardControllerException;
+import org.onap.ccsdk.dashboard.model.ConsulServiceInfo;
+import org.onap.ccsdk.dashboard.model.ECTransportModel;
+import org.onap.ccsdk.dashboard.model.RestResponseError;
+import org.onap.ccsdk.dashboard.model.RestResponseSuccess;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.slf4j.MDC;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.client.HttpStatusCodeException;
+
+/**
+ * Controller for Consul features: health checks of services, nodes, data
+ * centers. Methods serve Ajax requests made by Angular scripts on pages that
+ * show content.
+ */
+@Controller
+@RequestMapping("/healthservices")
+public class ConsulController extends DashboardRestrictedBaseController {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ConsulController.class);
+
+ /**
+ * Enum for selecting an item type.
+ */
+ public enum ConsulDataItem {
+ SERVICE_INFO, SERVICE_HEALTH, NODES, DATACENTERS;
+ }
+
+ private static final String NODES_PATH = "/nodes";
+ private static final String SERVICES_PATH = "/services";
+
+ /**
+ * Supports sorting results by node name
+ */
+ private static Comparator<ConsulNodeInfo> nodeHealthComparator = Comparator.comparing(o -> o.node);
+
+ /**
+ * Supports sorting results by service name
+ */
+ private static Comparator<ConsulServiceHealth> serviceHealthComparator = Comparator.comparing(o -> o.serviceName);
+
+ /**
+ * Supports sorting results by service name
+ */
+ private static Comparator<ConsulServiceInfo> serviceInfoComparator = Comparator.comparing(o -> o.name);
+
+ /**
+ * Gets one page of objects and supporting information via the REST client. On
+ * success, returns a page of objects as String.
+ *
+ * @param option
+ * Specifies which item type to get
+ * @param pageNum
+ * Page number of results
+ * @param pageSize
+ * Number of items per browser page
+ * @return JSON block as String, see above.
+ * @throws DashboardControllerException,
+ * JsonProcessingException On any error; e.g., Network failure.
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ private String getItemListForPage(long userId, ConsulDataItem option, int pageNum, int pageSize)
+ throws DashboardControllerException, JsonProcessingException {
+ IControllerRestClient restClient = getControllerRestClient(userId);
+ List itemList;
+ switch (option) {
+ case NODES:
+ itemList = restClient.getNodes();
+ itemList.sort(nodeHealthComparator);
+ break;
+ case DATACENTERS:
+ itemList = restClient.getDatacenters();
+ break;
+ default:
+ throw new DashboardControllerException(
+ "getItemListForPage failed: unimplemented case: " + option.name());
+ }
+
+ // Shrink if needed
+ if (itemList.size() > pageSize) {
+ itemList = getPageOfList(pageNum, pageSize, itemList);
+ }
+ int pageCount = (int) Math.ceil((double) itemList.size() / pageSize);
+ RestResponsePage<List> model = new RestResponsePage<>(itemList.size(), pageCount, itemList);
+ return objectMapper.writeValueAsString(model);
+ }
+
+ /**
+ * Gets one page of the specified items. This method traps exceptions and
+ * constructs an appropriate JSON block to report errors.
+ *
+ * @param request
+ * Inbound request
+ * @param option
+ * Item type to get
+ * @return JSON with one page of objects; or an error.
+ */
+ protected String getItemListForPageWrapper(HttpServletRequest request, ConsulDataItem option) {
+ String outboundJson;
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) {
+ throw new DashboardControllerException("getItemListForPageWrapper: Failed to get application user");
+ }
+ int pageNum = getRequestPageNumber(request);
+ int pageSize = getRequestPageSize(request);
+ outboundJson = getItemListForPage(appUser.getId(), option, pageNum, pageSize);
+ } catch (Exception ex) {
+ // Remote service failed; build descriptive error message
+ logger.error(EELFLoggerDelegate.errorLogger, "getItemListForPageWrapper caught exception", ex);
+ RestResponseError result = new RestResponseError("Failed to get " + option.name(), ex);
+ try {
+ outboundJson = objectMapper.writeValueAsString(result);
+ } catch (JsonProcessingException jpe) {
+ // Should never, ever happen
+ outboundJson = "{ \"error\" : \"" + jpe.toString() + "\"}";
+ }
+ }
+ return outboundJson;
+ }
+
+ /**
+ * Serves all service details.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return List of ConsulServiceInfo objects, as JSON
+ * @throws JsonProcessingException
+ * if serialization fails
+ */
+ @RequestMapping(value = {SERVICES_PATH}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getServices(HttpServletRequest request) throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ Object result;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ List<ConsulServiceInfo> itemList = restClient.getServices();
+ itemList.sort(serviceInfoComparator);
+ result = itemList;
+ } catch (Exception t) {
+ result = new RestResponseError("getServices failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Serves service health details - not paginated.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param serviceId
+ * Service ID
+ * @return List of ConsulServiceHealth objects as JSON
+ * @throws JsonProcessingException
+ * if serialization fails
+ */
+ @RequestMapping(value = {
+ SERVICES_PATH + "/{serviceId}"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getServiceHealthDetails(HttpServletRequest request, @PathVariable String serviceId)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ Object result;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.getServiceHealth(serviceId);
+ } catch (Exception t) {
+ result = new RestResponseError("getServiceHealthDetails failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Serves service health historical data - not paginated.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param serviceName
+ * Service name as path parameter
+ * @param start
+ * Earliest date-time as an ISO 8061 value, such as
+ * 2007-12-03T10:15:30+01:00
+ * @param end
+ * Latest date-time as an ISO 8061 value, such as
+ * 2007-12-03T10:15:30+01:00
+ * @return List of ConsulServiceHealth objects as JSON
+ * @throws JsonProcessingException
+ * if serialization fails
+ */
+ @RequestMapping(value = {"/svchist/{serviceName}"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getServiceHealthHistory(HttpServletRequest request, //
+ @PathVariable String serviceName, //
+ @RequestParam String start, //
+ @RequestParam String end) throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ Object result = null;
+ try {
+ Instant startDateTime = Instant.parse(start);
+ Instant endDateTime = Instant.parse(end);
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.getServiceHealthHistory(serviceName, startDateTime, endDateTime);
+ } catch (HttpStatusCodeException e) {
+ // Rare, but can happen
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ // Work around the hack to report no-match.
+ result = new RestResponseError("getServiceHealthHistory failed: " + t.getMessage());
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Serves one page of service health information by getting all service names,
+ * then iterating over them to get the health of each service.
+ *
+ * ECOMP-C does NOT provide an API to get the health of all services in one
+ * request.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return List of ConsulServiceHealth objects, as JSON
+ * @throws JsonProcessingException
+ * on serialization exception
+ */
+ @SuppressWarnings("unchecked")
+ @RequestMapping(value = {"/serviceshealth"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getServicesHealth(HttpServletRequest request) throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ List<ConsulServiceHealth> itemList = new ArrayList<>();
+ IControllerRestClient restClient = getControllerRestClient(request);
+ List<ConsulServiceInfo> svcInfoList = restClient.getServices();
+ for (ConsulServiceInfo csi : svcInfoList) {
+ List<ConsulServiceHealth> csh = restClient.getServiceHealth(csi.name);
+ itemList.addAll(csh);
+ }
+ itemList.sort(serviceHealthComparator);
+ // Paginate
+ final int pageNum = getRequestPageNumber(request);
+ final int pageSize = getRequestPageSize(request);
+ final int totalItems = itemList.size();
+ final int pageCount = (int) Math.ceil((double) totalItems / pageSize);
+ // Shrink if needed
+ if (totalItems > pageSize) {
+ itemList = getPageOfList(pageNum, pageSize, itemList);
+ }
+ result = new RestResponsePage<>(totalItems, pageCount, itemList);
+ } catch (Exception t) {
+ result = new RestResponseError("getServicesHealth failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Serves one page of node information.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return List of ConsulNodeInfo objects, as JSON
+ */
+ @RequestMapping(value = {NODES_PATH}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getNodesInfo(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ String json = getItemListForPageWrapper(request, ConsulDataItem.NODES);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return json;
+ }
+
+ /**
+ * Serves node services health details - not paginated.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param nodeName
+ * Node name
+ * @return List of ConsulServiceHealth objects as JSON
+ * @throws JsonProcessingException
+ * if serialization fails
+ */
+ @RequestMapping(value = {NODES_PATH + "/{nodeName}"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getNodeServicesHealth(HttpServletRequest request, @PathVariable String nodeName)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ Object result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ result = restClient.getNodeServicesHealth(nodeName);
+ } catch (Exception t) {
+ result = new RestResponseError("getNodeServicesHealth failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Serves one page of data centers health.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return List of ConsulHealthStatus objects
+ */
+ @RequestMapping(value = {"/datacenters"}, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getDatacentersHealth(HttpServletRequest request) {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ String json = getItemListForPageWrapper(request, ConsulDataItem.DATACENTERS);
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return json;
+ }
+
+ /**
+ * Processes request to register a service for health checks.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param registration
+ * Consul service registration
+ * @return URI of the newly registered resource
+ * @throws JsonProcessingException
+ * on serialization error
+ */
+ @RequestMapping(value = {"/register"}, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String registerService(HttpServletRequest request, @RequestBody ConsulHealthServiceRegistration registration)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ URI uri = restClient.registerService(registration);
+ result = new RestResponseSuccess(uri.toString());
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("registerService failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+
+ /**
+ * Processes request to deregister a service for health checks.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param serviceName
+ * Consul service name to deregister
+ * @return Success or error indicator
+ * @throws JsonProcessingException
+ * on serialization error
+ */
+ @RequestMapping(value = {
+ "/deregister" + "/{serviceName}"}, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String deregisterService(HttpServletRequest request, @PathVariable String serviceName)
+ throws JsonProcessingException {
+ MDC.put(SystemProperties.AUDITLOG_BEGIN_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ ECTransportModel result = null;
+ try {
+ IControllerRestClient restClient = getControllerRestClient(request);
+ int code = restClient.deregisterService(serviceName);
+ result = new RestResponseSuccess("Deregistration yielded code " + Integer.toString(code));
+ } catch (HttpStatusCodeException e) {
+ result = new RestResponseError(e.getResponseBodyAsString());
+ } catch (Exception t) {
+ result = new RestResponseError("deregisterService failed", t);
+ }
+ MDC.put(SystemProperties.AUDITLOG_END_TIMESTAMP, logDateFormat.format(new Date()));
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ return objectMapper.writeValueAsString(result);
+ }
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardHomeController.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardHomeController.java index 618e84d..8ec1d2c 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardHomeController.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardHomeController.java @@ -1,162 +1,162 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.controller; - -import java.util.ArrayList; - -import javax.servlet.http.HttpServletRequest; - -import org.onap.ccsdk.dashboard.domain.ControllerEndpoint; -import org.onap.ccsdk.dashboard.exception.DashboardControllerException; -import org.onap.ccsdk.dashboard.model.ControllerEndpointCredentials; -import org.onap.ccsdk.dashboard.model.ControllerEndpointTransport; -import org.onap.ccsdk.dashboard.model.RestResponseError; -import org.onap.ccsdk.dashboard.model.RestResponseSuccess; -import org.onap.ccsdk.dashboard.service.ControllerEndpointService; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.web.support.UserUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.ResponseBody; -import org.springframework.web.servlet.ModelAndView; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * This controller maps requests for the application's landing page, which is an - * Angular single-page application. - */ -@Controller -@RequestMapping("/") -public class DashboardHomeController extends DashboardRestrictedBaseController { - - /** - * This path is embedded in the database, so it's nontrivial to change. - */ - public static final String APP_CONTEXT_PATH = "/ecd"; - - private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DashboardHomeController.class); - - @Autowired - private ControllerEndpointService controllerEndpointService; - - /** - * For general use in these methods - */ - private final ObjectMapper mapper; - - private static final String CONTROLLERS_PATH = "controllers"; - - /** - * Spring autowires fields AFTER the constructor is called. - */ - public DashboardHomeController() { - mapper = new ObjectMapper(); - // Do not serialize null values - mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - } - - /** - * @return View name key, which is resolved to a file using an Apache tiles - * "definitions.xml" file. - */ - @RequestMapping(value = { APP_CONTEXT_PATH }, method = RequestMethod.GET) - public ModelAndView dbcDefaultController() { - // a model is only useful for JSP; this app is angular. - return new ModelAndView("oom_home_tdkey"); - } - - /** - * Gets the available controller endpoints. - * - * @param request - * HttpServletRequest - * @return List of ControllerEndpointTransport objects, or an error on failure - */ - @RequestMapping(value = { CONTROLLERS_PATH }, method = RequestMethod.GET, produces = "application/json") - @ResponseBody - public String getControllers(HttpServletRequest request) { - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - String outboundJson = null; - // Static data - ControllerEndpointCredentials[] configured = getControllerEndpoints(); - try { - User appUser = UserUtils.getUserSession(request); - if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) - throw new DashboardControllerException("getControllers: Failed to get application user"); - ControllerEndpointCredentials selectedInDb = getOrSetControllerEndpointSelection(appUser.getId()); - // Built result from properties - ArrayList<ControllerEndpointTransport> list = new ArrayList<>(); - for (ControllerEndpointCredentials ctrl : configured) { - // Check if this is the selected endpoint in DB - boolean selected = (selectedInDb != null && selectedInDb.getUrl() != null - && selectedInDb.getUrl().equals(ctrl.getUrl())); - // Result has no privileged information - ControllerEndpointTransport transport = new ControllerEndpointTransport(selected, ctrl.getName(), - ctrl.getUrl()); - list.add(transport); - } - outboundJson = mapper.writeValueAsString(list); - } catch (Exception ex) { - RestResponseError response = new RestResponseError("Failed to get controller endpoint list", ex); - outboundJson = response.toJson(); - } - return outboundJson; - } - - /** - * Sets the controller endpoint selection for the user. - * - * @param request - * HttpServletRequest - * @param endpoint - * Body with endpoint details - * @return Result indicating success or failure - * @throws DashboardControllerException, - * if application user is not found - * @throws JsonProcessingException - * If serialization fails - */ - @RequestMapping(value = { CONTROLLERS_PATH }, method = RequestMethod.POST, produces = "application/json") - @ResponseBody - public String setControllerSelection(HttpServletRequest request, @RequestBody ControllerEndpointTransport endpoint) - throws DashboardControllerException, JsonProcessingException { - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - String outboundJson = null; - User appUser = UserUtils.getUserSession(request); - if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) - throw new DashboardControllerException("setControllerSelection: Failed to get application user"); - ControllerEndpoint dbEntry = new ControllerEndpoint(appUser.getId(), endpoint.getName(), endpoint.getUrl()); - controllerEndpointService.updateControllerEndpointSelection(dbEntry); - RestResponseSuccess success = new RestResponseSuccess("Updated selection to " + endpoint.getName()); - outboundJson = mapper.writeValueAsString(success); - return outboundJson; - } -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.controller;
+
+import java.util.ArrayList;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.onap.ccsdk.dashboard.domain.ControllerEndpoint;
+import org.onap.ccsdk.dashboard.exception.DashboardControllerException;
+import org.onap.ccsdk.dashboard.model.ControllerEndpointCredentials;
+import org.onap.ccsdk.dashboard.model.ControllerEndpointTransport;
+import org.onap.ccsdk.dashboard.model.RestResponseError;
+import org.onap.ccsdk.dashboard.model.RestResponseSuccess;
+import org.onap.ccsdk.dashboard.service.ControllerEndpointService;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.servlet.ModelAndView;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * This controller maps requests for the application's landing page, which is an
+ * Angular single-page application.
+ */
+@Controller
+@RequestMapping("/")
+public class DashboardHomeController extends DashboardRestrictedBaseController {
+
+ /**
+ * This path is embedded in the database, so it's nontrivial to change.
+ */
+ public static final String APP_CONTEXT_PATH = "/ecd";
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DashboardHomeController.class);
+
+ @Autowired
+ private ControllerEndpointService controllerEndpointService;
+
+ /**
+ * For general use in these methods
+ */
+ private final ObjectMapper mapper;
+
+ private static final String CONTROLLERS_PATH = "controllers";
+
+ /**
+ * Spring autowires fields AFTER the constructor is called.
+ */
+ public DashboardHomeController() {
+ mapper = new ObjectMapper();
+ // Do not serialize null values
+ mapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ /**
+ * @return View name key, which is resolved to a file using an Apache tiles
+ * "definitions.xml" file.
+ */
+ @RequestMapping(value = { APP_CONTEXT_PATH }, method = RequestMethod.GET)
+ public ModelAndView dbcDefaultController() {
+ // a model is only useful for JSP; this app is angular.
+ return new ModelAndView("oom_home_tdkey");
+ }
+
+ /**
+ * Gets the available controller endpoints.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return List of ControllerEndpointTransport objects, or an error on failure
+ */
+ @RequestMapping(value = { CONTROLLERS_PATH }, method = RequestMethod.GET, produces = "application/json")
+ @ResponseBody
+ public String getControllers(HttpServletRequest request) {
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ String outboundJson = null;
+ // Static data
+ ControllerEndpointCredentials[] configured = getControllerEndpoints();
+ try {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new DashboardControllerException("getControllers: Failed to get application user");
+ ControllerEndpointCredentials selectedInDb = getOrSetControllerEndpointSelection(appUser.getId());
+ // Built result from properties
+ ArrayList<ControllerEndpointTransport> list = new ArrayList<>();
+ for (ControllerEndpointCredentials ctrl : configured) {
+ // Check if this is the selected endpoint in DB
+ boolean selected = (selectedInDb != null && selectedInDb.getUrl() != null
+ && selectedInDb.getUrl().equals(ctrl.getUrl()));
+ // Result has no privileged information
+ ControllerEndpointTransport transport = new ControllerEndpointTransport(selected, ctrl.getName(),
+ ctrl.getUrl());
+ list.add(transport);
+ }
+ outboundJson = mapper.writeValueAsString(list);
+ } catch (Exception ex) {
+ RestResponseError response = new RestResponseError("Failed to get controller endpoint list", ex);
+ outboundJson = response.toJson();
+ }
+ return outboundJson;
+ }
+
+ /**
+ * Sets the controller endpoint selection for the user.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param endpoint
+ * Body with endpoint details
+ * @return Result indicating success or failure
+ * @throws DashboardControllerException,
+ * if application user is not found
+ * @throws JsonProcessingException
+ * If serialization fails
+ */
+ @RequestMapping(value = { CONTROLLERS_PATH }, method = RequestMethod.POST, produces = "application/json")
+ @ResponseBody
+ public String setControllerSelection(HttpServletRequest request, @RequestBody ControllerEndpointTransport endpoint)
+ throws DashboardControllerException, JsonProcessingException {
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, APP_NAME);
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ String outboundJson = null;
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new DashboardControllerException("setControllerSelection: Failed to get application user");
+ ControllerEndpoint dbEntry = new ControllerEndpoint(appUser.getId(), endpoint.getName(), endpoint.getUrl());
+ controllerEndpointService.updateControllerEndpointSelection(dbEntry);
+ RestResponseSuccess success = new RestResponseSuccess("Updated selection to " + endpoint.getName());
+ outboundJson = mapper.writeValueAsString(success);
+ return outboundJson;
+ }
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardRestrictedBaseController.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardRestrictedBaseController.java index 6f80d22..02f8770 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardRestrictedBaseController.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/DashboardRestrictedBaseController.java @@ -1,275 +1,275 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.controller; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import org.onap.ccsdk.dashboard.exception.DashboardControllerException; -import org.onap.ccsdk.dashboard.rest.ControllerRestClientMockImpl; -import org.onap.ccsdk.dashboard.service.ControllerEndpointService; -import org.onap.ccsdk.dashboard.domain.ControllerEndpoint; -import org.onap.ccsdk.dashboard.rest.IControllerRestClient; -import org.onap.ccsdk.dashboard.util.DashboardProperties; -import org.onap.ccsdk.dashboard.model.ControllerEndpointCredentials; -import org.onap.ccsdk.dashboard.rest.ControllerRestClientImpl; -import org.openecomp.portalsdk.core.controller.RestrictedBaseController; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.web.support.UserUtils; -import org.springframework.beans.factory.annotation.Autowired; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * This base class provides utility methods to child controllers. - */ -public class DashboardRestrictedBaseController extends RestrictedBaseController { - - /** - * Logger that conforms with ECOMP guidelines - */ - private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DashboardRestrictedBaseController.class); - - /** - * Application name - */ - protected static final String APP_NAME = "ecd-app"; - - /** - * EELF-approved format - */ - protected static final DateFormat logDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX"); - - /** - * Query parameter for desired page number - */ - protected static final String PAGE_NUM_QUERY_PARAM = "pageNum"; - - /** - * Query parameter for desired items per page - */ - protected static final String PAGE_SIZE_QUERY_PARAM = "viewPerPage"; - - /** - * For general use in these methods and subclasses - */ - protected final ObjectMapper objectMapper = new ObjectMapper(); - - /** - * Application properties - NOT available to constructor. - */ - @Autowired - private DashboardProperties appProperties; - - /** - * For getting selected controller - */ - @Autowired - private ControllerEndpointService controllerEndpointService; - - /** - * Hello Spring, here's your no-arg constructor. - */ - public DashboardRestrictedBaseController() { - // Do not serialize null values - objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); - } - - /** - * Access method for subclasses. - * - * @return DbcappProperties object that was autowired by Spring. - */ - protected DashboardProperties getAppProperties() { - return appProperties; - } - - /** - * Gets the requested page number from a query parameter in the - * HttpServletRequest. Defaults to 1, which is useful to allow manual - * testing of endpoints without supplying those pesky parameters. - * - * @param request - * HttpServletRequest - * @return Value of query parameter {@link #PAGE_NUM_QUERY_PARAM}; 1 if not - * found. - */ - protected int getRequestPageNumber(HttpServletRequest request) { - int pageNum = 1; - String param = request.getParameter(PAGE_NUM_QUERY_PARAM); - if (param != null) - pageNum = Integer.parseInt(param); - return pageNum; - } - - /** - * Gets the requested page size from a query parameter in the - * HttpServletRequest. Defaults to 50, which is useful to allow manual - * testing of endpoints without supplying those pesky parameters. - * - * @param request - * HttpServletRequest - * @return Value of query parameter {@link #PAGE_SIZE_QUERY_PARAM}; 50 if - * not found. - */ - protected int getRequestPageSize(HttpServletRequest request) { - int pageSize = 50; - String param = request.getParameter(PAGE_SIZE_QUERY_PARAM); - if (param != null) - pageSize = Integer.parseInt(param); - return pageSize; - } - - /** - * Gets the items for the specified page from the specified list. - * - * @param pageNum - * Page number requested by user, indexed from 1 - * @param pageSize - * Number of items per page - * @param itemList - * List of items to adjust - * @return List of items; empty list if from==to - */ - @SuppressWarnings("rawtypes") - protected static List getPageOfList(final int pageNum, final int pageSize, final List itemList) { - int firstIndexOnThisPage = pageSize * (pageNum - 1); - int firstIndexOnNextPage = pageSize * pageNum; - int fromIndex = firstIndexOnThisPage < itemList.size() ? firstIndexOnThisPage : itemList.size(); - int toIndex = firstIndexOnNextPage < itemList.size() ? firstIndexOnNextPage : itemList.size(); - return itemList.subList(fromIndex, toIndex); - } - - /** - * Gets all configured controllers from properties. - * - * @return Array of ControllerEndpointRestricted objects - * @throws IllegalStateException - * if a required property is not found - */ - protected ControllerEndpointCredentials[] getControllerEndpoints() { - final String[] controllerKeys = appProperties.getCsvListProperty(DashboardProperties.CONTROLLER_KEY_LIST); - ControllerEndpointCredentials[] controllers = new ControllerEndpointCredentials[controllerKeys.length]; - for (int i = 0; i < controllerKeys.length; ++i) { - String key = controllerKeys[i]; - final String name = appProperties.getControllerProperty(key, DashboardProperties.CONTROLLER_SUBKEY_NAME); - final String url = appProperties.getControllerProperty(key, DashboardProperties.CONTROLLER_SUBKEY_URL); - final String user = appProperties.getControllerProperty(key, - DashboardProperties.CONTROLLER_SUBKEY_USERNAME); - final String pass = appProperties.getControllerProperty(key, - DashboardProperties.CONTROLLER_SUBKEY_PASSWORD); - final boolean encr = Boolean.parseBoolean ( - appProperties.getControllerProperty(key, DashboardProperties.CONTROLLER_SUBKEY_ENCRYPTED)); - logger.debug(EELFLoggerDelegate.debugLogger, "getConfiguredControllers: key {} yields url {}", key, url); - controllers[i] = new ControllerEndpointCredentials(false, name, url, user, pass, encr); - } - return controllers; - } - - /** - * Gets the controller endpoint for the specified user ID. Chooses the first - * one from properties if the user has not selected one previously. - * - * @param userId - * Database User ID - * @return ControllerEndpointCredentials for the specified user - */ - protected ControllerEndpointCredentials getOrSetControllerEndpointSelection(long userId) { - // Always need the complete list from properties - ControllerEndpointCredentials[] configured = getControllerEndpoints(); - // See if the database has an entry for this user - ControllerEndpoint dbEntry = controllerEndpointService.getControllerEndpointSelection(userId); - // If no row found DAO returns an object with null entries. - if (dbEntry == null || dbEntry.getName() == null) { - // Arbitrarily choose the first one - ControllerEndpointCredentials first = configured[0]; - dbEntry = new ControllerEndpoint(userId, first.getName(), first.getUrl()); - controllerEndpointService.updateControllerEndpointSelection(dbEntry); - } - // Fetch complete details for the selected item - ControllerEndpointCredentials selected = null; - for (ControllerEndpointCredentials cec : configured) { - if (dbEntry.getUrl().equals(cec.getUrl())) { - selected = cec; - break; - } - } - // Defend against a stale database entry. - if (selected == null) { - selected = configured[0]; - dbEntry = new ControllerEndpoint(userId, selected.getName(), selected.getUrl()); - controllerEndpointService.updateControllerEndpointSelection(dbEntry); - } - return selected; - } - - /** - * Convenience method that gets the user ID from the session and fetches the - * REST client. Factors code out of subclass methods. - * - * @param request - * HttpServletRequest - * @return REST client appropriate for the user - * @throws DashboardControllerException - */ - protected IControllerRestClient getControllerRestClient(HttpServletRequest request) throws DashboardControllerException { - User appUser = UserUtils.getUserSession(request); - if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0) - throw new DashboardControllerException("getControllerRestClient: Failed to get application user"); - return getControllerRestClient(appUser.getId()); - } - - /** - * Gets a REST client; either a mock client (returns canned data), or a real - * client with appropriate credentials from properties. - * - * @return REST client. - * @throws DashboardControllerException on any failure; e.g., if the password cannot be decrypted. - */ - protected IControllerRestClient getControllerRestClient(long userId) throws DashboardControllerException { - IControllerRestClient result = null; - // Be robust to missing development-only property - boolean mock = false; - if (appProperties.containsProperty(DashboardProperties.CONTROLLER_MOCK_DATA)) - mock = appProperties.getBooleanProperty(DashboardProperties.CONTROLLER_MOCK_DATA); - if (mock) { - result = new ControllerRestClientMockImpl(); - } else { - try { - ControllerEndpointCredentials details = getOrSetControllerEndpointSelection(userId); - final String clearText = details.getEncryptedPassword() ? details.decryptPassword() : details.getPassword(); - result = new ControllerRestClientImpl(details.getUrl(), details.getUsername(), clearText); - } - catch (Exception ex) { - logger.error("getControllerRestClient failed", ex); - throw new DashboardControllerException(ex); - } - } - return result; - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.controller;
+
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.onap.ccsdk.dashboard.exception.DashboardControllerException;
+import org.onap.ccsdk.dashboard.rest.ControllerRestClientMockImpl;
+import org.onap.ccsdk.dashboard.service.ControllerEndpointService;
+import org.onap.ccsdk.dashboard.domain.ControllerEndpoint;
+import org.onap.ccsdk.dashboard.rest.IControllerRestClient;
+import org.onap.ccsdk.dashboard.util.DashboardProperties;
+import org.onap.ccsdk.dashboard.model.ControllerEndpointCredentials;
+import org.onap.ccsdk.dashboard.rest.ControllerRestClientImpl;
+import org.onap.portalsdk.core.controller.RestrictedBaseController;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * This base class provides utility methods to child controllers.
+ */
+public class DashboardRestrictedBaseController extends RestrictedBaseController {
+
+ /**
+ * Logger that conforms with ECOMP guidelines
+ */
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(DashboardRestrictedBaseController.class);
+
+ /**
+ * Application name
+ */
+ protected static final String APP_NAME = "ecd-app";
+
+ /**
+ * EELF-approved format
+ */
+ protected static final DateFormat logDateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
+
+ /**
+ * Query parameter for desired page number
+ */
+ protected static final String PAGE_NUM_QUERY_PARAM = "pageNum";
+
+ /**
+ * Query parameter for desired items per page
+ */
+ protected static final String PAGE_SIZE_QUERY_PARAM = "viewPerPage";
+
+ /**
+ * For general use in these methods and subclasses
+ */
+ protected final ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * Application properties - NOT available to constructor.
+ */
+ @Autowired
+ private DashboardProperties appProperties;
+
+ /**
+ * For getting selected controller
+ */
+ @Autowired
+ private ControllerEndpointService controllerEndpointService;
+
+ /**
+ * Hello Spring, here's your no-arg constructor.
+ */
+ public DashboardRestrictedBaseController() {
+ // Do not serialize null values
+ objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+ }
+
+ /**
+ * Access method for subclasses.
+ *
+ * @return DbcappProperties object that was autowired by Spring.
+ */
+ protected DashboardProperties getAppProperties() {
+ return appProperties;
+ }
+
+ /**
+ * Gets the requested page number from a query parameter in the
+ * HttpServletRequest. Defaults to 1, which is useful to allow manual
+ * testing of endpoints without supplying those pesky parameters.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Value of query parameter {@link #PAGE_NUM_QUERY_PARAM}; 1 if not
+ * found.
+ */
+ protected int getRequestPageNumber(HttpServletRequest request) {
+ int pageNum = 1;
+ String param = request.getParameter(PAGE_NUM_QUERY_PARAM);
+ if (param != null)
+ pageNum = Integer.parseInt(param);
+ return pageNum;
+ }
+
+ /**
+ * Gets the requested page size from a query parameter in the
+ * HttpServletRequest. Defaults to 50, which is useful to allow manual
+ * testing of endpoints without supplying those pesky parameters.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return Value of query parameter {@link #PAGE_SIZE_QUERY_PARAM}; 50 if
+ * not found.
+ */
+ protected int getRequestPageSize(HttpServletRequest request) {
+ int pageSize = 50;
+ String param = request.getParameter(PAGE_SIZE_QUERY_PARAM);
+ if (param != null)
+ pageSize = Integer.parseInt(param);
+ return pageSize;
+ }
+
+ /**
+ * Gets the items for the specified page from the specified list.
+ *
+ * @param pageNum
+ * Page number requested by user, indexed from 1
+ * @param pageSize
+ * Number of items per page
+ * @param itemList
+ * List of items to adjust
+ * @return List of items; empty list if from==to
+ */
+ @SuppressWarnings("rawtypes")
+ protected static List getPageOfList(final int pageNum, final int pageSize, final List itemList) {
+ int firstIndexOnThisPage = pageSize * (pageNum - 1);
+ int firstIndexOnNextPage = pageSize * pageNum;
+ int fromIndex = firstIndexOnThisPage < itemList.size() ? firstIndexOnThisPage : itemList.size();
+ int toIndex = firstIndexOnNextPage < itemList.size() ? firstIndexOnNextPage : itemList.size();
+ return itemList.subList(fromIndex, toIndex);
+ }
+
+ /**
+ * Gets all configured controllers from properties.
+ *
+ * @return Array of ControllerEndpointRestricted objects
+ * @throws IllegalStateException
+ * if a required property is not found
+ */
+ protected ControllerEndpointCredentials[] getControllerEndpoints() {
+ final String[] controllerKeys = appProperties.getCsvListProperty(DashboardProperties.CONTROLLER_KEY_LIST);
+ ControllerEndpointCredentials[] controllers = new ControllerEndpointCredentials[controllerKeys.length];
+ for (int i = 0; i < controllerKeys.length; ++i) {
+ String key = controllerKeys[i];
+ final String name = appProperties.getControllerProperty(key, DashboardProperties.CONTROLLER_SUBKEY_NAME);
+ final String url = appProperties.getControllerProperty(key, DashboardProperties.CONTROLLER_SUBKEY_URL);
+ final String user = appProperties.getControllerProperty(key,
+ DashboardProperties.CONTROLLER_SUBKEY_USERNAME);
+ final String pass = appProperties.getControllerProperty(key,
+ DashboardProperties.CONTROLLER_SUBKEY_PASSWORD);
+ final boolean encr = Boolean.parseBoolean (
+ appProperties.getControllerProperty(key, DashboardProperties.CONTROLLER_SUBKEY_ENCRYPTED));
+ logger.debug(EELFLoggerDelegate.debugLogger, "getConfiguredControllers: key {} yields url {}", key, url);
+ controllers[i] = new ControllerEndpointCredentials(false, name, url, user, pass, encr);
+ }
+ return controllers;
+ }
+
+ /**
+ * Gets the controller endpoint for the specified user ID. Chooses the first
+ * one from properties if the user has not selected one previously.
+ *
+ * @param userId
+ * Database User ID
+ * @return ControllerEndpointCredentials for the specified user
+ */
+ protected ControllerEndpointCredentials getOrSetControllerEndpointSelection(long userId) {
+ // Always need the complete list from properties
+ ControllerEndpointCredentials[] configured = getControllerEndpoints();
+ // See if the database has an entry for this user
+ ControllerEndpoint dbEntry = controllerEndpointService.getControllerEndpointSelection(userId);
+ // If no row found DAO returns an object with null entries.
+ if (dbEntry == null || dbEntry.getName() == null) {
+ // Arbitrarily choose the first one
+ ControllerEndpointCredentials first = configured[0];
+ dbEntry = new ControllerEndpoint(userId, first.getName(), first.getUrl());
+ controllerEndpointService.updateControllerEndpointSelection(dbEntry);
+ }
+ // Fetch complete details for the selected item
+ ControllerEndpointCredentials selected = null;
+ for (ControllerEndpointCredentials cec : configured) {
+ if (dbEntry.getUrl().equals(cec.getUrl())) {
+ selected = cec;
+ break;
+ }
+ }
+ // Defend against a stale database entry.
+ if (selected == null) {
+ selected = configured[0];
+ dbEntry = new ControllerEndpoint(userId, selected.getName(), selected.getUrl());
+ controllerEndpointService.updateControllerEndpointSelection(dbEntry);
+ }
+ return selected;
+ }
+
+ /**
+ * Convenience method that gets the user ID from the session and fetches the
+ * REST client. Factors code out of subclass methods.
+ *
+ * @param request
+ * HttpServletRequest
+ * @return REST client appropriate for the user
+ * @throws DashboardControllerException
+ */
+ protected IControllerRestClient getControllerRestClient(HttpServletRequest request) throws DashboardControllerException {
+ User appUser = UserUtils.getUserSession(request);
+ if (appUser == null || appUser.getLoginId() == null || appUser.getLoginId().length() == 0)
+ throw new DashboardControllerException("getControllerRestClient: Failed to get application user");
+ return getControllerRestClient(appUser.getId());
+ }
+
+ /**
+ * Gets a REST client; either a mock client (returns canned data), or a real
+ * client with appropriate credentials from properties.
+ *
+ * @return REST client.
+ * @throws DashboardControllerException on any failure; e.g., if the password cannot be decrypted.
+ */
+ protected IControllerRestClient getControllerRestClient(long userId) throws DashboardControllerException {
+ IControllerRestClient result = null;
+ // Be robust to missing development-only property
+ boolean mock = false;
+ if (appProperties.containsProperty(DashboardProperties.CONTROLLER_MOCK_DATA))
+ mock = appProperties.getBooleanProperty(DashboardProperties.CONTROLLER_MOCK_DATA);
+ if (mock) {
+ result = new ControllerRestClientMockImpl();
+ } else {
+ try {
+ ControllerEndpointCredentials details = getOrSetControllerEndpointSelection(userId);
+ final String clearText = details.getEncryptedPassword() ? details.decryptPassword() : details.getPassword();
+ result = new ControllerRestClientImpl(details.getUrl(), details.getUsername(), clearText);
+ }
+ catch (Exception ex) {
+ logger.error("getControllerRestClient failed", ex);
+ throw new DashboardControllerException(ex);
+ }
+ }
+ return result;
+ }
+
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ECDSingleSignOnController.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ECDSingleSignOnController.java index 953adff..28f939c 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ECDSingleSignOnController.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/ECDSingleSignOnController.java @@ -1,290 +1,299 @@ -/*- - * ================================================================================ - * ECOMP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * 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. - * ================================================================================ - */ - -package org.onap.ccsdk.dashboard.controller; - -import java.io.UnsupportedEncodingException; - -import java.net.URLDecoder; -import java.net.URLEncoder; -import java.util.HashMap; -import java.util.Map; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; -import javax.servlet.http.HttpSession; - -import org.onap.ccsdk.dashboard.exception.DashboardControllerException; -import org.openecomp.portalsdk.core.auth.LoginStrategy; -import org.openecomp.portalsdk.core.command.LoginBean; -import org.openecomp.portalsdk.core.controller.UnRestrictedBaseController; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.menu.MenuProperties; -import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException; -import org.openecomp.portalsdk.core.onboarding.listener.PortalTimeoutHandler; -import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants; -import org.openecomp.portalsdk.core.onboarding.util.PortalApiProperties; -import org.openecomp.portalsdk.core.service.LoginService; -import org.openecomp.portalsdk.core.util.SystemProperties; -import org.openecomp.portalsdk.core.web.support.AppUtils; -import org.openecomp.portalsdk.core.web.support.UserUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.client.RestClientException; -import org.springframework.web.client.RestTemplate; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.util.WebUtils; - -@Controller -@RequestMapping("/") -/** - * Replicated from - * org.openecomp.portalapp.controller.core.SingleSignOnController to modify the - * behavior of sending user's browser on a detour of Portal app to get the - * EPService cookie. - */ -public class ECDSingleSignOnController extends UnRestrictedBaseController { - - private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ECDSingleSignOnController.class); - private static final String REDIRECT = "redirect:"; - - @Autowired - private LoginService loginService; - - @Autowired - private LoginStrategy loginStrategy; - - private String viewName; - private String welcomeView; - - /** - * Handles requests directed to the single sign-on page by the session timeout - * interceptor. - * - * @param request - * HttpServletRequest - * @param response - * HttpServletResponse - * @return Redirect to an appropriate address - * @throws DashboardControllerException - * User not found - * @throws PortalAPIException - * User ID can't be fetched - * @throws UnsupportedEncodingException - * Encoding fails - */ - @RequestMapping(value = { "/single_signon.htm" }, method = RequestMethod.GET) - public ModelAndView singleSignOnLogin(HttpServletRequest request, HttpServletResponse response) - throws DashboardControllerException, PortalAPIException, UnsupportedEncodingException { - - Map<String, String> model = new HashMap<>(); - HashMap<String, String> additionalParamsMap = new HashMap<>(); - LoginBean commandBean = new LoginBean(); - - // SessionTimeoutInterceptor sets these parameters - String forwardURL = URLDecoder.decode(request.getParameter("forwardURL"), "UTF-8"); - String redirectToPortal = request.getParameter("redirectToPortal"); - - if (isLoginCookieExist(request) && redirectToPortal == null) { - HttpSession session = null; - session = AppUtils.getSession(request); - User user = UserUtils.getUserSession(request); - if (session == null || user == null) { - - final String authMech = SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM); - String userId = loginStrategy.getUserId(request); - commandBean.setUserid(userId); - try { - commandBean = getLoginService().findUser(commandBean, - (String) request.getAttribute(MenuProperties.MENU_PROPERTIES_FILENAME_KEY), - additionalParamsMap); - } catch (Exception ex) { - logger.error("singleSignOnLogin failed", ex); - throw new DashboardControllerException(ex); - } - if (commandBean.getUser() == null) { - String loginErrorMessage = (commandBean.getLoginErrorMessage() != null) - ? commandBean.getLoginErrorMessage() - : SystemProperties.MESSAGE_KEY_LOGIN_ERROR_USER_NOT_FOUND; - model.put(LoginStrategy.ERROR_MESSAGE_KEY, SystemProperties.getProperty(loginErrorMessage)); - final String redirectUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL) - + "?noUserError=Yes"; - logger.debug(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: user is null, redirect URL is {}", - redirectUrl); - return new ModelAndView(REDIRECT + redirectUrl); - } else { - // store the user's information in the session - String loginMethod; - if (null == authMech || "".equals(authMech) || "BOTH".equals(authMech)) { - loginMethod = SystemProperties.getProperty(SystemProperties.LOGIN_METHOD_CSP); - } else if ("CSP".equals(authMech)) { - loginMethod = SystemProperties.getProperty(SystemProperties.LOGIN_METHOD_CSP); - } else { - loginMethod = SystemProperties.getProperty(SystemProperties.LOGIN_METHOD_WEB_JUNCTION); - } - UserUtils.setUserSession(request, commandBean.getUser(), commandBean.getMenu(), - commandBean.getBusinessDirectMenu(), loginMethod); - initateSessionMgtHandler(request); - logger.debug(EELFLoggerDelegate.debugLogger, - "singleSignOnLogin: create new user session for expired user {}; user {} exists in the system", - userId, commandBean.getUser().getOrgUserId()); - return new ModelAndView(REDIRECT + forwardURL); - } - } // user is null or session is null - else { - // both user and session are non-null. - logger.info(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: redirecting to the forwardURL {}", - forwardURL); - return new ModelAndView(REDIRECT + forwardURL); - } - } else { - /* - * Login cookie not found, or redirect-to-portal parameter was found. - */ - if (isPortalAvailable()) { - /* - * Redirect the user to the portal with a suitable return URL. The forwardURL - * parameter that arrives as a parameter is a partial (not absolute) request - * path for a page in the application. The challenge here is to compute the - * correct absolute path for the original request so the portal can redirect the - * user back to the right place. If the application sits behind WebJunction, or - * if separate FE-BE hosts are used, then the URL yielded by the request has a - * host name that is not reachable by the user. - */ - String returnToAppUrl = null; - if (SystemProperties.containsProperty(SystemProperties.APP_BASE_URL)) { - // New feature as of 1610, release 3.3.3: - // application can publish a base URL in system.properties - String appUrl = SystemProperties.getProperty(SystemProperties.APP_BASE_URL); - returnToAppUrl = appUrl + (appUrl.endsWith("/") ? "" : "/") + forwardURL; - logger.debug(EELFLoggerDelegate.debugLogger, - "singleSignOnLogin: using app base URL {} and redirectURL {}", appUrl, returnToAppUrl); - } else { - /** - * Be backward compatible with applications that don't need this feature. This - * is the controller for the single_signon.htm page, so the replace should - * always find the specified token. - */ - returnToAppUrl = request.getRequestURL().toString() - .replace("single_signon.htm", forwardURL); - logger.debug(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: computed redirectURL {}", - returnToAppUrl); - } - final String encodedReturnToAppUrl = URLEncoder.encode(returnToAppUrl, "UTF-8"); - // Also send the application's UEB key so Portal can block URL - // reflection attacks. - final String uebAppKey = PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY); - final String url = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL); - final String portalUrl = url.substring(0, url.lastIndexOf('/')) + "/process_csp"; - final String redirectUrl = portalUrl + "?uebAppKey=" + uebAppKey + "&redirectUrl=" - + encodedReturnToAppUrl; - logger.debug(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: portal-bound redirect URL is {}", - redirectUrl); - return new ModelAndView(REDIRECT + redirectUrl); - } // portal is available - - else { - /* - * Portal is not available. Redirect user to the login page, ignoring the - * forwardURL parameter. - */ - return new ModelAndView("redirect:login.htm"); - } - - } - } - - /** - * Discover if the portal is available by GET-ing a resource from the REST URL - * specified in portal.properties, using a very short timeout. - * - * @return True if the portal answers, otherwise false. - */ - private boolean isPortalAvailable() { - HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory(); - final int oneSecond = 1000; - httpRequestFactory.setConnectionRequestTimeout(oneSecond); - httpRequestFactory.setConnectTimeout(oneSecond); - httpRequestFactory.setReadTimeout(oneSecond); - RestTemplate restTemplate = new RestTemplate(httpRequestFactory); - boolean avail = true; - try { - final String portalUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REST_URL); - String s = restTemplate.getForObject(portalUrl, String.class); - logger.trace("isPortalAvailable got response {}", s); - } catch (RestClientException ex) { - logger.debug("isPortalAvailable failed", ex); - avail = false; - } - return avail; - } - - protected void initateSessionMgtHandler(HttpServletRequest request) { - String portalJSessionId = getPortalJSessionId(request); - String jSessionId = getJessionId(request); - PortalTimeoutHandler.sessionCreated(portalJSessionId, jSessionId, AppUtils.getSession(request)); - } - - public boolean isLoginCookieExist(HttpServletRequest request) { - Cookie ep = WebUtils.getCookie(request, LoginStrategy.EP_SERVICE); - return (ep != null); - } - - public String getPortalJSessionId(HttpServletRequest request) { - Cookie ep = WebUtils.getCookie(request, LoginStrategy.EP_SERVICE); - return ep.getValue(); - } - - public String getJessionId(HttpServletRequest request) { - return request.getSession().getId(); - } - - @Override - public String getViewName() { - return viewName; - } - - @Override - public void setViewName(String viewName) { - this.viewName = viewName; - } - - public String getWelcomeView() { - return welcomeView; - } - - public void setWelcomeView(String welcomeView) { - this.welcomeView = welcomeView; - } - - public LoginService getLoginService() { - return loginService; - } - - public void setLoginService(LoginService loginService) { - this.loginService = loginService; - } - -} +/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+
+package org.onap.ccsdk.dashboard.controller;
+
+import java.io.UnsupportedEncodingException;
+
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.onap.ccsdk.dashboard.exception.DashboardControllerException;
+import org.onap.portalsdk.core.auth.LoginStrategy;
+import org.onap.portalsdk.core.command.LoginBean;
+import org.onap.portalsdk.core.controller.UnRestrictedBaseController;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.menu.MenuProperties;
+import org.onap.portalsdk.core.onboarding.exception.PortalAPIException;
+import org.onap.portalsdk.core.onboarding.listener.PortalTimeoutHandler;
+import org.onap.portalsdk.core.onboarding.util.PortalApiConstants;
+import org.onap.portalsdk.core.onboarding.util.PortalApiProperties;
+import org.onap.portalsdk.core.service.LoginService;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.portalsdk.core.web.support.AppUtils;
+import org.onap.portalsdk.core.web.support.UserUtils;
+import org.onap.portalsdk.core.service.RoleService;
+import org.onap.portalsdk.core.domain.RoleFunction;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.client.RestClientException;
+import org.springframework.web.client.RestTemplate;
+import org.springframework.web.servlet.ModelAndView;
+import org.springframework.web.util.WebUtils;
+
+@Controller
+@RequestMapping("/")
+/**
+ * Replicated from
+ * org.onap.portalapp.controller.core.SingleSignOnController to modify the
+ * behavior of sending user's browser on a detour of Portal app to get the
+ * EPService cookie.
+ */
+public class ECDSingleSignOnController extends UnRestrictedBaseController {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ECDSingleSignOnController.class);
+ private static final String REDIRECT = "redirect:";
+
+ @Autowired
+ private LoginService loginService;
+
+ @Autowired
+ private LoginStrategy loginStrategy;
+
+ @Autowired
+ private RoleService roleService;
+
+ private String viewName;
+ private String welcomeView;
+
+ /**
+ * Handles requests directed to the single sign-on page by the session timeout
+ * interceptor.
+ *
+ * @param request
+ * HttpServletRequest
+ * @param response
+ * HttpServletResponse
+ * @return Redirect to an appropriate address
+ * @throws DashboardControllerException
+ * User not found
+ * @throws PortalAPIException
+ * User ID can't be fetched
+ * @throws UnsupportedEncodingException
+ * Encoding fails
+ */
+ @RequestMapping(value = { "/single_signon.htm" }, method = RequestMethod.GET)
+ public ModelAndView singleSignOnLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ //throws DashboardControllerException, PortalAPIException, UnsupportedEncodingException {
+
+ Map<String, String> model = new HashMap<>();
+ HashMap<String, String> additionalParamsMap = new HashMap<>();
+ LoginBean commandBean = new LoginBean();
+
+ // SessionTimeoutInterceptor sets these parameters
+ String forwardURL = URLDecoder.decode(request.getParameter("forwardURL"), "UTF-8");
+ String redirectToPortal = request.getParameter("redirectToPortal");
+
+ if (isLoginCookieExist(request) && redirectToPortal == null) {
+ HttpSession session = null;
+ session = AppUtils.getSession(request);
+ User user = UserUtils.getUserSession(request);
+ if (session == null || user == null) {
+
+ final String authMech = SystemProperties.getProperty(SystemProperties.AUTHENTICATION_MECHANISM);
+ String userId = loginStrategy.getUserId(request);
+ commandBean.setUserid(userId);
+ commandBean = getLoginService().findUser(commandBean,
+ (String) request.getAttribute(MenuProperties.MENU_PROPERTIES_FILENAME_KEY), additionalParamsMap);
+ List<RoleFunction> roleFunctionList = roleService.getRoleFunctions(userId);
+ try {
+ commandBean = getLoginService().findUser(commandBean,
+ (String) request.getAttribute(MenuProperties.MENU_PROPERTIES_FILENAME_KEY),
+ additionalParamsMap);
+ } catch (Exception ex) {
+ logger.error("singleSignOnLogin failed", ex);
+ throw new DashboardControllerException(ex);
+ }
+ if (commandBean.getUser() == null) {
+ String loginErrorMessage = (commandBean.getLoginErrorMessage() != null)
+ ? commandBean.getLoginErrorMessage()
+ : SystemProperties.MESSAGE_KEY_LOGIN_ERROR_USER_NOT_FOUND;
+ model.put(LoginStrategy.ERROR_MESSAGE_KEY, SystemProperties.getProperty(loginErrorMessage));
+ final String redirectUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL)
+ + "?noUserError=Yes";
+ logger.debug(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: user is null, redirect URL is {}",
+ redirectUrl);
+ return new ModelAndView(REDIRECT + redirectUrl);
+ } else {
+ // store the user's information in the session
+ String loginMethod;
+ if (null == authMech || "".equals(authMech) || "BOTH".equals(authMech)) {
+ loginMethod = SystemProperties.getProperty(SystemProperties.LOGIN_METHOD_CSP);
+ } else if ("CSP".equals(authMech)) {
+ loginMethod = SystemProperties.getProperty(SystemProperties.LOGIN_METHOD_CSP);
+ } else {
+ loginMethod = SystemProperties.getProperty(SystemProperties.LOGIN_METHOD_WEB_JUNCTION);
+ }
+ UserUtils.setUserSession(request, commandBean.getUser(), commandBean.getMenu(),
+ commandBean.getBusinessDirectMenu(), loginMethod, roleFunctionList);
+ initateSessionMgtHandler(request);
+ logger.debug(EELFLoggerDelegate.debugLogger,
+ "singleSignOnLogin: create new user session for expired user {}; user {} exists in the system",
+ userId, commandBean.getUser().getOrgUserId());
+ return new ModelAndView(REDIRECT + forwardURL);
+ }
+ } // user is null or session is null
+ else {
+ // both user and session are non-null.
+ logger.info(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: redirecting to the forwardURL {}",
+ forwardURL);
+ return new ModelAndView(REDIRECT + forwardURL);
+ }
+ } else {
+ /*
+ * Login cookie not found, or redirect-to-portal parameter was found.
+ */
+ if (isPortalAvailable()) {
+ /*
+ * Redirect the user to the portal with a suitable return URL. The forwardURL
+ * parameter that arrives as a parameter is a partial (not absolute) request
+ * path for a page in the application. The challenge here is to compute the
+ * correct absolute path for the original request so the portal can redirect the
+ * user back to the right place. If the application sits behind WebJunction, or
+ * if separate FE-BE hosts are used, then the URL yielded by the request has a
+ * host name that is not reachable by the user.
+ */
+ String returnToAppUrl = null;
+ if (SystemProperties.containsProperty(SystemProperties.APP_BASE_URL)) {
+ // New feature as of 1610, release 3.3.3:
+ // application can publish a base URL in system.properties
+ String appUrl = SystemProperties.getProperty(SystemProperties.APP_BASE_URL);
+ returnToAppUrl = appUrl + (appUrl.endsWith("/") ? "" : "/") + forwardURL;
+ logger.debug(EELFLoggerDelegate.debugLogger,
+ "singleSignOnLogin: using app base URL {} and redirectURL {}", appUrl, returnToAppUrl);
+ } else {
+ /**
+ * Be backward compatible with applications that don't need this feature. This
+ * is the controller for the single_signon.htm page, so the replace should
+ * always find the specified token.
+ */
+ returnToAppUrl = request.getRequestURL().toString()
+ .replace("single_signon.htm", forwardURL);
+ logger.debug(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: computed redirectURL {}",
+ returnToAppUrl);
+ }
+ final String encodedReturnToAppUrl = URLEncoder.encode(returnToAppUrl, "UTF-8");
+ // Also send the application's UEB key so Portal can block URL
+ // reflection attacks.
+ final String uebAppKey = PortalApiProperties.getProperty(PortalApiConstants.UEB_APP_KEY);
+ final String url = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REDIRECT_URL);
+ final String portalUrl = url.substring(0, url.lastIndexOf('/')) + "/process_csp";
+ final String redirectUrl = portalUrl + "?uebAppKey=" + uebAppKey + "&redirectUrl="
+ + encodedReturnToAppUrl;
+ logger.debug(EELFLoggerDelegate.debugLogger, "singleSignOnLogin: portal-bound redirect URL is {}",
+ redirectUrl);
+ return new ModelAndView(REDIRECT + redirectUrl);
+ } // portal is available
+
+ else {
+ /*
+ * Portal is not available. Redirect user to the login page, ignoring the
+ * forwardURL parameter.
+ */
+ return new ModelAndView("redirect:login.htm");
+ }
+
+ }
+ }
+
+ /**
+ * Discover if the portal is available by GET-ing a resource from the REST URL
+ * specified in portal.properties, using a very short timeout.
+ *
+ * @return True if the portal answers, otherwise false.
+ */
+ private boolean isPortalAvailable() {
+ HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
+ final int oneSecond = 1000;
+ httpRequestFactory.setConnectionRequestTimeout(oneSecond);
+ httpRequestFactory.setConnectTimeout(oneSecond);
+ httpRequestFactory.setReadTimeout(oneSecond);
+ RestTemplate restTemplate = new RestTemplate(httpRequestFactory);
+ boolean avail = true;
+ try {
+ final String portalUrl = PortalApiProperties.getProperty(PortalApiConstants.ECOMP_REST_URL);
+ String s = restTemplate.getForObject(portalUrl, String.class);
+ logger.trace("isPortalAvailable got response {}", s);
+ } catch (RestClientException ex) {
+ logger.debug("isPortalAvailable failed", ex);
+ avail = false;
+ }
+ return avail;
+ }
+
+ protected void initateSessionMgtHandler(HttpServletRequest request) {
+ String portalJSessionId = getPortalJSessionId(request);
+ String jSessionId = getJessionId(request);
+ PortalTimeoutHandler.sessionCreated(portalJSessionId, jSessionId, AppUtils.getSession(request));
+ }
+
+ public boolean isLoginCookieExist(HttpServletRequest request) {
+ Cookie ep = WebUtils.getCookie(request, LoginStrategy.EP_SERVICE);
+ return (ep != null);
+ }
+
+ public String getPortalJSessionId(HttpServletRequest request) {
+ Cookie ep = WebUtils.getCookie(request, LoginStrategy.EP_SERVICE);
+ return ep.getValue();
+ }
+
+ public String getJessionId(HttpServletRequest request) {
+ return request.getSession().getId();
+ }
+
+ @Override
+ public String getViewName() {
+ return viewName;
+ }
+
+ @Override
+ public void setViewName(String viewName) {
+ this.viewName = viewName;
+ }
+
+ public String getWelcomeView() {
+ return welcomeView;
+ }
+
+ public void setWelcomeView(String welcomeView) {
+ this.welcomeView = welcomeView;
+ }
+
+ public LoginService getLoginService() {
+ return loginService;
+ }
+
+ public void setLoginService(LoginService loginService) {
+ this.loginService = loginService;
+ }
+
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/HealthCheckController.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/HealthCheckController.java index 3393236..be099a7 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/HealthCheckController.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/controller/HealthCheckController.java @@ -1,86 +1,86 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.controller; - -import java.util.List; - -import javax.servlet.http.HttpServletRequest; - -import org.onap.ccsdk.dashboard.model.HealthStatus; -import org.openecomp.portalsdk.core.controller.UnRestrictedBaseController; -import org.openecomp.portalsdk.core.domain.App; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.service.DataAccessService; -import org.openecomp.portalsdk.core.util.SystemProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.EnableAspectJAutoProxy; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.bind.annotation.RestController; - -/** - * This controller responds to probes for application health, returning a JSON - * body to indicate current status. - */ -@RestController -@Configuration -@EnableAspectJAutoProxy -@RequestMapping("/") -public class HealthCheckController extends UnRestrictedBaseController { - - private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthCheckController.class); - - private static final String HEALTH_CHECK_PATH = "/healthCheck"; - - @Autowired - private DataAccessService dataAccessService; - - /** - * Checks application health by making a trivial query to (what??). - * - * @param request - * HttpServletRequest - * @return 200 if database access succeeds, 500 if it fails. - */ - @RequestMapping(value = { HEALTH_CHECK_PATH }, method = RequestMethod.GET, produces = "application/json") - public HealthStatus healthCheck(HttpServletRequest request) { - logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DashboardRestrictedBaseController.APP_NAME); - logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI()); - HealthStatus healthStatus = null; - try { - logger.debug(EELFLoggerDelegate.debugLogger, "Performing health check"); - @SuppressWarnings("unchecked") - // Get the single app. - List<App> list = dataAccessService.getList(App.class, null); - if (!list.isEmpty()) - healthStatus = new HealthStatus(200, SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME) + " health check succeeded"); - else - healthStatus = new HealthStatus(500, SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME) + " health check failed to run db query"); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex); - healthStatus = new HealthStatus(500, "health check failed: " + ex.toString()); - } - return healthStatus; - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.controller;
+
+import java.util.List;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.onap.ccsdk.dashboard.model.HealthStatus;
+import org.onap.portalsdk.core.controller.UnRestrictedBaseController;
+import org.onap.portalsdk.core.domain.App;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.EnableAspectJAutoProxy;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * This controller responds to probes for application health, returning a JSON
+ * body to indicate current status.
+ */
+@RestController
+@Configuration
+@EnableAspectJAutoProxy
+@RequestMapping("/")
+public class HealthCheckController extends UnRestrictedBaseController {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(HealthCheckController.class);
+
+ private static final String HEALTH_CHECK_PATH = "/healthCheck";
+
+ @Autowired
+ private DataAccessService dataAccessService;
+
+ /**
+ * Checks application health by making a trivial query to (what??).
+ *
+ * @param request
+ * HttpServletRequest
+ * @return 200 if database access succeeds, 500 if it fails.
+ */
+ @RequestMapping(value = { HEALTH_CHECK_PATH }, method = RequestMethod.GET, produces = "application/json")
+ public HealthStatus healthCheck(HttpServletRequest request) {
+ logger.setRequestBasedDefaultsIntoGlobalLoggingContext(request, DashboardRestrictedBaseController.APP_NAME);
+ logger.info(EELFLoggerDelegate.auditLogger, request.getMethod() + request.getRequestURI());
+ HealthStatus healthStatus = null;
+ try {
+ logger.debug(EELFLoggerDelegate.debugLogger, "Performing health check");
+ @SuppressWarnings("unchecked")
+ // Get the single app.
+ List<App> list = dataAccessService.getList(App.class, null);
+ if (!list.isEmpty())
+ healthStatus = new HealthStatus(200, SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME) + " health check succeeded");
+ else
+ healthStatus = new HealthStatus(500, SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME) + " health check failed to run db query");
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex);
+ healthStatus = new HealthStatus(500, "health check failed: " + ex.toString());
+ }
+ return healthStatus;
+ }
+
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/domain/ControllerEndpoint.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/domain/ControllerEndpoint.java index 1e74611..397f2ed 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/domain/ControllerEndpoint.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/domain/ControllerEndpoint.java @@ -1,71 +1,71 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.domain; - -import org.openecomp.portalsdk.core.domain.support.DomainVo; - -/** - * Model for controller endpoint information stored in database. A single row - * for a user represents a selected endpoint. - */ -public class ControllerEndpoint extends DomainVo { - - private static final long serialVersionUID = 8785223545128054402L; - - private long userId; - private String name; - private String url; - - public ControllerEndpoint() { - } - - public ControllerEndpoint(long userId, String name, String url) { - this.userId = userId; - this.name = name; - this.url = url; - } - - public long getUserId() { - return userId; - } - - public void setUserId(long userId) { - this.userId = userId; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public String getUrl() { - return url; - } - - public void setUrl(String url) { - this.url = url; - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.domain;
+
+import org.onap.portalsdk.core.domain.support.DomainVo;
+
+/**
+ * Model for controller endpoint information stored in database. A single row
+ * for a user represents a selected endpoint.
+ */
+public class ControllerEndpoint extends DomainVo {
+
+ private static final long serialVersionUID = 8785223545128054402L;
+
+ private long userId;
+ private String name;
+ private String url;
+
+ public ControllerEndpoint() {
+ }
+
+ public ControllerEndpoint(long userId, String name, String url) {
+ this.userId = userId;
+ this.name = name;
+ this.url = url;
+ }
+
+ public long getUserId() {
+ return userId;
+ }
+
+ public void setUserId(long userId) {
+ this.userId = userId;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/model/ControllerEndpointCredentials.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/model/ControllerEndpointCredentials.java index 02c892f..7af9e49 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/model/ControllerEndpointCredentials.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/model/ControllerEndpointCredentials.java @@ -1,116 +1,116 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.model; - -import org.onap.ccsdk.dashboard.exception.DashboardControllerException; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.onboarding.util.CipherUtil; - -/** - * Model with Controller username and password for use only within the back end; - * never serialized as JSON. - */ -public class ControllerEndpointCredentials extends ControllerEndpointTransport { - - private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ControllerEndpointCredentials.class); - - public String username; - public String password; - public boolean isEncryptedPass; - - public ControllerEndpointCredentials(boolean selected, String name, String url, String username, String password, - boolean isEncryptedPass) { - super(selected, name, url); - this.username = username; - this.password = password; - this.isEncryptedPass = isEncryptedPass; - } - - public String getUsername() { - return username; - } - - public void setUsername(String username) { - this.username = username; - } - - public String getPassword() { - return password; - } - - public void setPassword(String password) { - this.password = password; - } - - public boolean getEncryptedPassword() { - return isEncryptedPass; - } - - public void setEncryptedPassword(boolean isEncryptedPass) { - this.isEncryptedPass = isEncryptedPass; - } - - /** - * Convenience method to yield a ControllerEndpointTransport object. - * - * @return ControllerEndpoint with copy of the non-privileged data - */ - public ControllerEndpointTransport toControllerEndpointTransport() { - return new ControllerEndpointTransport(getSelected(), getName(), getUrl()); - } - - /** - * Accepts clear text and stores an encrypted value; as a side effect, sets the - * encrypted flag to true. - * - * @param plainText - * Clear-text password - * @throws DashboardControllerException - * If encryption fails - */ - public void encryptPassword(final String plainText) throws DashboardControllerException { - try { - this.password = CipherUtil.encrypt(plainText); - this.isEncryptedPass = true; - } catch (Exception ex) { - logger.error("encryptPassword failed", ex); - throw new DashboardControllerException(ex); - } - } - - /** - * Client should call this method if {@link #getEncryptedPassword()} returns - * true. - * - * @return Clear-text password. - * @throws DashboardControllerException - * If decryption fails - */ - public String decryptPassword() throws DashboardControllerException { - try { - return CipherUtil.decrypt(password); - } catch (Exception ex) { - logger.error("decryptPassword failed", ex); - throw new DashboardControllerException(ex); - } - } +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.model;
+
+import org.onap.ccsdk.dashboard.exception.DashboardControllerException;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.onboarding.util.CipherUtil;
+
+/**
+ * Model with Controller username and password for use only within the back end;
+ * never serialized as JSON.
+ */
+public class ControllerEndpointCredentials extends ControllerEndpointTransport {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ControllerEndpointCredentials.class);
+
+ public String username;
+ public String password;
+ public boolean isEncryptedPass;
+
+ public ControllerEndpointCredentials(boolean selected, String name, String url, String username, String password,
+ boolean isEncryptedPass) {
+ super(selected, name, url);
+ this.username = username;
+ this.password = password;
+ this.isEncryptedPass = isEncryptedPass;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public boolean getEncryptedPassword() {
+ return isEncryptedPass;
+ }
+
+ public void setEncryptedPassword(boolean isEncryptedPass) {
+ this.isEncryptedPass = isEncryptedPass;
+ }
+
+ /**
+ * Convenience method to yield a ControllerEndpointTransport object.
+ *
+ * @return ControllerEndpoint with copy of the non-privileged data
+ */
+ public ControllerEndpointTransport toControllerEndpointTransport() {
+ return new ControllerEndpointTransport(getSelected(), getName(), getUrl());
+ }
+
+ /**
+ * Accepts clear text and stores an encrypted value; as a side effect, sets the
+ * encrypted flag to true.
+ *
+ * @param plainText
+ * Clear-text password
+ * @throws DashboardControllerException
+ * If encryption fails
+ */
+ public void encryptPassword(final String plainText) throws DashboardControllerException {
+ try {
+ this.password = CipherUtil.encrypt(plainText);
+ this.isEncryptedPass = true;
+ } catch (Exception ex) {
+ logger.error("encryptPassword failed", ex);
+ throw new DashboardControllerException(ex);
+ }
+ }
+
+ /**
+ * Client should call this method if {@link #getEncryptedPassword()} returns
+ * true.
+ *
+ * @return Clear-text password.
+ * @throws DashboardControllerException
+ * If decryption fails
+ */
+ public String decryptPassword() throws DashboardControllerException {
+ try {
+ return CipherUtil.decrypt(password);
+ } catch (Exception ex) {
+ logger.error("decryptPassword failed", ex);
+ throw new DashboardControllerException(ex);
+ }
+ }
}
\ No newline at end of file diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientImpl.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientImpl.java index bb79c9f..2e28ad2 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientImpl.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientImpl.java @@ -1,412 +1,412 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.rest; - -import java.net.MalformedURLException; -import java.net.URI; -import java.net.URL; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - -import org.apache.http.HttpHost; -import org.apache.http.auth.AuthScope; -import org.apache.http.auth.UsernamePasswordCredentials; -import org.apache.http.client.CredentialsProvider; -import org.apache.http.impl.client.BasicCredentialsProvider; -import org.apache.http.impl.client.CloseableHttpClient; -import org.apache.http.impl.client.HttpClientBuilder; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprintContent; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprintList; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprintUpload; -import org.onap.ccsdk.dashboard.model.CloudifyDeploymentList; -import org.onap.ccsdk.dashboard.model.CloudifyDeploymentRequest; -import org.onap.ccsdk.dashboard.model.CloudifyExecution; -import org.onap.ccsdk.dashboard.model.CloudifyExecutionList; -import org.onap.ccsdk.dashboard.model.CloudifyExecutionRequest; -import org.onap.ccsdk.dashboard.model.ConsulDatacenter; -import org.onap.ccsdk.dashboard.model.ConsulHealthServiceRegistration; -import org.onap.ccsdk.dashboard.model.ConsulNodeInfo; -import org.onap.ccsdk.dashboard.model.ConsulServiceHealth; -import org.onap.ccsdk.dashboard.model.ConsulServiceHealthHistory; -import org.onap.ccsdk.dashboard.model.ConsulServiceInfo; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.HttpMethod; -import org.springframework.http.ResponseEntity; -import org.springframework.web.client.RestTemplate; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Provides methods for accessing the ECOMP Controller API via REST. Most - * methods are just simple proxies. Only the methods that fetch one page of data - * have to do any real work. - * - * Implemented using Spring RestTemplate. Supports basic HTTP authentication. - * - */ -public class ControllerRestClientImpl implements IControllerRestClient { - - private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ControllerRestClientImpl.class); - private static final String DEPLOYMENT_ID = "deployment_id"; - - private final String baseUrl; - private final RestTemplate restTemplate; - private final ObjectMapper objectMapper = new ObjectMapper(); - - /** - * Builds a restTemplate. If username and password are supplied, uses basic - * HTTP authentication. - * - * @param webapiUrl - * URL of the web endpoint - * @param user - * user name; ignored if null - * @param pass - * password - */ - public ControllerRestClientImpl(String webapiUrl, String user, String pass) { - if (webapiUrl == null) - throw new IllegalArgumentException("Null URL not permitted"); - - URL url = null; - try { - url = new URL(webapiUrl); - baseUrl = url.toExternalForm(); - } catch (MalformedURLException ex) { - throw new RuntimeException("Failed to parse URL", ex); - } - final HttpHost httpHost = new HttpHost(url.getHost(), url.getPort()); - - // Build a client with a credentials provider - CloseableHttpClient httpClient = null; - if (user != null && pass != null) { - CredentialsProvider credsProvider = new BasicCredentialsProvider(); - credsProvider.setCredentials(new AuthScope(httpHost), new UsernamePasswordCredentials(user, pass)); - httpClient = HttpClientBuilder.create().setDefaultCredentialsProvider(credsProvider).build(); - } else { - httpClient = HttpClientBuilder.create().build(); - } - // Create request factory - HttpComponentsClientHttpRequestFactoryBasicAuth requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth( - httpHost); - requestFactory.setHttpClient(httpClient); - - // Put the factory in the template - this.restTemplate = new RestTemplate(); - restTemplate.setRequestFactory(requestFactory); - } - - /** - * Builds URL ensuring appropriate separators. The base comes from - * properties file so could have many problems. - * - * @param base - * @param suffix - * @param queryParams - * key-value pairs; i.e. must have an even number of entries. - * Ignored if null. - * @return - */ - private String buildUrl(final String[] path, final String[] queryParams) { - StringBuilder sb = new StringBuilder(path[0]); - for (int p = 1; p < path.length; ++p) { - if (!path[p - 1].endsWith("/") && !path[p].startsWith("/")) - sb.append('/'); - sb.append(path[p]); - } - if (queryParams != null && queryParams.length > 0) { - sb.append('?'); - int i = 0; - while (i < queryParams.length) { - if (i > 0) - sb.append('&'); - sb.append(queryParams[i]); - sb.append('='); - sb.append(queryParams[i + 1]); - i += 2; - } - } - return sb.toString(); - } - - @Override - public CloudifyBlueprintList getBlueprints() { - String url = buildUrl(new String[] { baseUrl, blueprintsPath }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "getBlueprints: url {}", url); - ResponseEntity<CloudifyBlueprintList> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<CloudifyBlueprintList>() { - }); - return response.getBody(); - } - - @Override - public CloudifyBlueprintList getBlueprint(final String id) { - String url = buildUrl(new String[] { baseUrl, blueprintsPath }, new String[] { "id", id }); - logger.debug(EELFLoggerDelegate.debugLogger, "getBlueprint: url {}", url); - ResponseEntity<CloudifyBlueprintList> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<CloudifyBlueprintList>() { - }); - return response.getBody(); - } - - @Override - public CloudifyBlueprintContent viewBlueprint(final String id) { - String url = buildUrl(new String[] { baseUrl, viewBlueprintsPath }, new String[] { "id", id }); - logger.debug(EELFLoggerDelegate.debugLogger, "viewBlueprint: url {}", url); - ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, String.class); - String yaml = response.getBody(); - return new CloudifyBlueprintContent(id, yaml); - } - - @Override - public CloudifyBlueprintList uploadBlueprint(CloudifyBlueprintUpload blueprint) { - String url = buildUrl(new String[] { baseUrl, blueprintsPath }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "uploadBlueprint: url {}", url); - return restTemplate.postForObject(url, blueprint, CloudifyBlueprintList.class); - } - - @Override - public int deleteBlueprint(final String id) { - String url = buildUrl(new String[] { baseUrl, blueprintsPath, id }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "deleteBlueprint: url {}", url); - ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, null, - new ParameterizedTypeReference<String>() { - }); - return response.getStatusCode().value(); - } - - @Override - public CloudifyDeploymentList getDeployments() { - String url = buildUrl(new String[] { baseUrl, deploymentsPath }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "getDeployments: url {}", url); - ResponseEntity<CloudifyDeploymentList> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<CloudifyDeploymentList>() { - }); - return response.getBody(); - } - - @Override - public CloudifyDeploymentList getDeployment(final String id) { - String url = buildUrl(new String[] { baseUrl, deploymentsPath }, new String[] { "id", id }); - logger.debug(EELFLoggerDelegate.debugLogger, "getDeployment: url {}", url); - ResponseEntity<CloudifyDeploymentList> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<CloudifyDeploymentList>() { - }); - return response.getBody(); - } - - @Override - public CloudifyDeploymentList createDeployment(CloudifyDeploymentRequest deployment) { - String url = buildUrl(new String[] { baseUrl, deploymentsPath }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "createDeployment: url {}", url); - return restTemplate.postForObject(url, deployment, CloudifyDeploymentList.class); - } - - @Override - public int deleteDeployment(final String id, boolean ignoreLiveNodes) { - String url = buildUrl(new String[] { baseUrl, deploymentsPath, id }, - new String[] { "ignore_live_nodes", Boolean.toString(ignoreLiveNodes) }); - logger.debug(EELFLoggerDelegate.debugLogger, "deleteDeployment: url {}", url); - ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, null, - new ParameterizedTypeReference<String>() { - }); - return response.getStatusCode().value(); - } - - @Override - public CloudifyExecutionList getExecutions(final String deploymentId) { - String url = buildUrl(new String[]{baseUrl, executionsPath}, new String[]{DEPLOYMENT_ID, deploymentId}); - logger.debug(EELFLoggerDelegate.debugLogger, "getExecutions: url {}", url); - ResponseEntity<CloudifyExecutionList> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<CloudifyExecutionList>() { - }); - return response.getBody(); - } - - @Override - public CloudifyExecutionList getExecution(String executionId, String deploymentId) { - String url = buildUrl(new String[] { baseUrl, executionsPath, executionId }, - new String[]{DEPLOYMENT_ID, deploymentId}); - logger.debug(EELFLoggerDelegate.debugLogger, "getExecution: url {}", url); - ResponseEntity<CloudifyExecutionList> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<CloudifyExecutionList>() { - }); - return response.getBody(); - } - - @Override - public CloudifyExecution startExecution(CloudifyExecutionRequest execution) { - String url = buildUrl(new String[] { baseUrl, executionsPath }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "startExecution: url {}", url); - return restTemplate.postForObject(url, execution, CloudifyExecution.class); - } - - @Override - public int cancelExecution(final String executionId, final String deploymentId, final String action) { - String url = buildUrl(new String[] { baseUrl, executionsPath, executionId }, - new String[]{DEPLOYMENT_ID, deploymentId, "action", action}); - logger.debug(EELFLoggerDelegate.debugLogger, "deleteExecution: url {}", url); - ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, null, - new ParameterizedTypeReference<String>() { - }); - return response.getStatusCode().value(); - } - - @Override - public URI registerService(ConsulHealthServiceRegistration registration) { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "register" }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "registerService: url {}", url); - return restTemplate.postForLocation(url, registration); - } - - @Override - public int deregisterService(String serviceName) { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "deregister" , serviceName}, null); - logger.debug(EELFLoggerDelegate.debugLogger, "deregisterService: url {}", url); - ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, null, - new ParameterizedTypeReference<String>() { - }); - return response.getStatusCode().value(); - } - - /** - * Translates the awkward map of String-to-List of IP into a list of - * ConsulServiceInfo objects - */ - @SuppressWarnings("unchecked") - @Override - public List<ConsulServiceInfo> getServices() { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "services" }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "getServicesHealth: url {}", url); - ResponseEntity<Map<String, Object>> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<Map<String, Object>>() { - }); - Map<String, Object> serviceInfo = response.getBody(); - List<ConsulServiceInfo> list = new ArrayList<>(); - for (Map.Entry<String, Object> entry : serviceInfo.entrySet()) { - // Be defensive - List<String> addrs; - if (entry.getValue() instanceof List<?>) - addrs = (List<String>) entry.getValue(); - else - addrs = new ArrayList<>(); - list.add(new ConsulServiceInfo(entry.getKey(), addrs)); - } - return list; - } - - @Override - public List<ConsulServiceHealth> getServiceHealth(String serviceName) { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "services", serviceName }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealth: url {}", url); - ResponseEntity<List<ConsulServiceHealth>> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<List<ConsulServiceHealth>>() { - }); - return response.getBody(); - } - - @Override - public List<ConsulServiceHealthHistory> getServiceHealthHistory(String serviceName, Instant start, - Instant end) { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "svchist", serviceName }, - new String[] { "start", start.toString(), "end", end.toString() }); - logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealthHistory: url {}", url); - // Hack around an odd interface that returns non-JSON on error: - // "No health Data found for the selected dates or service" - ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<String>() { }); - if (response.getBody().startsWith("No health")) - throw new RuntimeException(response.getBody()); - List<ConsulServiceHealthHistory> result = null; - try { - TypeReference<List<ConsulServiceHealthHistory>> typeRef = new TypeReference<List<ConsulServiceHealthHistory>>() { }; - result = objectMapper.readValue(response.getBody(), typeRef); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "getServiceHealthHistory failed to parse response body", ex); - } - return result; - } - - @Override - public List<ConsulNodeInfo> getNodes() { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "nodes" }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "getNodesHealth: url {}", url); - ResponseEntity<List<ConsulNodeInfo>> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<List<ConsulNodeInfo>>() { - }); - return response.getBody(); - } - - @Override - public List<ConsulServiceHealth> getNodeServicesHealth(String nodeId) { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "nodes", nodeId }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "getNodeServicesHealth: url {}", url); - ResponseEntity<List<ConsulServiceHealth>> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<List<ConsulServiceHealth>>() { - }); - return response.getBody(); - } - - @Override - public List<ConsulDatacenter> getDatacenters() { - String url = buildUrl(new String[] { baseUrl, healthServicesPath, "datacenters" }, null); - logger.debug(EELFLoggerDelegate.debugLogger, "getDatacentersHealth: url {}", url); - ResponseEntity<List<String>> response = restTemplate.exchange(url, HttpMethod.GET, null, - new ParameterizedTypeReference<List<String>>() { - }); - List<String> list = response.getBody(); - List<ConsulDatacenter> result = new ArrayList<>(); - for (String dc : list) - result.add(new ConsulDatacenter(dc)); - return result; - } - - /** - * Simple test - * - * @param args - * blueprint ID - * @throws IllegalArgumentException - * On bad arguments - */ - public static void main(String[] args) throws IllegalArgumentException { - if (args.length != 1) - throw new IllegalArgumentException("Single argument expected: blueprint-id"); - ControllerRestClientImpl client = new ControllerRestClientImpl("http://localhost:8081/controller", "dbus_user", - "dbus_pass"); - final String id = args[0]; - logger.info("Requesting blueprint for " + id); - CloudifyBlueprintList list = client.getBlueprint(id); - if (list == null) - logger.error("Received null"); - else - for (int i = 0; i < list.items.size(); ++i) { - logger.info("Blueprint " + Integer.toString(i)); - logger.info(list.items.get(i).toString()); - } - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.rest;
+
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URL;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.http.HttpHost;
+import org.apache.http.auth.AuthScope;
+import org.apache.http.auth.UsernamePasswordCredentials;
+import org.apache.http.client.CredentialsProvider;
+import org.apache.http.impl.client.BasicCredentialsProvider;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClientBuilder;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprintContent;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprintList;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprintUpload;
+import org.onap.ccsdk.dashboard.model.CloudifyDeploymentList;
+import org.onap.ccsdk.dashboard.model.CloudifyDeploymentRequest;
+import org.onap.ccsdk.dashboard.model.CloudifyExecution;
+import org.onap.ccsdk.dashboard.model.CloudifyExecutionList;
+import org.onap.ccsdk.dashboard.model.CloudifyExecutionRequest;
+import org.onap.ccsdk.dashboard.model.ConsulDatacenter;
+import org.onap.ccsdk.dashboard.model.ConsulHealthServiceRegistration;
+import org.onap.ccsdk.dashboard.model.ConsulNodeInfo;
+import org.onap.ccsdk.dashboard.model.ConsulServiceHealth;
+import org.onap.ccsdk.dashboard.model.ConsulServiceHealthHistory;
+import org.onap.ccsdk.dashboard.model.ConsulServiceInfo;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.core.ParameterizedTypeReference;
+import org.springframework.http.HttpMethod;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.client.RestTemplate;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Provides methods for accessing the ECOMP Controller API via REST. Most
+ * methods are just simple proxies. Only the methods that fetch one page of data
+ * have to do any real work.
+ *
+ * Implemented using Spring RestTemplate. Supports basic HTTP authentication.
+ *
+ */
+public class ControllerRestClientImpl implements IControllerRestClient {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ControllerRestClientImpl.class);
+ private static final String DEPLOYMENT_ID = "deployment_id";
+
+ private final String baseUrl;
+ private final RestTemplate restTemplate;
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * Builds a restTemplate. If username and password are supplied, uses basic
+ * HTTP authentication.
+ *
+ * @param webapiUrl
+ * URL of the web endpoint
+ * @param user
+ * user name; ignored if null
+ * @param pass
+ * password
+ */
+ public ControllerRestClientImpl(String webapiUrl, String user, String pass) {
+ if (webapiUrl == null)
+ throw new IllegalArgumentException("Null URL not permitted");
+
+ URL url = null;
+ try {
+ url = new URL(webapiUrl);
+ baseUrl = url.toExternalForm();
+ } catch (MalformedURLException ex) {
+ throw new RuntimeException("Failed to parse URL", ex);
+ }
+ final HttpHost httpHost = new HttpHost(url.getHost(), url.getPort());
+
+ // Build a client with a credentials provider
+ CloseableHttpClient httpClient = null;
+ if (user != null && pass != null) {
+ CredentialsProvider credsProvider = new BasicCredentialsProvider();
+ credsProvider.setCredentials(new AuthScope(httpHost), new UsernamePasswordCredentials(user, pass));
+ httpClient = HttpClientBuilder.create().setDefaultCredentialsProvider(credsProvider).build();
+ } else {
+ httpClient = HttpClientBuilder.create().build();
+ }
+ // Create request factory
+ HttpComponentsClientHttpRequestFactoryBasicAuth requestFactory = new HttpComponentsClientHttpRequestFactoryBasicAuth(
+ httpHost);
+ requestFactory.setHttpClient(httpClient);
+
+ // Put the factory in the template
+ this.restTemplate = new RestTemplate();
+ restTemplate.setRequestFactory(requestFactory);
+ }
+
+ /**
+ * Builds URL ensuring appropriate separators. The base comes from
+ * properties file so could have many problems.
+ *
+ * @param base
+ * @param suffix
+ * @param queryParams
+ * key-value pairs; i.e. must have an even number of entries.
+ * Ignored if null.
+ * @return
+ */
+ private String buildUrl(final String[] path, final String[] queryParams) {
+ StringBuilder sb = new StringBuilder(path[0]);
+ for (int p = 1; p < path.length; ++p) {
+ if (!path[p - 1].endsWith("/") && !path[p].startsWith("/"))
+ sb.append('/');
+ sb.append(path[p]);
+ }
+ if (queryParams != null && queryParams.length > 0) {
+ sb.append('?');
+ int i = 0;
+ while (i < queryParams.length) {
+ if (i > 0)
+ sb.append('&');
+ sb.append(queryParams[i]);
+ sb.append('=');
+ sb.append(queryParams[i + 1]);
+ i += 2;
+ }
+ }
+ return sb.toString();
+ }
+
+ @Override
+ public CloudifyBlueprintList getBlueprints() {
+ String url = buildUrl(new String[] { baseUrl, blueprintsPath }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getBlueprints: url {}", url);
+ ResponseEntity<CloudifyBlueprintList> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<CloudifyBlueprintList>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public CloudifyBlueprintList getBlueprint(final String id) {
+ String url = buildUrl(new String[] { baseUrl, blueprintsPath }, new String[] { "id", id });
+ logger.debug(EELFLoggerDelegate.debugLogger, "getBlueprint: url {}", url);
+ ResponseEntity<CloudifyBlueprintList> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<CloudifyBlueprintList>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public CloudifyBlueprintContent viewBlueprint(final String id) {
+ String url = buildUrl(new String[] { baseUrl, viewBlueprintsPath }, new String[] { "id", id });
+ logger.debug(EELFLoggerDelegate.debugLogger, "viewBlueprint: url {}", url);
+ ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null, String.class);
+ String yaml = response.getBody();
+ return new CloudifyBlueprintContent(id, yaml);
+ }
+
+ @Override
+ public CloudifyBlueprintList uploadBlueprint(CloudifyBlueprintUpload blueprint) {
+ String url = buildUrl(new String[] { baseUrl, blueprintsPath }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "uploadBlueprint: url {}", url);
+ return restTemplate.postForObject(url, blueprint, CloudifyBlueprintList.class);
+ }
+
+ @Override
+ public int deleteBlueprint(final String id) {
+ String url = buildUrl(new String[] { baseUrl, blueprintsPath, id }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "deleteBlueprint: url {}", url);
+ ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, null,
+ new ParameterizedTypeReference<String>() {
+ });
+ return response.getStatusCode().value();
+ }
+
+ @Override
+ public CloudifyDeploymentList getDeployments() {
+ String url = buildUrl(new String[] { baseUrl, deploymentsPath }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getDeployments: url {}", url);
+ ResponseEntity<CloudifyDeploymentList> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<CloudifyDeploymentList>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public CloudifyDeploymentList getDeployment(final String id) {
+ String url = buildUrl(new String[] { baseUrl, deploymentsPath }, new String[] { "id", id });
+ logger.debug(EELFLoggerDelegate.debugLogger, "getDeployment: url {}", url);
+ ResponseEntity<CloudifyDeploymentList> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<CloudifyDeploymentList>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public CloudifyDeploymentList createDeployment(CloudifyDeploymentRequest deployment) {
+ String url = buildUrl(new String[] { baseUrl, deploymentsPath }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "createDeployment: url {}", url);
+ return restTemplate.postForObject(url, deployment, CloudifyDeploymentList.class);
+ }
+
+ @Override
+ public int deleteDeployment(final String id, boolean ignoreLiveNodes) {
+ String url = buildUrl(new String[] { baseUrl, deploymentsPath, id },
+ new String[] { "ignore_live_nodes", Boolean.toString(ignoreLiveNodes) });
+ logger.debug(EELFLoggerDelegate.debugLogger, "deleteDeployment: url {}", url);
+ ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, null,
+ new ParameterizedTypeReference<String>() {
+ });
+ return response.getStatusCode().value();
+ }
+
+ @Override
+ public CloudifyExecutionList getExecutions(final String deploymentId) {
+ String url = buildUrl(new String[]{baseUrl, executionsPath}, new String[]{DEPLOYMENT_ID, deploymentId});
+ logger.debug(EELFLoggerDelegate.debugLogger, "getExecutions: url {}", url);
+ ResponseEntity<CloudifyExecutionList> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<CloudifyExecutionList>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public CloudifyExecutionList getExecution(String executionId, String deploymentId) {
+ String url = buildUrl(new String[] { baseUrl, executionsPath, executionId },
+ new String[]{DEPLOYMENT_ID, deploymentId});
+ logger.debug(EELFLoggerDelegate.debugLogger, "getExecution: url {}", url);
+ ResponseEntity<CloudifyExecutionList> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<CloudifyExecutionList>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public CloudifyExecution startExecution(CloudifyExecutionRequest execution) {
+ String url = buildUrl(new String[] { baseUrl, executionsPath }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "startExecution: url {}", url);
+ return restTemplate.postForObject(url, execution, CloudifyExecution.class);
+ }
+
+ @Override
+ public int cancelExecution(final String executionId, final String deploymentId, final String action) {
+ String url = buildUrl(new String[] { baseUrl, executionsPath, executionId },
+ new String[]{DEPLOYMENT_ID, deploymentId, "action", action});
+ logger.debug(EELFLoggerDelegate.debugLogger, "deleteExecution: url {}", url);
+ ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.DELETE, null,
+ new ParameterizedTypeReference<String>() {
+ });
+ return response.getStatusCode().value();
+ }
+
+ @Override
+ public URI registerService(ConsulHealthServiceRegistration registration) {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "register" }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "registerService: url {}", url);
+ return restTemplate.postForLocation(url, registration);
+ }
+
+ @Override
+ public int deregisterService(String serviceName) {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "deregister" , serviceName}, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "deregisterService: url {}", url);
+ ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, null,
+ new ParameterizedTypeReference<String>() {
+ });
+ return response.getStatusCode().value();
+ }
+
+ /**
+ * Translates the awkward map of String-to-List of IP into a list of
+ * ConsulServiceInfo objects
+ */
+ @SuppressWarnings("unchecked")
+ @Override
+ public List<ConsulServiceInfo> getServices() {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "services" }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getServicesHealth: url {}", url);
+ ResponseEntity<Map<String, Object>> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<Map<String, Object>>() {
+ });
+ Map<String, Object> serviceInfo = response.getBody();
+ List<ConsulServiceInfo> list = new ArrayList<>();
+ for (Map.Entry<String, Object> entry : serviceInfo.entrySet()) {
+ // Be defensive
+ List<String> addrs;
+ if (entry.getValue() instanceof List<?>)
+ addrs = (List<String>) entry.getValue();
+ else
+ addrs = new ArrayList<>();
+ list.add(new ConsulServiceInfo(entry.getKey(), addrs));
+ }
+ return list;
+ }
+
+ @Override
+ public List<ConsulServiceHealth> getServiceHealth(String serviceName) {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "services", serviceName }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealth: url {}", url);
+ ResponseEntity<List<ConsulServiceHealth>> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<List<ConsulServiceHealth>>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public List<ConsulServiceHealthHistory> getServiceHealthHistory(String serviceName, Instant start,
+ Instant end) {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "svchist", serviceName },
+ new String[] { "start", start.toString(), "end", end.toString() });
+ logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealthHistory: url {}", url);
+ // Hack around an odd interface that returns non-JSON on error:
+ // "No health Data found for the selected dates or service"
+ ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<String>() { });
+ if (response.getBody().startsWith("No health"))
+ throw new RuntimeException(response.getBody());
+ List<ConsulServiceHealthHistory> result = null;
+ try {
+ TypeReference<List<ConsulServiceHealthHistory>> typeRef = new TypeReference<List<ConsulServiceHealthHistory>>() { };
+ result = objectMapper.readValue(response.getBody(), typeRef);
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getServiceHealthHistory failed to parse response body", ex);
+ }
+ return result;
+ }
+
+ @Override
+ public List<ConsulNodeInfo> getNodes() {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "nodes" }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getNodesHealth: url {}", url);
+ ResponseEntity<List<ConsulNodeInfo>> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<List<ConsulNodeInfo>>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public List<ConsulServiceHealth> getNodeServicesHealth(String nodeId) {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "nodes", nodeId }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getNodeServicesHealth: url {}", url);
+ ResponseEntity<List<ConsulServiceHealth>> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<List<ConsulServiceHealth>>() {
+ });
+ return response.getBody();
+ }
+
+ @Override
+ public List<ConsulDatacenter> getDatacenters() {
+ String url = buildUrl(new String[] { baseUrl, healthServicesPath, "datacenters" }, null);
+ logger.debug(EELFLoggerDelegate.debugLogger, "getDatacentersHealth: url {}", url);
+ ResponseEntity<List<String>> response = restTemplate.exchange(url, HttpMethod.GET, null,
+ new ParameterizedTypeReference<List<String>>() {
+ });
+ List<String> list = response.getBody();
+ List<ConsulDatacenter> result = new ArrayList<>();
+ for (String dc : list)
+ result.add(new ConsulDatacenter(dc));
+ return result;
+ }
+
+ /**
+ * Simple test
+ *
+ * @param args
+ * blueprint ID
+ * @throws IllegalArgumentException
+ * On bad arguments
+ */
+ public static void main(String[] args) throws IllegalArgumentException {
+ if (args.length != 1)
+ throw new IllegalArgumentException("Single argument expected: blueprint-id");
+ ControllerRestClientImpl client = new ControllerRestClientImpl("http://localhost:8081/controller", "dbus_user",
+ "dbus_pass");
+ final String id = args[0];
+ logger.info("Requesting blueprint for " + id);
+ CloudifyBlueprintList list = client.getBlueprint(id);
+ if (list == null)
+ logger.error("Received null");
+ else
+ for (int i = 0; i < list.items.size(); ++i) {
+ logger.info("Blueprint " + Integer.toString(i));
+ logger.info(list.items.get(i).toString());
+ }
+ }
+
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientMockImpl.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientMockImpl.java index 2523538..6b0f3d0 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientMockImpl.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/rest/ControllerRestClientMockImpl.java @@ -1,311 +1,311 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.rest; - -import java.io.InputStream; -import java.net.URI; -import java.time.Instant; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Scanner; - -import org.onap.ccsdk.dashboard.exception.DashboardControllerException; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprintContent; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprintList; -import org.onap.ccsdk.dashboard.model.CloudifyBlueprintUpload; -import org.onap.ccsdk.dashboard.model.CloudifyDeploymentList; -import org.onap.ccsdk.dashboard.model.CloudifyDeploymentRequest; -import org.onap.ccsdk.dashboard.model.CloudifyExecution; -import org.onap.ccsdk.dashboard.model.CloudifyExecutionList; -import org.onap.ccsdk.dashboard.model.CloudifyExecutionRequest; -import org.onap.ccsdk.dashboard.model.ConsulDatacenter; -import org.onap.ccsdk.dashboard.model.ConsulHealthServiceRegistration; -import org.onap.ccsdk.dashboard.model.ConsulNodeInfo; -import org.onap.ccsdk.dashboard.model.ConsulServiceHealth; -import org.onap.ccsdk.dashboard.model.ConsulServiceHealthHistory; -import org.onap.ccsdk.dashboard.model.ConsulServiceInfo; -import org.onap.ccsdk.dashboard.model.ECTransportModel; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; - -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; - -/** - * Provides mock implementations that return contents of files on the classpath. - */ -public class ControllerRestClientMockImpl implements IControllerRestClient { - - private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ControllerRestClientMockImpl.class); - - /** - * For mock outputs - */ - private final ObjectMapper objectMapper = new ObjectMapper(); - - /** - * No-arg constructor - */ - public ControllerRestClientMockImpl() { - } - - private String getMockDataContent(final String path) { - String result = null; - try { - InputStream is = getClass().getResourceAsStream(path); - if (is == null) - throw new DashboardControllerException("Failed to find resource at path " + path); - Scanner scanner = new Scanner(is, "UTF-8"); - result = scanner.useDelimiter("\\A").next(); - scanner.close(); - is.close(); - } catch (Exception ex) { - logger.error("getMockDataContent failed", ex); - throw new RuntimeException(ex); - } - return result; - } - - /** - * Creates an input stream using the specified path and requests the mapper - * create an object of the specified type. - * - * @param modelClass - * Model class - * @param path - * Path to classpath resource - * @return Instance of modelClass - */ - private ECTransportModel getMockData(final Class<? extends ECTransportModel> modelClass, final String path) { - ECTransportModel result; - String json = getMockDataContent(path); - try { - result = objectMapper.readValue(json, modelClass); - } catch (Exception ex) { - logger.error("getMockData failed", ex); - throw new RuntimeException(ex); - } - return result; - } - - @Override - public CloudifyBlueprintList getBlueprints() { - return (CloudifyBlueprintList) getMockData(CloudifyBlueprintList.class, "/blueprintList.json"); - } - - @Override - public CloudifyBlueprintList getBlueprint(final String id) { - return (CloudifyBlueprintList) getMockData(CloudifyBlueprintList.class, "/blueprintByID.json"); - } - - @Override - public CloudifyBlueprintContent viewBlueprint(final String id) { - String yaml = getMockDataContent("/blueprintContent.yaml"); - return new CloudifyBlueprintContent(id, yaml); - } - - @Override - public CloudifyBlueprintList uploadBlueprint(CloudifyBlueprintUpload blueprint) { - logger.debug(EELFLoggerDelegate.debugLogger, "uploadBlueprint: {}", blueprint.toString()); - return new CloudifyBlueprintList(null, null); - } - - @Override - public int deleteBlueprint(final String id) { - logger.debug(EELFLoggerDelegate.debugLogger, "deleteBlueprint: {}", id); - return 204; - } - - @Override - public CloudifyDeploymentList getDeployments() { - return (CloudifyDeploymentList) getMockData(CloudifyDeploymentList.class, "/deploymentList.json"); - } - - @Override - public CloudifyDeploymentList getDeployment(final String id) { - return (CloudifyDeploymentList) getMockData(CloudifyDeploymentList.class, "/deploymentByID.json"); - } - - public CloudifyDeploymentList createDeployment(CloudifyDeploymentRequest deployment) { - logger.debug(EELFLoggerDelegate.debugLogger, "createDeployment: {}", deployment.toString()); - return new CloudifyDeploymentList(null, null); - } - - @Override - public int deleteDeployment(final String id, boolean ignoreLiveNodes) { - logger.debug(EELFLoggerDelegate.debugLogger, "deleteDeployment: id {}, ignoreLiveNodes", id, ignoreLiveNodes); - return 204; - } - - @Override - public CloudifyExecutionList getExecutions(final String deploymentId) { - return (CloudifyExecutionList) getMockData(CloudifyExecutionList.class, "/listExecutionForDeploymentID.json"); - } - - @Override - public CloudifyExecutionList getExecution(String executionId, String deploymentId) { - return (CloudifyExecutionList) getMockData(CloudifyExecutionList.class, "/listExecutionForDeploymentID.json"); - } - - @Override - public CloudifyExecution startExecution(CloudifyExecutionRequest execution) { - logger.debug(EELFLoggerDelegate.debugLogger, "startExecution: {}", execution.toString()); - return new CloudifyExecution(null, null, null, null, null, null, null, null, null); - } - - @Override - public int cancelExecution(String executionId, String deploymentId, String action) { - logger.debug(EELFLoggerDelegate.debugLogger, "deleteExecution: executionId {}, deploymentId {}, action {}", - executionId, deploymentId, action); - return 204; - } - - @Override - public URI registerService(ConsulHealthServiceRegistration registration) { - logger.debug(EELFLoggerDelegate.debugLogger, "registerService: {}", registration); - return null; - } - - @Override - public int deregisterService(String serviceName) { - logger.debug(EELFLoggerDelegate.debugLogger, "deregisterService: {}", serviceName); - return 200; - } - - @Override - public List<ConsulServiceHealth> getServiceHealth(String serviceName) { - logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealth: serviceName={}", serviceName); - String json = getMockDataContent("/serviceHealth.json"); - TypeReference<List<ConsulServiceHealth>> typeRef = new TypeReference<List<ConsulServiceHealth>>() { - }; - List<ConsulServiceHealth> result = null; - try { - result = objectMapper.readValue(json, typeRef); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "getServiceHealth failed", ex); - } - return result; - } - - @Override - public List<ConsulServiceHealthHistory> getServiceHealthHistory(String serviceName, Instant start, Instant end) { - logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealthHistory: serviceName={}", serviceName); - String json = getMockDataContent("/serviceHealthHistory.json"); - TypeReference<List<ConsulServiceHealthHistory>> typeRef = new TypeReference<List<ConsulServiceHealthHistory>>() { - }; - List<ConsulServiceHealthHistory> result = null; - try { - result = objectMapper.readValue(json, typeRef); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "getServiceHealthHistory failed", ex); - } - return result; - } - - @Override - public List<ConsulServiceHealth> getNodeServicesHealth(String nodeId) { - logger.debug(EELFLoggerDelegate.debugLogger, "getNodeServicesHealth: nodeId={}", nodeId); - String json = getMockDataContent("/nodeServicesHealth.json"); - TypeReference<List<ConsulServiceHealth>> typeRef = new TypeReference<List<ConsulServiceHealth>>() { - }; - List<ConsulServiceHealth> result = null; - try { - result = objectMapper.readValue(json, typeRef); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "getNodeServicesHealth failed", ex); - } - return result; - } - - @Override - public List<ConsulServiceInfo> getServices() { - logger.debug(EELFLoggerDelegate.debugLogger, "getServices"); - String json = getMockDataContent("/services.json"); - TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() { - }; - HashMap<String, Object> map = null; - try { - map = objectMapper.readValue(json, typeRef); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "getNode failed", ex); - } - ArrayList<ConsulServiceInfo> result = new ArrayList<>(); - if (map != null) { - for (Map.Entry<String, Object> entry : map.entrySet()) { - final String service = entry.getKey(); - @SuppressWarnings("unchecked") final List<String> addrs = (List<String>) entry.getValue(); - result.add(new ConsulServiceInfo(service, addrs)); - } - } - return result; - } - - @Override - public List<ConsulNodeInfo> getNodes() { - logger.debug(EELFLoggerDelegate.debugLogger, "getNodes"); - String json = getMockDataContent("/nodesHealth.json"); - TypeReference<List<ConsulNodeInfo>> typeRef = new TypeReference<List<ConsulNodeInfo>>() { - }; - List<ConsulNodeInfo> result = null; - try { - result = objectMapper.readValue(json, typeRef); - } catch (Exception ex) { - logger.error(EELFLoggerDelegate.errorLogger, "getNode failed", ex); - - } - return result; - } - - @Override - public List<ConsulDatacenter> getDatacenters() { - logger.debug(EELFLoggerDelegate.debugLogger, "getDatacentersHealth"); - return null; - } - - /** - * Simple test - * - * @param args - * blueprint ID - * @throws DashboardControllerException - * On any failure - */ - public static void main(String[] args) throws DashboardControllerException { - logger.info("Testing paths and parsing mock data"); - ControllerRestClientMockImpl client = new ControllerRestClientMockImpl(); - CloudifyBlueprintList list1 = client.getBlueprints(); - CloudifyBlueprintList list2 = client.getBlueprint("mock"); - CloudifyDeploymentList list3 = client.getDeployments(); - CloudifyDeploymentList list4 = client.getDeployment("mock"); - CloudifyExecutionList list5 = client.getExecutions("mock"); - List<ConsulServiceInfo> list6 = client.getServices(); - List<ConsulNodeInfo> list7 = client.getNodes(); - List<ConsulServiceHealth> list8 = client.getServiceHealth("mock"); - List<ConsulServiceHealthHistory> list9 = client.getServiceHealthHistory("mock", Instant.now(), Instant.now()); - if (list1 == null || list2 == null || list3 == null || list4 == null || list5 == null || list6 == null - || list7 == null || list8 == null || list9 == null) - throw new DashboardControllerException("Failed"); - logger.info("Pass."); - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.rest;
+
+import java.io.InputStream;
+import java.net.URI;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Scanner;
+
+import org.onap.ccsdk.dashboard.exception.DashboardControllerException;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprintContent;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprintList;
+import org.onap.ccsdk.dashboard.model.CloudifyBlueprintUpload;
+import org.onap.ccsdk.dashboard.model.CloudifyDeploymentList;
+import org.onap.ccsdk.dashboard.model.CloudifyDeploymentRequest;
+import org.onap.ccsdk.dashboard.model.CloudifyExecution;
+import org.onap.ccsdk.dashboard.model.CloudifyExecutionList;
+import org.onap.ccsdk.dashboard.model.CloudifyExecutionRequest;
+import org.onap.ccsdk.dashboard.model.ConsulDatacenter;
+import org.onap.ccsdk.dashboard.model.ConsulHealthServiceRegistration;
+import org.onap.ccsdk.dashboard.model.ConsulNodeInfo;
+import org.onap.ccsdk.dashboard.model.ConsulServiceHealth;
+import org.onap.ccsdk.dashboard.model.ConsulServiceHealthHistory;
+import org.onap.ccsdk.dashboard.model.ConsulServiceInfo;
+import org.onap.ccsdk.dashboard.model.ECTransportModel;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+/**
+ * Provides mock implementations that return contents of files on the classpath.
+ */
+public class ControllerRestClientMockImpl implements IControllerRestClient {
+
+ private static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ControllerRestClientMockImpl.class);
+
+ /**
+ * For mock outputs
+ */
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * No-arg constructor
+ */
+ public ControllerRestClientMockImpl() {
+ }
+
+ private String getMockDataContent(final String path) {
+ String result = null;
+ try {
+ InputStream is = getClass().getResourceAsStream(path);
+ if (is == null)
+ throw new DashboardControllerException("Failed to find resource at path " + path);
+ Scanner scanner = new Scanner(is, "UTF-8");
+ result = scanner.useDelimiter("\\A").next();
+ scanner.close();
+ is.close();
+ } catch (Exception ex) {
+ logger.error("getMockDataContent failed", ex);
+ throw new RuntimeException(ex);
+ }
+ return result;
+ }
+
+ /**
+ * Creates an input stream using the specified path and requests the mapper
+ * create an object of the specified type.
+ *
+ * @param modelClass
+ * Model class
+ * @param path
+ * Path to classpath resource
+ * @return Instance of modelClass
+ */
+ private ECTransportModel getMockData(final Class<? extends ECTransportModel> modelClass, final String path) {
+ ECTransportModel result;
+ String json = getMockDataContent(path);
+ try {
+ result = objectMapper.readValue(json, modelClass);
+ } catch (Exception ex) {
+ logger.error("getMockData failed", ex);
+ throw new RuntimeException(ex);
+ }
+ return result;
+ }
+
+ @Override
+ public CloudifyBlueprintList getBlueprints() {
+ return (CloudifyBlueprintList) getMockData(CloudifyBlueprintList.class, "/blueprintList.json");
+ }
+
+ @Override
+ public CloudifyBlueprintList getBlueprint(final String id) {
+ return (CloudifyBlueprintList) getMockData(CloudifyBlueprintList.class, "/blueprintByID.json");
+ }
+
+ @Override
+ public CloudifyBlueprintContent viewBlueprint(final String id) {
+ String yaml = getMockDataContent("/blueprintContent.yaml");
+ return new CloudifyBlueprintContent(id, yaml);
+ }
+
+ @Override
+ public CloudifyBlueprintList uploadBlueprint(CloudifyBlueprintUpload blueprint) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "uploadBlueprint: {}", blueprint.toString());
+ return new CloudifyBlueprintList(null, null);
+ }
+
+ @Override
+ public int deleteBlueprint(final String id) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "deleteBlueprint: {}", id);
+ return 204;
+ }
+
+ @Override
+ public CloudifyDeploymentList getDeployments() {
+ return (CloudifyDeploymentList) getMockData(CloudifyDeploymentList.class, "/deploymentList.json");
+ }
+
+ @Override
+ public CloudifyDeploymentList getDeployment(final String id) {
+ return (CloudifyDeploymentList) getMockData(CloudifyDeploymentList.class, "/deploymentByID.json");
+ }
+
+ public CloudifyDeploymentList createDeployment(CloudifyDeploymentRequest deployment) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "createDeployment: {}", deployment.toString());
+ return new CloudifyDeploymentList(null, null);
+ }
+
+ @Override
+ public int deleteDeployment(final String id, boolean ignoreLiveNodes) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "deleteDeployment: id {}, ignoreLiveNodes", id, ignoreLiveNodes);
+ return 204;
+ }
+
+ @Override
+ public CloudifyExecutionList getExecutions(final String deploymentId) {
+ return (CloudifyExecutionList) getMockData(CloudifyExecutionList.class, "/listExecutionForDeploymentID.json");
+ }
+
+ @Override
+ public CloudifyExecutionList getExecution(String executionId, String deploymentId) {
+ return (CloudifyExecutionList) getMockData(CloudifyExecutionList.class, "/listExecutionForDeploymentID.json");
+ }
+
+ @Override
+ public CloudifyExecution startExecution(CloudifyExecutionRequest execution) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "startExecution: {}", execution.toString());
+ return new CloudifyExecution(null, null, null, null, null, null, null, null, null);
+ }
+
+ @Override
+ public int cancelExecution(String executionId, String deploymentId, String action) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "deleteExecution: executionId {}, deploymentId {}, action {}",
+ executionId, deploymentId, action);
+ return 204;
+ }
+
+ @Override
+ public URI registerService(ConsulHealthServiceRegistration registration) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "registerService: {}", registration);
+ return null;
+ }
+
+ @Override
+ public int deregisterService(String serviceName) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "deregisterService: {}", serviceName);
+ return 200;
+ }
+
+ @Override
+ public List<ConsulServiceHealth> getServiceHealth(String serviceName) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealth: serviceName={}", serviceName);
+ String json = getMockDataContent("/serviceHealth.json");
+ TypeReference<List<ConsulServiceHealth>> typeRef = new TypeReference<List<ConsulServiceHealth>>() {
+ };
+ List<ConsulServiceHealth> result = null;
+ try {
+ result = objectMapper.readValue(json, typeRef);
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getServiceHealth failed", ex);
+ }
+ return result;
+ }
+
+ @Override
+ public List<ConsulServiceHealthHistory> getServiceHealthHistory(String serviceName, Instant start, Instant end) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "getServiceHealthHistory: serviceName={}", serviceName);
+ String json = getMockDataContent("/serviceHealthHistory.json");
+ TypeReference<List<ConsulServiceHealthHistory>> typeRef = new TypeReference<List<ConsulServiceHealthHistory>>() {
+ };
+ List<ConsulServiceHealthHistory> result = null;
+ try {
+ result = objectMapper.readValue(json, typeRef);
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getServiceHealthHistory failed", ex);
+ }
+ return result;
+ }
+
+ @Override
+ public List<ConsulServiceHealth> getNodeServicesHealth(String nodeId) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "getNodeServicesHealth: nodeId={}", nodeId);
+ String json = getMockDataContent("/nodeServicesHealth.json");
+ TypeReference<List<ConsulServiceHealth>> typeRef = new TypeReference<List<ConsulServiceHealth>>() {
+ };
+ List<ConsulServiceHealth> result = null;
+ try {
+ result = objectMapper.readValue(json, typeRef);
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getNodeServicesHealth failed", ex);
+ }
+ return result;
+ }
+
+ @Override
+ public List<ConsulServiceInfo> getServices() {
+ logger.debug(EELFLoggerDelegate.debugLogger, "getServices");
+ String json = getMockDataContent("/services.json");
+ TypeReference<HashMap<String, Object>> typeRef = new TypeReference<HashMap<String, Object>>() {
+ };
+ HashMap<String, Object> map = null;
+ try {
+ map = objectMapper.readValue(json, typeRef);
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getNode failed", ex);
+ }
+ ArrayList<ConsulServiceInfo> result = new ArrayList<>();
+ if (map != null) {
+ for (Map.Entry<String, Object> entry : map.entrySet()) {
+ final String service = entry.getKey();
+ @SuppressWarnings("unchecked") final List<String> addrs = (List<String>) entry.getValue();
+ result.add(new ConsulServiceInfo(service, addrs));
+ }
+ }
+ return result;
+ }
+
+ @Override
+ public List<ConsulNodeInfo> getNodes() {
+ logger.debug(EELFLoggerDelegate.debugLogger, "getNodes");
+ String json = getMockDataContent("/nodesHealth.json");
+ TypeReference<List<ConsulNodeInfo>> typeRef = new TypeReference<List<ConsulNodeInfo>>() {
+ };
+ List<ConsulNodeInfo> result = null;
+ try {
+ result = objectMapper.readValue(json, typeRef);
+ } catch (Exception ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getNode failed", ex);
+
+ }
+ return result;
+ }
+
+ @Override
+ public List<ConsulDatacenter> getDatacenters() {
+ logger.debug(EELFLoggerDelegate.debugLogger, "getDatacentersHealth");
+ return null;
+ }
+
+ /**
+ * Simple test
+ *
+ * @param args
+ * blueprint ID
+ * @throws DashboardControllerException
+ * On any failure
+ */
+ public static void main(String[] args) throws DashboardControllerException {
+ logger.info("Testing paths and parsing mock data");
+ ControllerRestClientMockImpl client = new ControllerRestClientMockImpl();
+ CloudifyBlueprintList list1 = client.getBlueprints();
+ CloudifyBlueprintList list2 = client.getBlueprint("mock");
+ CloudifyDeploymentList list3 = client.getDeployments();
+ CloudifyDeploymentList list4 = client.getDeployment("mock");
+ CloudifyExecutionList list5 = client.getExecutions("mock");
+ List<ConsulServiceInfo> list6 = client.getServices();
+ List<ConsulNodeInfo> list7 = client.getNodes();
+ List<ConsulServiceHealth> list8 = client.getServiceHealth("mock");
+ List<ConsulServiceHealthHistory> list9 = client.getServiceHealthHistory("mock", Instant.now(), Instant.now());
+ if (list1 == null || list2 == null || list3 == null || list4 == null || list5 == null || list6 == null
+ || list7 == null || list8 == null || list9 == null)
+ throw new DashboardControllerException("Failed");
+ logger.info("Pass.");
+ }
+
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/service/ControllerEndpointServiceImpl.java b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/service/ControllerEndpointServiceImpl.java index b1c64b5..b4b3c97 100644 --- a/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/service/ControllerEndpointServiceImpl.java +++ b/ccsdk-app-common/src/main/java/org/onap/ccsdk/dashboard/service/ControllerEndpointServiceImpl.java @@ -1,76 +1,76 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.ccsdk.dashboard.service; - -import org.onap.ccsdk.dashboard.domain.ControllerEndpoint; -import org.openecomp.portalsdk.core.service.DataAccessService; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -/** - * Complete controller endpoint information is in properties. The database just - * stores the user's selection. Users are not expected to enter credentials so - * this hybrid solution keeps credentials out of the database. - */ -@Service("controllerEndpointService") -@Transactional -public class ControllerEndpointServiceImpl implements ControllerEndpointService { - - @Autowired - private DataAccessService dataAccessService; - - /** - * @return Data access service - */ - public DataAccessService getDataAccessService() { - return dataAccessService; - } - - /** - * @param dataAccessService - * Data access service - */ - public void setDataAccessService(DataAccessService dataAccessService) { - this.dataAccessService = dataAccessService; - } - - @Override - public ControllerEndpoint getControllerEndpointSelection(long userId) { - return (ControllerEndpoint) getDataAccessService() - .getDomainObject(ControllerEndpoint.class, userId, null); - } - - @Override - public void updateControllerEndpointSelection(ControllerEndpoint endpoint) { - getDataAccessService().saveDomainObject(endpoint, null); - } - - @Override - public void deleteControllerEndpointSelection(long userId) { - ControllerEndpoint dbEntry = (ControllerEndpoint) getDataAccessService() - .getDomainObject(ControllerEndpoint.class, userId, null); - if (dbEntry != null) - getDataAccessService().deleteDomainObject(dbEntry, null); - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.ccsdk.dashboard.service;
+
+import org.onap.ccsdk.dashboard.domain.ControllerEndpoint;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * Complete controller endpoint information is in properties. The database just
+ * stores the user's selection. Users are not expected to enter credentials so
+ * this hybrid solution keeps credentials out of the database.
+ */
+@Service("controllerEndpointService")
+@Transactional
+public class ControllerEndpointServiceImpl implements ControllerEndpointService {
+
+ @Autowired
+ private DataAccessService dataAccessService;
+
+ /**
+ * @return Data access service
+ */
+ public DataAccessService getDataAccessService() {
+ return dataAccessService;
+ }
+
+ /**
+ * @param dataAccessService
+ * Data access service
+ */
+ public void setDataAccessService(DataAccessService dataAccessService) {
+ this.dataAccessService = dataAccessService;
+ }
+
+ @Override
+ public ControllerEndpoint getControllerEndpointSelection(long userId) {
+ return (ControllerEndpoint) getDataAccessService()
+ .getDomainObject(ControllerEndpoint.class, userId, null);
+ }
+
+ @Override
+ public void updateControllerEndpointSelection(ControllerEndpoint endpoint) {
+ getDataAccessService().saveDomainObject(endpoint, null);
+ }
+
+ @Override
+ public void deleteControllerEndpointSelection(long userId) {
+ ControllerEndpoint dbEntry = (ControllerEndpoint) getDataAccessService()
+ .getDomainObject(ControllerEndpoint.class, userId, null);
+ if (dbEntry != null)
+ getDataAccessService().deleteDomainObject(dbEntry, null);
+ }
+
+}
diff --git a/ccsdk-app-common/src/main/java/org/onap/fusionapp/service/AdminAuthExtension.java b/ccsdk-app-common/src/main/java/org/onap/fusionapp/service/AdminAuthExtension.java index 8a64ab5..365ee05 100644 --- a/ccsdk-app-common/src/main/java/org/onap/fusionapp/service/AdminAuthExtension.java +++ b/ccsdk-app-common/src/main/java/org/onap/fusionapp/service/AdminAuthExtension.java @@ -1,42 +1,42 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.fusionapp.service; - -import org.openecomp.portalsdk.core.domain.User; - -//@Service("adminAuthExtension") -//@Transactional -/** - * Extension supporting action on authorization of user - */ -public class AdminAuthExtension { - - /** - * @param user - * User who was authenticated - */ - public void saveUserExtension(User user) { - // app's developer implement their own logic here, like updating app's - // related tables - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.fusionapp.service;
+
+import org.onap.portalsdk.core.domain.User;
+
+//@Service("adminAuthExtension")
+//@Transactional
+/**
+ * Extension supporting action on authorization of user
+ */
+public class AdminAuthExtension {
+
+ /**
+ * @param user
+ * User who was authenticated
+ */
+ public void saveUserExtension(User user) {
+ // app's developer implement their own logic here, like updating app's
+ // related tables
+ }
+
+}
diff --git a/ccsdk-app-common/src/test/java/org/onap/fusion/core/MockApplicationContextTestSuite.java b/ccsdk-app-common/src/test/java/org/onap/fusion/core/MockApplicationContextTestSuite.java index f3d55e2..ccefdce 100644 --- a/ccsdk-app-common/src/test/java/org/onap/fusion/core/MockApplicationContextTestSuite.java +++ b/ccsdk-app-common/src/test/java/org/onap/fusion/core/MockApplicationContextTestSuite.java @@ -1,137 +1,137 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.fusion.core; - -import java.io.IOException; - -import org.junit.Before; -import org.junit.runner.RunWith; -import org.openecomp.portalsdk.core.conf.AppConfig; -import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager; -import org.openecomp.portalsdk.core.util.CacheManager; -import org.openecomp.portalsdk.core.util.SystemProperties; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.springframework.test.context.web.AnnotationConfigWebContextLoader; -import org.springframework.test.context.web.WebAppConfiguration; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.setup.MockMvcBuilders; -import org.springframework.web.context.WebApplicationContext; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; - -/** - * In order to write a unit test, 1. inherit this class - See SanityTest.java 2. - * place the "war" folder on your test class's classpath 3. run the test with - * the following VM argument; This is important because when starting the - * application from Container, the System Properties file - * (SystemProperties.java) can have the direct path but, when running from the - * Mock Junit container, the path should be prefixed with "classpath" to enable - * the mock container to search for the file in the classpath - * -Dcontainer.classpath="classpath:" - * - */ - -@RunWith(SpringJUnit4ClassRunner.class) -@WebAppConfiguration -@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { MockAppConfig.class }) -@ActiveProfiles(value = "test") -public class MockApplicationContextTestSuite { - - @Autowired - public WebApplicationContext wac; - - private MockMvc mockMvc; - - @Before - public void setup() { - if (mockMvc == null) { - this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build(); - - } - } - - public Object getBean(String name) { - return this.wac.getBean(name); - } - - public MockMvc getMockMvc() { - return mockMvc; - } - - public void setMockMvc(MockMvc mockMvc) { - this.mockMvc = mockMvc; - } - - public WebApplicationContext getWebApplicationContext() { - return wac; - } - -} - -@Configuration -@ComponentScan(basePackages = {"org.openecomp", "org.onap"}, excludeFilters = { - // see AppConfig class -}) -@Profile("test") -class MockAppConfig extends AppConfig { - - @Bean - public SystemProperties systemProperties() { - return new MockSystemProperties(); - } - - @Bean - public AbstractCacheManager cacheManager() { - return new CacheManager() { - - public void configure() throws IOException { - - } - }; - } - - protected String[] tileDefinitions() { - return new String[] { "classpath:/WEB-INF/fusion/defs/definitions.xml", - "classpath:/WEB-INF/defs/definitions.xml" }; - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - // registry.addInterceptor(new - // SessionTimeoutInterceptor()).excludePathPatterns(getExcludeUrlPathsForSessionTimeout()); - // registry.addInterceptor(resourceInterceptor()); - } - - public static class MockSystemProperties extends SystemProperties { - - public MockSystemProperties() { - } - - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.fusion.core;
+
+import java.io.IOException;
+
+import org.junit.Before;
+import org.junit.runner.RunWith;
+import org.onap.portalsdk.core.conf.AppConfig;
+import org.onap.portalsdk.core.objectcache.AbstractCacheManager;
+import org.onap.portalsdk.core.util.CacheManager;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Profile;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
+import org.springframework.test.context.web.AnnotationConfigWebContextLoader;
+import org.springframework.test.context.web.WebAppConfiguration;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import org.springframework.web.context.WebApplicationContext;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+
+/**
+ * In order to write a unit test, 1. inherit this class - See SanityTest.java 2.
+ * place the "war" folder on your test class's classpath 3. run the test with
+ * the following VM argument; This is important because when starting the
+ * application from Container, the System Properties file
+ * (SystemProperties.java) can have the direct path but, when running from the
+ * Mock Junit container, the path should be prefixed with "classpath" to enable
+ * the mock container to search for the file in the classpath
+ * -Dcontainer.classpath="classpath:"
+ *
+ */
+
+@RunWith(SpringJUnit4ClassRunner.class)
+@WebAppConfiguration
+@ContextConfiguration(loader = AnnotationConfigWebContextLoader.class, classes = { MockAppConfig.class })
+@ActiveProfiles(value = "test")
+public class MockApplicationContextTestSuite {
+
+ @Autowired
+ public WebApplicationContext wac;
+
+ private MockMvc mockMvc;
+
+ @Before
+ public void setup() {
+ if (mockMvc == null) {
+ this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
+
+ }
+ }
+
+ public Object getBean(String name) {
+ return this.wac.getBean(name);
+ }
+
+ public MockMvc getMockMvc() {
+ return mockMvc;
+ }
+
+ public void setMockMvc(MockMvc mockMvc) {
+ this.mockMvc = mockMvc;
+ }
+
+ public WebApplicationContext getWebApplicationContext() {
+ return wac;
+ }
+
+}
+
+@Configuration
+@ComponentScan(basePackages = {"org.openecomp", "org.onap"}, excludeFilters = {
+ // see AppConfig class
+})
+@Profile("test")
+class MockAppConfig extends AppConfig {
+
+ @Bean
+ public SystemProperties systemProperties() {
+ return new MockSystemProperties();
+ }
+
+ @Bean
+ public AbstractCacheManager cacheManager() {
+ return new CacheManager() {
+
+ public void configure() throws IOException {
+
+ }
+ };
+ }
+
+ protected String[] tileDefinitions() {
+ return new String[] { "classpath:/WEB-INF/fusion/defs/definitions.xml",
+ "classpath:/WEB-INF/defs/definitions.xml" };
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ // registry.addInterceptor(new
+ // SessionTimeoutInterceptor()).excludePathPatterns(getExcludeUrlPathsForSessionTimeout());
+ // registry.addInterceptor(resourceInterceptor());
+ }
+
+ public static class MockSystemProperties extends SystemProperties {
+
+ public MockSystemProperties() {
+ }
+
+ }
+
+}
diff --git a/ccsdk-app-common/src/test/java/org/onap/fusionapp/service/ProfileServiceTest.java b/ccsdk-app-common/src/test/java/org/onap/fusionapp/service/ProfileServiceTest.java index 4a661da..ce00583 100644 --- a/ccsdk-app-common/src/test/java/org/onap/fusionapp/service/ProfileServiceTest.java +++ b/ccsdk-app-common/src/test/java/org/onap/fusionapp/service/ProfileServiceTest.java @@ -1,58 +1,58 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.fusionapp.service; - -import java.util.List; - -import org.junit.Assert; -import org.junit.Test; -import org.onap.fusion.core.MockApplicationContextTestSuite; -import org.openecomp.portalsdk.core.domain.Profile; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.service.ProfileService; -import org.openecomp.portalsdk.core.service.UserProfileService; -import org.springframework.beans.factory.annotation.Autowired; - - -public class ProfileServiceTest extends MockApplicationContextTestSuite { - - @Autowired - ProfileService service; - - @Autowired - UserProfileService userProfileService; - - @Test - public void testFindAll() { - - List<Profile> profiles = service.findAll(); - Assert.assertTrue(profiles.size() > 0); - } - - @Test - public void testFindAllActive() { - - List<User> users = userProfileService.findAllActive(); - List<User> activeUsers = userProfileService.findAllActive(); - Assert.assertTrue(users.size() - activeUsers.size() >= 0); - } -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.fusionapp.service;
+
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.onap.fusion.core.MockApplicationContextTestSuite;
+import org.onap.portalsdk.core.domain.Profile;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.service.ProfileService;
+import org.onap.portalsdk.core.service.UserProfileService;
+import org.springframework.beans.factory.annotation.Autowired;
+
+
+public class ProfileServiceTest extends MockApplicationContextTestSuite {
+
+ @Autowired
+ ProfileService service;
+
+ @Autowired
+ UserProfileService userProfileService;
+
+ @Test
+ public void testFindAll() throws Exception {
+
+ List<Profile> profiles = service.findAll();
+ Assert.assertTrue(profiles.size() > 0);
+ }
+
+ @Test
+ public void testFindAllActive() {
+
+ List<User> users = userProfileService.findAllActive();
+ List<User> activeUsers = userProfileService.findAllActive();
+ Assert.assertTrue(users.size() - activeUsers.size() >= 0);
+ }
+}
diff --git a/ccsdk-app-os/pom.xml b/ccsdk-app-os/pom.xml index 4d8975d..0efd176 100644 --- a/ccsdk-app-os/pom.xml +++ b/ccsdk-app-os/pom.xml @@ -1,169 +1,169 @@ -<?xml version="1.0"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <groupId>org.onap.ccsdk.dashboard</groupId> - <artifactId>ccsdk-app-os</artifactId> - <version>1.1.0-SNAPSHOT</version> - <packaging>war</packaging> - <name>ONAP Operations Manager Dashboard app</name> - <description>CCSDK Dashboard Web Application for external release</description> - - <properties> - <encoding>UTF-8</encoding> - <springframework.version>4.2.0.RELEASE</springframework.version> - <hibernate.version>4.3.11.Final</hibernate.version> - <epsdk.version>1.1.0</epsdk.version> - <ccsdk.version>1.1.0-SNAPSHOT</ccsdk.version> - <nexusproxy>https://nexus.onap.org</nexusproxy> - <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath> - <releaseNexusPath>/content/repositories/releases/</releaseNexusPath> - <!-- supplied by Jenkins server --> - <build.version>${project.version}</build.version> - <!-- Tests usually require some setup that maven cannot do, so skip. --> - <skiptests>true</skiptests> - </properties> - - <repositories> - <repository> - <!-- Releases repository has ECOMP release artifacts --> - <id>ecomp-releases</id> - <name>OpenECOMP - Release Repository</name> - <url>${nexusproxy}/${releaseNexusPath}</url> - </repository> - <repository> - <!-- Snapshots repository has ECOMP snapshot artifacts --> - <id>ecomp-snapshots</id> - <name>OpenECOMP - Snapshot Repository</name> - <url>${nexusproxy}/${snapshotNexusPath}</url> - </repository> - </repositories> - - <build> - - <!-- War files are labeled with build information, not POM version --> - <finalName>${project.artifactId}-${build.version}</finalName> - - <plugins> - <!-- Compile to Java 1.8 class output format --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-compiler-plugin</artifactId> - <version>3.1</version> - <configuration> - <source>1.8</source> - <target>1.8</target> - </configuration> - </plugin> - - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-war-plugin</artifactId> - <version>3.0.0</version> - <configuration> - <archive> - <manifest> - <addDefaultImplementationEntries>true</addDefaultImplementationEntries> - </manifest> - <manifestEntries> - <Build-Number>${build.version}</Build-Number> - <Build-Time>${maven.build.timestamp}</Build-Time> - </manifestEntries> - </archive> - <overlays> - <overlay> - <groupId>org.onap.ccsdk.dashboard</groupId> - <artifactId>ccsdk-app-overlay</artifactId> - </overlay> - <overlay> - <groupId>org.openecomp.ecompsdkos</groupId> - <artifactId>epsdk-app-overlay</artifactId> - <excludes> - <exclude>app/fusionapp/**</exclude> - <exclude>app/fusion/ase/**</exclude> - <exclude>app/fusion/external/angular-1.5/**</exclude> - <exclude>app/fusion/external/gis/**</exclude> - <exclude>app/fusion/external/leaflet-0.7.3/**</exclude> - <exclude>app/fusion/external/lodash/**</exclude> - <exclude>app/fusion/external/samples/**</exclude> - <exclude>app/fusion/external/showdown/**</exclude> - <exclude>app/fusion/notebook-integration/**</exclude> - <exclude>static/fusion/sample/**</exclude> - <exclude>static/fusion/raptor/**</exclude> - </excludes> - </overlay> - </overlays> - </configuration> - </plugin> - <!-- no deployment needed --> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-deploy-plugin</artifactId> - <version>2.8</version> - <configuration> - <skip>true</skip> - </configuration> - </plugin> - </plugins> - </build> - - <dependencies> - <!-- ECD webapp resources --> - <dependency> - <groupId>org.onap.ccsdk.dashboard</groupId> - <artifactId>ccsdk-app-overlay</artifactId> - <version>${ccsdk.version}</version> - <type>war</type> - </dependency> - <!-- ECD webapp controllers --> - <dependency> - <groupId>org.onap.ccsdk.dashboard</groupId> - <artifactId>ccsdk-app-common</artifactId> - <version>${ccsdk.version}</version> - </dependency> - <!-- SDK webapp resources --> - <dependency> - <groupId>org.openecomp.ecompsdkos</groupId> - <artifactId>epsdk-app-overlay</artifactId> - <version>${epsdk.version}</version> - <type>war</type> - </dependency> - <!-- SDK webapp controllers --> - <dependency> - <groupId>org.openecomp.ecompsdkos</groupId> - <artifactId>epsdk-app-common</artifactId> - <version>${epsdk.version}</version> - <exclusions> - <exclusion> - <groupId>org.openecomp.ecompsdkos</groupId> - <artifactId>epsdk-analytics</artifactId> - </exclusion> - <exclusion> - <groupId>org.openecomp.ecompsdkos</groupId> - <artifactId>epsdk-workflow</artifactId> - </exclusion> - <exclusion> - <groupId>mysql</groupId> - <artifactId>mysql-connector-java</artifactId> - </exclusion> - <exclusion> - <groupId>org.elasticsearch</groupId> - <artifactId>elasticsearch</artifactId> - </exclusion> - <exclusion> - <groupId>org.quartz-scheduler</groupId> - <artifactId>quartz</artifactId> - </exclusion> - <exclusion> - <groupId>org.drools</groupId> - <artifactId>drools-compiler</artifactId> - </exclusion> - <exclusion> - <groupId>io.searchbox</groupId> - <artifactId>jest</artifactId> - </exclusion> - </exclusions> - </dependency> - </dependencies> -</project> +<?xml version="1.0"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <groupId>org.onap.ccsdk.dashboard</groupId>
+ <artifactId>ccsdk-app-os</artifactId>
+ <version>1.1.0-SNAPSHOT</version>
+ <packaging>war</packaging>
+ <name>ONAP Operations Manager Dashboard app</name>
+ <description>CCSDK Dashboard Web Application for external release</description>
+
+ <properties>
+ <encoding>UTF-8</encoding>
+ <springframework.version>4.2.0.RELEASE</springframework.version>
+ <hibernate.version>4.3.11.Final</hibernate.version>
+ <epsdk.version>2.1.0</epsdk.version>
+ <ccsdk.version>1.1.0-SNAPSHOT</ccsdk.version>
+ <nexusproxy>https://nexus.onap.org</nexusproxy>
+ <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
+ <releaseNexusPath>/content/repositories/releases/</releaseNexusPath>
+ <!-- supplied by Jenkins server -->
+ <build.version>${project.version}</build.version>
+ <!-- Tests usually require some setup that maven cannot do, so skip. -->
+ <skiptests>true</skiptests>
+ </properties>
+
+ <repositories>
+ <repository>
+ <!-- Releases repository has ECOMP release artifacts -->
+ <id>ecomp-releases</id>
+ <name>OpenECOMP - Release Repository</name>
+ <url>${nexusproxy}/${releaseNexusPath}</url>
+ </repository>
+ <repository>
+ <!-- Snapshots repository has ECOMP snapshot artifacts -->
+ <id>ecomp-snapshots</id>
+ <name>OpenECOMP - Snapshot Repository</name>
+ <url>${nexusproxy}/${snapshotNexusPath}</url>
+ </repository>
+ </repositories>
+
+ <build>
+
+ <!-- War files are labeled with build information, not POM version -->
+ <finalName>${project.artifactId}-${build.version}</finalName>
+
+ <plugins>
+ <!-- Compile to Java 1.8 class output format -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-compiler-plugin</artifactId>
+ <version>3.1</version>
+ <configuration>
+ <source>1.8</source>
+ <target>1.8</target>
+ </configuration>
+ </plugin>
+
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-war-plugin</artifactId>
+ <version>3.0.0</version>
+ <configuration>
+ <archive>
+ <manifest>
+ <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
+ </manifest>
+ <manifestEntries>
+ <Build-Number>${build.version}</Build-Number>
+ <Build-Time>${maven.build.timestamp}</Build-Time>
+ </manifestEntries>
+ </archive>
+ <overlays>
+ <overlay>
+ <groupId>org.onap.ccsdk.dashboard</groupId>
+ <artifactId>ccsdk-app-overlay</artifactId>
+ </overlay>
+ <overlay>
+ <groupId>org.onap.portal.sdk</groupId>
+ <artifactId>epsdk-app-overlay</artifactId>
+ <excludes>
+ <exclude>app/fusionapp/**</exclude>
+ <exclude>app/fusion/ase/**</exclude>
+ <exclude>app/fusion/external/angular-1.5/**</exclude>
+ <exclude>app/fusion/external/gis/**</exclude>
+ <exclude>app/fusion/external/leaflet-0.7.3/**</exclude>
+ <exclude>app/fusion/external/lodash/**</exclude>
+ <exclude>app/fusion/external/samples/**</exclude>
+ <exclude>app/fusion/external/showdown/**</exclude>
+ <exclude>app/fusion/notebook-integration/**</exclude>
+ <exclude>static/fusion/sample/**</exclude>
+ <exclude>static/fusion/raptor/**</exclude>
+ </excludes>
+ </overlay>
+ </overlays>
+ </configuration>
+ </plugin>
+ <!-- no deployment needed -->
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8</version>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+ <dependencies>
+ <!-- ECD webapp resources -->
+ <dependency>
+ <groupId>org.onap.ccsdk.dashboard</groupId>
+ <artifactId>ccsdk-app-overlay</artifactId>
+ <version>${ccsdk.version}</version>
+ <type>war</type>
+ </dependency>
+ <!-- ECD webapp controllers -->
+ <dependency>
+ <groupId>org.onap.ccsdk.dashboard</groupId>
+ <artifactId>ccsdk-app-common</artifactId>
+ <version>${ccsdk.version}</version>
+ </dependency>
+ <!-- SDK webapp resources -->
+ <dependency>
+ <groupId>org.onap.portal.sdk</groupId>
+ <artifactId>epsdk-app-overlay</artifactId>
+ <version>${epsdk.version}</version>
+ <type>war</type>
+ </dependency>
+ <!-- SDK webapp controllers -->
+ <dependency>
+ <groupId>org.onap.portal.sdk</groupId>
+ <artifactId>epsdk-app-common</artifactId>
+ <version>${epsdk.version}</version>
+ <exclusions>
+ <exclusion>
+ <groupId>org.onap.portal.sdk</groupId>
+ <artifactId>epsdk-analytics</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.onap.portal.sdk</groupId>
+ <artifactId>epsdk-workflow</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>mysql</groupId>
+ <artifactId>mysql-connector-java</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.elasticsearch</groupId>
+ <artifactId>elasticsearch</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.quartz-scheduler</groupId>
+ <artifactId>quartz</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>org.drools</groupId>
+ <artifactId>drools-compiler</artifactId>
+ </exclusion>
+ <exclusion>
+ <groupId>io.searchbox</groupId>
+ <artifactId>jest</artifactId>
+ </exclusion>
+ </exclusions>
+ </dependency>
+ </dependencies>
+</project>
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 e532b5f..ecd312a 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 @@ -1,163 +1,164 @@ -/*- - * ================================================================================ - * ECOMP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * 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. - * ================================================================================ - */ -package org.onap.portalapp.conf; - -import java.util.ArrayList; -import java.util.List; - -import org.onap.portalapp.lm.FusionLicenseManagerImpl; -import org.onap.portalapp.login.LoginStrategyImpl; -import org.openecomp.portalapp.controller.core.SingleSignOnController; -import org.openecomp.portalapp.controller.sample.ElasticSearchController; -import org.openecomp.portalapp.controller.sample.PostDroolsController; -import org.openecomp.portalapp.scheduler.LogRegistry; -import org.openecomp.portalsdk.core.auth.LoginStrategy; -import org.openecomp.portalsdk.core.conf.AppConfig; -import org.openecomp.portalsdk.core.conf.Configurable; -import org.openecomp.portalsdk.core.lm.FusionLicenseManager; -import org.openecomp.portalsdk.core.lm.FusionLicenseManagerUtils; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.objectcache.AbstractCacheManager; -import org.openecomp.portalsdk.core.scheduler.CoreRegister; -import org.openecomp.portalsdk.core.scheduler.CronRegistry; -import org.openecomp.portalsdk.core.service.DataAccessService; -import org.openecomp.portalsdk.core.service.PostDroolsService; -import org.openecomp.portalsdk.core.util.CacheManager; -import org.openecomp.portalsdk.core.util.SystemProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.FilterType; -import org.springframework.context.annotation.Import; -import org.springframework.context.annotation.Profile; -import org.springframework.scheduling.annotation.EnableAsync; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.web.servlet.ViewResolver; -import org.springframework.web.servlet.config.annotation.EnableWebMvc; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; - -/** - * ECOMP Portal SDK sample application. ECOMP Portal SDK core AppConfig class to - * reuse interceptors, view resolvers and other features defined there. - */ -@Configuration -@EnableWebMvc -@ComponentScan(basePackages = { "org.onap", "org.openecomp" }, - // Exclude unused annotated classes with heavy dependencies. - excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = { CoreRegister.class, - CronRegistry.class, ElasticSearchController.class, LogRegistry.class, PostDroolsController.class, - PostDroolsService.class, SingleSignOnController.class })) -@Profile("src") -@EnableAsync -@EnableScheduling -public class ExternalAppConfig extends AppConfig implements Configurable { - - private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ExternalAppConfig.class); - - @Configuration - @Import(SystemProperties.class) - static class InnerConfiguration { - } - - /* - * (non-Javadoc) - * @see org.openecomp.portalsdk.core.conf.AppConfig#viewResolver() - */ - public ViewResolver viewResolver() { - return super.viewResolver(); - } - - /* - * (non-Javadoc) - * @see org.openecomp.portalsdk.core.conf.AppConfig#addResourceHandlers(org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry) - */ - @Override - public void addResourceHandlers(ResourceHandlerRegistry registry) { - super.addResourceHandlers(registry); - } - - /* - * (non-Javadoc) - * @see org.openecomp.portalsdk.core.conf.AppConfig#dataAccessService() - */ - @Override - public DataAccessService dataAccessService() { - // Echo the JDBC URL to assist developers when starting the app. - systemProperties(); - System.out.println("ExternalAppConfig: " + SystemProperties.DB_CONNECTIONURL + " is " - + SystemProperties.getProperty(SystemProperties.DB_CONNECTIONURL)); - return super.dataAccessService(); - } - - /** - * Creates a new list with a single entry that is the external app - * definitions.xml path. - * - * @return List of String, size 1 - */ - @Override - public List<String> addTileDefinitions() { - List<String> definitions = new ArrayList<String>(); - // DBC does not need the sample page: - // definitions.add("/WEB-INF/defs/definitions.xml"); - definitions.add("/WEB-INF/oom-app-definitions.xml"); - if (logger.isDebugEnabled()) - logger.debug(EELFLoggerDelegate.debugLogger, "addTileDefinitions: list is " + definitions); - return definitions; - } - - /** - * Adds request interceptors to the specified registry by calling - * {@link AppConfig#addInterceptors(InterceptorRegistry)}, but excludes - * certain paths from the session timeout interceptor. - */ - @Override - public void addInterceptors(InterceptorRegistry registry) { - super.setExcludeUrlPathsForSessionTimeout("/login_external", "*/login_external.htm", "login", "/login.htm", - "/api*", "/single_signon.htm", "/single_signon"); - super.addInterceptors(registry); - } - - /** - * Creates and returns a new instance of a {@link CacheManager} class. - * - * @return New instance of {@link CacheManager} - */ - @Bean - public AbstractCacheManager cacheManager() { - return new CacheManager(); - } - - @Bean - public FusionLicenseManager fusionLicenseManager() { - return new FusionLicenseManagerImpl(); - } - - @Bean - public FusionLicenseManagerUtils fusionLicenseManagerUtils() { - return new FusionLicenseManagerUtils(); - } - - @Bean - public LoginStrategy loginStrategy() { - return new LoginStrategyImpl(); - } -} +/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+package org.onap.portalapp.conf;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.onap.portalapp.lm.FusionLicenseManagerImpl;
+import org.onap.portalapp.login.LoginStrategyImpl;
+import org.onap.portalapp.controller.core.SingleSignOnController;
+import org.onap.portalapp.controller.sample.ElasticSearchController;
+import org.onap.portalapp.controller.sample.PostDroolsController;
+import org.onap.portalapp.scheduler.LogRegistry;
+import org.onap.portalsdk.core.auth.LoginStrategy;
+import org.onap.portalsdk.core.conf.AppConfig;
+import org.onap.portalsdk.core.conf.Configurable;
+//import org.onap.portalsdk.core.lm.FusionLicenseManager;
+//import org.onap.portalsdk.core.lm.FusionLicenseManagerUtils;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.objectcache.AbstractCacheManager;
+import org.onap.portalsdk.core.scheduler.CoreRegister;
+import org.onap.portalsdk.core.scheduler.CronRegistry;
+import org.onap.portalsdk.core.service.DataAccessService;
+import org.onap.portalsdk.core.service.PostDroolsService;
+import org.onap.portalsdk.core.util.CacheManager;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.FilterType;
+import org.springframework.context.annotation.Import;
+import org.springframework.context.annotation.Profile;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.web.servlet.ViewResolver;
+import org.springframework.web.servlet.config.annotation.EnableWebMvc;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+
+/**
+ * ECOMP Portal SDK sample application. ECOMP Portal SDK core AppConfig class to
+ * reuse interceptors, view resolvers and other features defined there.
+ */
+@Configuration
+@EnableWebMvc
+@ComponentScan(basePackages = { "org.onap", "org.openecomp" },
+ // Exclude unused annotated classes with heavy dependencies.
+ excludeFilters = @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, value = { CoreRegister.class,
+ CronRegistry.class, ElasticSearchController.class, LogRegistry.class, PostDroolsController.class,
+ PostDroolsService.class, SingleSignOnController.class }))
+@Profile("src")
+@EnableAsync
+@EnableScheduling
+public class ExternalAppConfig extends AppConfig implements Configurable {
+
+ private EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(ExternalAppConfig.class);
+
+ @Configuration
+ @Import(SystemProperties.class)
+ static class InnerConfiguration {
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.onap.portalsdk.core.conf.AppConfig#viewResolver()
+ */
+ public ViewResolver viewResolver() {
+ return super.viewResolver();
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.onap.portalsdk.core.conf.AppConfig#addResourceHandlers(org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry)
+ */
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ super.addResourceHandlers(registry);
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.onap.portalsdk.core.conf.AppConfig#dataAccessService()
+ */
+ @Override
+ public DataAccessService dataAccessService() {
+ // Echo the JDBC URL to assist developers when starting the app.
+ systemProperties();
+ System.out.println("ExternalAppConfig: " + SystemProperties.DB_CONNECTIONURL + " is "
+ + SystemProperties.getProperty(SystemProperties.DB_CONNECTIONURL));
+ return super.dataAccessService();
+ }
+
+ /**
+ * Creates a new list with a single entry that is the external app
+ * definitions.xml path.
+ *
+ * @return List of String, size 1
+ */
+ @Override
+ public List<String> addTileDefinitions() {
+ List<String> definitions = new ArrayList<String>();
+ // DBC does not need the sample page:
+ // definitions.add("/WEB-INF/defs/definitions.xml");
+ definitions.add("/WEB-INF/oom-app-definitions.xml");
+ if (logger.isDebugEnabled())
+ logger.debug(EELFLoggerDelegate.debugLogger, "addTileDefinitions: list is " + definitions);
+ return definitions;
+ }
+
+ /**
+ * Adds request interceptors to the specified registry by calling
+ * {@link AppConfig#addInterceptors(InterceptorRegistry)}, but excludes
+ * certain paths from the session timeout interceptor.
+ */
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ super.setExcludeUrlPathsForSessionTimeout("/login_external", "*/login_external.htm", "login", "/login.htm",
+ "/api*", "/single_signon.htm", "/single_signon");
+ super.addInterceptors(registry);
+ }
+
+ /**
+ * Creates and returns a new instance of a {@link CacheManager} class.
+ *
+ * @return New instance of {@link CacheManager}
+ */
+ @Bean
+ public AbstractCacheManager cacheManager() {
+ return new CacheManager();
+ }
+
+ /*
+ @Bean
+ public FusionLicenseManager fusionLicenseManager() {
+ return new FusionLicenseManagerImpl();
+ }
+
+ @Bean
+ public FusionLicenseManagerUtils fusionLicenseManagerUtils() {
+ return new FusionLicenseManagerUtils();
+ }
+ */
+ @Bean
+ public LoginStrategy loginStrategy() {
+ return new LoginStrategyImpl();
+ }
+}
diff --git a/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppInitializer.java b/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppInitializer.java index 347bb51..3edcf23 100644 --- a/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppInitializer.java +++ b/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/ExternalAppInitializer.java @@ -1,47 +1,47 @@ -/*- - * ================================================================================ - * ECOMP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * 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. - * ================================================================================ - */ -package org.onap.portalapp.conf; - -import org.openecomp.portalsdk.core.conf.AppInitializer; - -public class ExternalAppInitializer extends AppInitializer { - - @Override - protected Class<?>[] getRootConfigClasses() { - return super.getRootConfigClasses(); - } - - @Override - protected Class<?>[] getServletConfigClasses() { - Class<?> appConfigClass = ExternalAppConfig.class; - // Show something on stdout to indicate the app is starting. - System.out.println("ExternalAppInitializer: servlet configuration class is " + appConfigClass.getName()); - return new Class[] { appConfigClass }; - } - - /* - * URL request will direct to the Spring dispatcher for processing - */ - @Override - protected String[] getServletMappings() { - return super.getServletMappings(); - } - -} +/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+package org.onap.portalapp.conf;
+
+import org.onap.portalsdk.core.conf.AppInitializer;
+
+public class ExternalAppInitializer extends AppInitializer {
+
+ @Override
+ protected Class<?>[] getRootConfigClasses() {
+ return super.getRootConfigClasses();
+ }
+
+ @Override
+ protected Class<?>[] getServletConfigClasses() {
+ Class<?> appConfigClass = ExternalAppConfig.class;
+ // Show something on stdout to indicate the app is starting.
+ System.out.println("ExternalAppInitializer: servlet configuration class is " + appConfigClass.getName());
+ return new Class[] { appConfigClass };
+ }
+
+ /*
+ * URL request will direct to the Spring dispatcher for processing
+ */
+ @Override
+ protected String[] getServletMappings() {
+ return super.getServletMappings();
+ }
+
+}
diff --git a/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/HibernateMappingLocations.java b/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/HibernateMappingLocations.java index 6432478..a4a1fa6 100644 --- a/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/HibernateMappingLocations.java +++ b/ccsdk-app-os/src/main/java/org/onap/portalapp/conf/HibernateMappingLocations.java @@ -1,62 +1,62 @@ -/*- - * ================================================================================ - * ECOMP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * 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. - * ================================================================================ - */ -package org.onap.portalapp.conf; - -import org.springframework.context.annotation.Profile; -import org.springframework.core.io.ClassPathResource; -import org.springframework.core.io.Resource; -import org.springframework.stereotype.Component; - -import org.openecomp.portalsdk.core.conf.HibernateMappingLocatable; - -@Component -@Profile("src") -public class HibernateMappingLocations implements HibernateMappingLocatable { - - /* - * (non-Javadoc) - * - * @see org.openecomp.portalsdk.core.conf.HibernateMappingLocatable# - * getMappingLocations() - */ - @Override - public Resource[] getMappingLocations() { - return new Resource[] { - // Path is relative to WEB-INF/conf; - // a leading slash gets stripped so don't bother. - // new ClassPathResource("../fusion/orm/Fusion.hbm.xml"), - // This is a COPY to work around a bug in the 1.1.0 release. - new ClassPathResource("../fusion-110-copy.hbm.xml"), - new ClassPathResource("../oom-app.hbm.xml") - }; - } - - /* - * (non-Javadoc) - * - * @see org.openecomp.portalsdk.core.conf.HibernateMappingLocatable# - * getPackagesToScan() - */ - @Override - public String[] getPackagesToScan() { - return new String[] { "org.onap", "org.openecomp" }; - } - -} +/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+package org.onap.portalapp.conf;
+
+import org.springframework.context.annotation.Profile;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.core.io.Resource;
+import org.springframework.stereotype.Component;
+
+import org.onap.portalsdk.core.conf.HibernateMappingLocatable;
+
+@Component
+@Profile("src")
+public class HibernateMappingLocations implements HibernateMappingLocatable {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.onap.portalsdk.core.conf.HibernateMappingLocatable#
+ * getMappingLocations()
+ */
+ @Override
+ public Resource[] getMappingLocations() {
+ return new Resource[] {
+ // Path is relative to WEB-INF/conf;
+ // a leading slash gets stripped so don't bother.
+ // new ClassPathResource("../fusion/orm/Fusion.hbm.xml"),
+ // This is a COPY to work around a bug in the 1.1.0 release.
+ new ClassPathResource("../fusion-110-copy.hbm.xml"),
+ new ClassPathResource("../oom-app.hbm.xml")
+ };
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see org.onap.portalsdk.core.conf.HibernateMappingLocatable#
+ * getPackagesToScan()
+ */
+ @Override
+ public String[] getPackagesToScan() {
+ return new String[] { "org.onap", "org.openecomp" };
+ }
+
+}
diff --git a/ccsdk-app-os/src/main/java/org/onap/portalapp/lm/FusionLicenseManagerImpl.java b/ccsdk-app-os/src/main/java/org/onap/portalapp/lm/FusionLicenseManagerImpl.java index e0da1c9..4eb00c6 100644 --- a/ccsdk-app-os/src/main/java/org/onap/portalapp/lm/FusionLicenseManagerImpl.java +++ b/ccsdk-app-os/src/main/java/org/onap/portalapp/lm/FusionLicenseManagerImpl.java @@ -1,98 +1,120 @@ -/******************************************************************************* - * =============LICENSE_START========================================================= - * - * ================================================================================= - * Copyright (c) 2017 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========================================================= - * - * ECOMP is a trademark and service mark of AT&T Intellectual Property. - *******************************************************************************/ -package org.onap.portalapp.lm; - -import java.util.Date; -import java.util.List; -import java.util.Map; - -import javax.servlet.ServletContext; - -import org.openecomp.portalsdk.core.lm.FusionLicenseManager; - -public class FusionLicenseManagerImpl implements FusionLicenseManager { - - private Date expiredDate; - - public FusionLicenseManagerImpl() { - } - - /** - * An implementation of the KeyStoreParam interface that returns the - * information required to work with the keystore containing the private key. - */ - @Override - public void initKeyStoreParam() { - } - - @Override - public void initCipherParam() { - } - - /** - * Create/populate the "licenseParm" field. - */ - @Override - public void initLicenseParam() { - } - - @Override - public void doInitWork() { - } - - /** - * Prompt the user for the location of their license file, get the filename, - * then try to install the file. - * - * @return true if the license installed properly, false otherwise. - */ - @Override - public int installLicense() { - return INVALID_LICENSE; - } - - @Override - public synchronized int verifyLicense(ServletContext context) { - - return INVALID_LICENSE; - } - - @Override - public void generateLicense(Map<String, String> clientInfoMap, List<String> ipAddressList) throws Exception { - } - - @Override - public String nvl(String s) { - return (s == null) ? "" : s; - } - - @Override - public Date getExpiredDate() { - return expiredDate; - } - - @Override - public void setExpiredDate(Date expiredDate) { - this.expiredDate = expiredDate; - } - -} +/*******************************************************************************
+ * =============LICENSE_START=========================================================
+ *
+ * =================================================================================
+ * Copyright (c) 2017 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=========================================================
+ *
+ * ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ *******************************************************************************/
+package org.onap.portalapp.lm;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+
+//import org.onap.portalsdk.core.lm.FusionLicenseManager;
+interface FusionLicenseManager {
+ public void initKeyStoreParam();
+
+ public void initCipherParam();
+
+ public void initLicenseParam();
+
+ public int installLicense();
+
+ public int verifyLicense(ServletContext context);
+
+ public void setExpiredDate(Date expiredDate);
+
+ public void doInitWork();
+
+ public void generateLicense(Map<String, String> clientInfoMap, List<String> ipAddressList) throws Exception;
+
+ public String nvl(String s);
+
+ public Date getExpiredDate();
+}
+public class FusionLicenseManagerImpl implements FusionLicenseManager {
+
+ private Date expiredDate;
+
+ public FusionLicenseManagerImpl() {
+ }
+
+ /**
+ * An implementation of the KeyStoreParam interface that returns the
+ * information required to work with the keystore containing the private key.
+ */
+ @Override
+ public void initKeyStoreParam() {
+ }
+
+ @Override
+ public void initCipherParam() {
+ }
+
+ /**
+ * Create/populate the "licenseParm" field.
+ */
+ @Override
+ public void initLicenseParam() {
+ }
+
+ @Override
+ public void doInitWork() {
+ }
+
+ /**
+ * Prompt the user for the location of their license file, get the filename,
+ * then try to install the file.
+ *
+ * @return true if the license installed properly, false otherwise.
+ */
+ @Override
+ public int installLicense() {
+ //return INVALID_LICENSE;
+ return -1;
+ }
+
+ @Override
+ public synchronized int verifyLicense(ServletContext context) {
+
+ //return INVALID_LICENSE;
+ return -1;
+ }
+
+ @Override
+ public void generateLicense(Map<String, String> clientInfoMap, List<String> ipAddressList) throws Exception {
+ }
+
+ @Override
+ public String nvl(String s) {
+ return (s == null) ? "" : s;
+ }
+
+ @Override
+ public Date getExpiredDate() {
+ return expiredDate;
+ }
+
+ @Override
+ public void setExpiredDate(Date expiredDate) {
+ this.expiredDate = expiredDate;
+ }
+
+}
diff --git a/ccsdk-app-os/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java b/ccsdk-app-os/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java index 22fca6d..88bce2d 100644 --- a/ccsdk-app-os/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java +++ b/ccsdk-app-os/src/main/java/org/onap/portalapp/login/LoginStrategyImpl.java @@ -1,91 +1,91 @@ -/*- - * ================================================================================ - * ECOMP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * 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. - * ================================================================================ - */ - -package org.onap.portalapp.login; - -import javax.servlet.http.Cookie; -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - -import org.openecomp.portalsdk.core.auth.LoginStrategy; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.openecomp.portalsdk.core.onboarding.exception.PortalAPIException; -import org.openecomp.portalsdk.core.onboarding.util.CipherUtil; -import org.openecomp.portalsdk.core.onboarding.util.PortalApiConstants; -import org.openecomp.portalsdk.core.onboarding.util.PortalApiProperties; -import org.springframework.web.servlet.ModelAndView; - -public class LoginStrategyImpl extends LoginStrategy { - - EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(LoginStrategyImpl.class); - - @Override - public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception { - // 'login' for opensource is same as 'external' login. - return doExternalLogin(request, response); - } - - @Override - public String getUserId(HttpServletRequest request) throws PortalAPIException { - // Check ECOMP Portal cookie - if (!isLoginCookieExist(request)) - return null; - - String userid = null; - try { - userid = getUserIdFromCookie(request); - } catch (Exception e) { - logger.error(EELFLoggerDelegate.errorLogger, "getUserId failed", e); - } - return userid; - } - - private static String getUserIdFromCookie(HttpServletRequest request) throws Exception { - String userId = ""; - Cookie[] cookies = request.getCookies(); - Cookie userIdcookie = null; - if (cookies != null) - for (Cookie cookie : cookies) - if (cookie.getName().equals(USER_ID)) - userIdcookie = cookie; - if (userIdcookie != null) { - userId = CipherUtil.decrypt(userIdcookie.getValue(), - PortalApiProperties.getProperty(PortalApiConstants.Decryption_Key)); - } - return userId; - - } - - private static boolean isLoginCookieExist(HttpServletRequest request) { - Cookie ep = getCookie(request, EP_SERVICE); - return (ep != null); - } - - private static Cookie getCookie(HttpServletRequest request, String cookieName) { - Cookie[] cookies = request.getCookies(); - if (cookies != null) - for (Cookie cookie : cookies) - if (cookie.getName().equals(cookieName)) - return cookie; - - return null; - } - -} +/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+
+package org.onap.portalapp.login;
+
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.onap.portalsdk.core.auth.LoginStrategy;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.onap.portalsdk.core.onboarding.exception.PortalAPIException;
+import org.onap.portalsdk.core.onboarding.util.CipherUtil;
+import org.onap.portalsdk.core.onboarding.util.PortalApiConstants;
+import org.onap.portalsdk.core.onboarding.util.PortalApiProperties;
+import org.springframework.web.servlet.ModelAndView;
+
+public class LoginStrategyImpl extends LoginStrategy {
+
+ EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(LoginStrategyImpl.class);
+
+ @Override
+ public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response) throws Exception {
+ // 'login' for opensource is same as 'external' login.
+ return doExternalLogin(request, response);
+ }
+
+ @Override
+ public String getUserId(HttpServletRequest request) throws PortalAPIException {
+ // Check ECOMP Portal cookie
+ if (!isLoginCookieExist(request))
+ return null;
+
+ String userid = null;
+ try {
+ userid = getUserIdFromCookie(request);
+ } catch (Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger, "getUserId failed", e);
+ }
+ return userid;
+ }
+
+ private static String getUserIdFromCookie(HttpServletRequest request) throws Exception {
+ String userId = "";
+ Cookie[] cookies = request.getCookies();
+ Cookie userIdcookie = null;
+ if (cookies != null)
+ for (Cookie cookie : cookies)
+ if (cookie.getName().equals(USER_ID))
+ userIdcookie = cookie;
+ if (userIdcookie != null) {
+ userId = ""; //CipherUtil.decrypt(userIdcookie.getValue(),
+ //PortalApiProperties.getProperty(PortalApiConstants.Decryption_Key));
+ }
+ return userId;
+
+ }
+
+ private static boolean isLoginCookieExist(HttpServletRequest request) {
+ Cookie ep = getCookie(request, EP_SERVICE);
+ return (ep != null);
+ }
+
+ private static Cookie getCookie(HttpServletRequest request, String cookieName) {
+ Cookie[] cookies = request.getCookies();
+ if (cookies != null)
+ for (Cookie cookie : cookies)
+ if (cookie.getName().equals(cookieName))
+ return cookie;
+
+ return null;
+ }
+
+}
diff --git a/ccsdk-app-os/src/main/java/org/onap/portalapp/service/AdminAuthExtension.java b/ccsdk-app-os/src/main/java/org/onap/portalapp/service/AdminAuthExtension.java index 17fe4ee..fdda960 100644 --- a/ccsdk-app-os/src/main/java/org/onap/portalapp/service/AdminAuthExtension.java +++ b/ccsdk-app-os/src/main/java/org/onap/portalapp/service/AdminAuthExtension.java @@ -1,68 +1,68 @@ -/*- - * ================================================================================ - * ECOMP Portal SDK - * ================================================================================ - * Copyright (C) 2017 AT&T Intellectual Property - * ================================================================================ - * 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. - * ================================================================================ - */ -package org.onap.portalapp.service; - -import java.util.Set; - -import org.openecomp.portalapp.service.IAdminAuthExtension; -import org.openecomp.portalsdk.core.domain.Role; -import org.openecomp.portalsdk.core.domain.User; -import org.openecomp.portalsdk.core.logging.logic.EELFLoggerDelegate; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - - -@Service("adminAuthExtension") -@Transactional -/** - * Provides empty implementations of the methods in IAdminAuthExtension. - */ -public class AdminAuthExtension implements IAdminAuthExtension { - - EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AdminAuthExtension.class); - - /* - * (non-Javadoc) - * @see org.openecomp.portalapp.service.IAdminAuthExtension#saveUserExtension(org.openecomp.portalsdk.core.domain.User) - */ - @Override - public void saveUserExtension(User user) { - logger.debug("saveUserExtension"); - } - - /* - * (non-Javadoc) - * @see org.openecomp.portalapp.service.IAdminAuthExtension#editUserExtension(org.openecomp.portalsdk.core.domain.User) - */ - @Override - public void editUserExtension(User user) { - logger.debug("editUserExtension"); - } - - /* - * (non-Javadoc) - * @see org.openecomp.portalapp.service.IAdminAuthExtension#saveUserRoleExtension(java.util.Set, org.openecomp.portalsdk.core.domain.User) - */ - @Override - public void saveUserRoleExtension(Set<Role> roles, User user) { - logger.debug("saveUserRoleExtension"); - } - -} +/*-
+ * ================================================================================
+ * ECOMP Portal SDK
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property
+ * ================================================================================
+ * 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.
+ * ================================================================================
+ */
+package org.onap.portalapp.service;
+
+import java.util.Set;
+
+import org.onap.portalapp.service.IAdminAuthExtension;
+import org.onap.portalsdk.core.domain.Role;
+import org.onap.portalsdk.core.domain.User;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+
+@Service("adminAuthExtension")
+@Transactional
+/**
+ * Provides empty implementations of the methods in IAdminAuthExtension.
+ */
+public class AdminAuthExtension implements IAdminAuthExtension {
+
+ EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(AdminAuthExtension.class);
+
+ /*
+ * (non-Javadoc)
+ * @see org.onap.portalapp.service.IAdminAuthExtension#saveUserExtension(org.onap.portalsdk.core.domain.User)
+ */
+ @Override
+ public void saveUserExtension(User user) {
+ logger.debug("saveUserExtension");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.onap.portalapp.service.IAdminAuthExtension#editUserExtension(org.onap.portalsdk.core.domain.User)
+ */
+ @Override
+ public void editUserExtension(User user) {
+ logger.debug("editUserExtension");
+ }
+
+ /*
+ * (non-Javadoc)
+ * @see org.onap.portalapp.service.IAdminAuthExtension#saveUserRoleExtension(java.util.Set, org.onap.portalsdk.core.domain.User)
+ */
+ @Override
+ public void saveUserRoleExtension(Set<Role> roles, User user) {
+ logger.debug("saveUserRoleExtension");
+ }
+
+}
diff --git a/ccsdk-app-os/src/main/resources/portal.properties b/ccsdk-app-os/src/main/resources/portal.properties index c9bde0a..88ef37c 100644 --- a/ccsdk-app-os/src/main/resources/portal.properties +++ b/ccsdk-app-os/src/main/resources/portal.properties @@ -1,45 +1,44 @@ -############################################################################### -# =============LICENSE_START========================================================= -# -# ================================================================================= -# Copyright (c) 2017 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========================================================= -# -# ECOMP is a trademark and service mark of AT&T Intellectual Property. -############################################################################### -# OS portal.properties - -# Properties read by ECOMP Framework library, ecompFW.jar - -portal.api.impl.class = org.openecomp.portalapp.service.OnBoardingApiServiceImpl -portal.api.prefix = /api -max.idle.time = 5 -user.attribute.name = user_attribute - -# URL of the ECOMP Portal REST API -ecomp_rest_url = http://portal.api.simpledemo.openecomp.org/ecompportal/auxapi - -#Use REST API instead of UEB to fetch the functional menu data -use_rest_for_functional_menu=true - -# Don't fetch functional menu via UEB in 1610. -ueb_listeners_enable = false - -# Application key is used by session management -ueb_app_key = cwMmLOCKSHPJUeVC - -# The inbox name property should not be required when the REST API is used, -# but in 1610 FuncMenuController logs ALARM if it cannot find this key. -ecomp_portal_inbox_name = ECOMP-PORTAL-INBOX-TEST +###############################################################################
+# =============LICENSE_START=========================================================
+#
+# =================================================================================
+# Copyright (c) 2017 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=========================================================
+#
+# ECOMP is a trademark and service mark of AT&T Intellectual Property.
+###############################################################################
+# OS portal.properties
+
+# Properties read by ECOMP Framework library, ecompFW.jar
+portal.api.impl.class=org.onap.portalapp.service.OnBoardingApiServiceImpl
+portal.api.prefix = /api
+max.idle.time = 5
+user.attribute.name = user_attribute
+
+# URL of the ECOMP Portal REST API
+ecomp_rest_url = http://portal.api.simpledemo.openecomp.org/ecompportal/auxapi
+
+#Use REST API instead of UEB to fetch the functional menu data
+use_rest_for_functional_menu=true
+
+# Don't fetch functional menu via UEB in 1610.
+ueb_listeners_enable = false
+
+# Application key is used by session management
+ueb_app_key = cwMmLOCKSHPJUeVC
+
+# The inbox name property should not be required when the REST API is used,
+# but in 1610 FuncMenuController logs ALARM if it cannot find this key.
+ecomp_portal_inbox_name = ECOMP-PORTAL-INBOX-TEST
diff --git a/ccsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp b/ccsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp index 935c6aa..a31937c 100644 --- a/ccsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp +++ b/ccsdk-app-os/src/main/webapp/WEB-INF/jsp/login_external.jsp @@ -1,113 +1,113 @@ -<%-- - ================================================================================ - ECOMP Portal SDK - ================================================================================ - Copyright (C) 2017 AT&T Intellectual Property - ================================================================================ - 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. - ================================================================================ ---%> -<%@ page import="org.openecomp.portalsdk.core.util.SystemProperties"%> -<!DOCTYPE html> -<% - // Name is defined by app; do not throw if missing - final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME) - ? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME) - : SystemProperties.APP_DISPLAY_NAME; -%> - -<html> - <head> - <meta charset="utf-8"> - <meta http-equiv="X-UA-Compatible" content="IE=edge"> - <meta name="viewport" content="width=device-width, initial-scale=1"> - <title>Login</title> - <style> - html { - font-family: Verdana, Arial, Helvetica, sans-serif; - } - body { - padding-top: 15px; - } - .logo { - position: fixed; - left: 15px; - top: 15px; - z-index: -1; - } - .loginError { - font-size: 18px; - color: red; - text-align: center; - } - .login { - font-size: 16px; - display: block; - margin-left: auto; - margin-right: auto; - text-align: center; - width: 100%; - } - .login input[type=submit] { - font-size: 16px; - } - .terms { - font-size: 10px; - text-align: center; - margin-left: auto; - margin-right: auto; - } - .terms a { - font-size: 10px; - text-align: center; - margin-left: auto; - margin-right: auto; - } - </style> - </head> - <body> - <div class="login"> - <img src="app/oom/images/onap_logo_2257x496.png" style="height: 150px;" /> - <h2> - <%=appDisplayName%> - </h2> - <br /> - <form action="login_external" method="POST"> - <label for="loginId">Login ID:</label> - <input id="loginId" name="loginId" type="text" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" maxlength="30"> - <br/> - <br/> - <label for="password">Password:</label> - <input id="password" name="password" type="password" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" - maxlength="30" > - <br /> - <br /> - <input id="loginBtn" type="submit" alt="Login" value="Login"> - </form> - </div> - <br /> - <br /> - <div class="loginError">${model.error}</div> - <br /> - <br /> - <br /> - <br /> - <br /> - <br /> - <div id="footer"> - <div class="terms"> - Copyright 2017 Open ECOMP and Linux Foundation. - </div> - </div> - </body> -</html> +<%--
+ ================================================================================
+ ECOMP Portal SDK
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property
+ ================================================================================
+ 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.
+ ================================================================================
+--%>
+<%@ page import="org.onap.portalsdk.core.util.SystemProperties"%>
+<!DOCTYPE html>
+<%
+ // Name is defined by app; do not throw if missing
+ final String appDisplayName = SystemProperties.containsProperty(SystemProperties.APP_DISPLAY_NAME)
+ ? SystemProperties.getProperty(SystemProperties.APP_DISPLAY_NAME)
+ : SystemProperties.APP_DISPLAY_NAME;
+%>
+
+<html>
+ <head>
+ <meta charset="utf-8">
+ <meta http-equiv="X-UA-Compatible" content="IE=edge">
+ <meta name="viewport" content="width=device-width, initial-scale=1">
+ <title>Login</title>
+ <style>
+ html {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ }
+ body {
+ padding-top: 15px;
+ }
+ .logo {
+ position: fixed;
+ left: 15px;
+ top: 15px;
+ z-index: -1;
+ }
+ .loginError {
+ font-size: 18px;
+ color: red;
+ text-align: center;
+ }
+ .login {
+ font-size: 16px;
+ display: block;
+ margin-left: auto;
+ margin-right: auto;
+ text-align: center;
+ width: 100%;
+ }
+ .login input[type=submit] {
+ font-size: 16px;
+ }
+ .terms {
+ font-size: 10px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ .terms a {
+ font-size: 10px;
+ text-align: center;
+ margin-left: auto;
+ margin-right: auto;
+ }
+ </style>
+ </head>
+ <body>
+ <div class="login">
+ <img src="app/oom/images/onap_logo_2257x496.png" style="height: 150px;" />
+ <h2>
+ <%=appDisplayName%>
+ </h2>
+ <br />
+ <form action="login_external" method="POST">
+ <label for="loginId">Login ID:</label>
+ <input id="loginId" name="loginId" type="text" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;" maxlength="30">
+ <br/>
+ <br/>
+ <label for="password">Password:</label>
+ <input id="password" name="password" type="password" style="width: 140px;height:25px;border-radius:7px;font-size:18px;padding-left:5px;"
+ maxlength="30" >
+ <br />
+ <br />
+ <input id="loginBtn" type="submit" alt="Login" value="Login">
+ </form>
+ </div>
+ <br />
+ <br />
+ <div class="loginError">${model.error}</div>
+ <br />
+ <br />
+ <br />
+ <br />
+ <br />
+ <br />
+ <div id="footer">
+ <div class="terms">
+ Copyright 2017 Open ECOMP and Linux Foundation.
+ </div>
+ </div>
+ </body>
+</html>
diff --git a/ccsdk-app-overlay/src/main/webapp/WEB-INF/fusion-110-copy.hbm.xml b/ccsdk-app-overlay/src/main/webapp/WEB-INF/fusion-110-copy.hbm.xml index a827e6c..1be0530 100644 --- a/ccsdk-app-overlay/src/main/webapp/WEB-INF/fusion-110-copy.hbm.xml +++ b/ccsdk-app-overlay/src/main/webapp/WEB-INF/fusion-110-copy.hbm.xml @@ -1,392 +1,392 @@ -<?xml version="1.0"?> -<!-- - ================================================================================ - ECOMP Portal SDK - ================================================================================ - Copyright (C) 2017 AT&T Intellectual Property - ================================================================================ - 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. - ================================================================================ - --> - -<!-- This is a COPY, modifies the original to drop RAPTOR classes and queries not needed --> - -<!DOCTYPE hibernate-mapping PUBLIC - "-//Hibernate/Hibernate Mapping DTD 3.0//EN" - "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> - -<hibernate-mapping package="org.openecomp.portalsdk.core.domain"> - - <!-- User class mapping details --> - <class name="User" table="FN_USER"> - <id name="id" column="user_id" > - <generator class="native"> - <param name="sequence">seq_fn_user</param> - </generator> - </id> - - <property name="orgId" column="org_id"/> - <property name="managerId" column="manager_id"/> - <property name="firstName" column="first_name"/> - <property name="middleInitial" column="middle_name"/> - <property name="lastName" column="last_name"/> - <property name="phone" column="phone"/> - <property name="fax" column="fax"/> - <property name="cellular" column="cellular"/> - <property name="email" column="email"/> - <property name="addressId" column="address_id"/> - <property name="alertMethodCd" column="alert_method_cd"/> - - <property name="address1" column="address_line_1"/> - <property name="address2" column="address_line_2"/> - <property name="city" column="city"/> - <property name="state" column="state_cd"/> - <property name="zipCode" column="zip_code"/> - <property name="country" column="country_cd"/> - - <property name="hrid" column="hrid"/> - <property name="orgUserId" column="org_user_id"/> - <property name="orgCode" column="org_code"/> - <property name="loginId" column="login_id"/> - <property name="loginPwd" column="login_pwd"/> - <property name="lastLoginDate" column="last_login_date" type="timestamp"/> - - <property name="locationClli" column="location_clli" /> - <property name="orgManagerUserId" column="org_manager_userid" /> - <property name="company" column="company" /> - <property name="department" column="department" /> - <property name="departmentName" column="department_name" /> - <property name="businessUnit" column="business_unit" /> - <property name="businessUnitName" column="business_unit_name" /> - <property name="jobTitle" column="job_title" /> - <property name="siloStatus" column="silo_status" /> - <property name="financialLocCode" column="fin_loc_code" /> - - <property name="active" column="active_yn" type="yes_no"/> - <property name="internal" column="is_internal_yn" type="yes_no"/> - - <property name="created" type="timestamp" column="created_date" /> - <property name="modified" type="timestamp" column="modified_date" /> - - <property name="createdId" column="created_id" /> - <property name="modifiedId" column="modified_id" /> - <property name="timeZoneId" column="timezone" /> - - <set name="userApps" table="FN_USER_ROLE" lazy="false" sort="natural" inverse="true" cascade="all-delete-orphan"> - <key column="user_id"/> - <one-to-many class="org.openecomp.portalsdk.core.domain.UserApp" /> - </set> - - <set name="pseudoRoles" table="FN_USER_PSEUDO_ROLE" lazy="false" sort="natural"> - <key column="user_id"/> - <many-to-many column="pseudo_role_id" class="org.openecomp.portalsdk.core.domain.Role" /> - </set> - </class> - - <!-- Profile class mapping details; - dupe of User class, but fewer fields --> - <class name="Profile" table="FN_USER"> - <id name="id" column="user_id" > - <generator class="increment"/> - </id> - <property name="first_name" column="first_name"/> - <property name="last_name" column="last_name"/> - <property name="email" column="email"/> - <property name="orgManagerUserId" column="org_manager_userid" /> - <property name="active_yn" column="active_yn"/> - <property name="orgUserId" column="org_user_id"/> - </class> - - <class name="UserApp" table="fn_user_role"> - <composite-id> - <key-property name="userId" type="long"> - <column name="user_id" precision="11" scale="0" /> - </key-property> - <key-many-to-one name="app" class="org.openecomp.portalsdk.core.domain.App" column="app_id" /> - <key-many-to-one name="role" class="org.openecomp.portalsdk.core.domain.Role" column="role_id" /> - </composite-id> - <property name="priority" type="java.lang.Short"> - <column name="priority" precision="4" scale="0" /> - </property> - </class> - - <!-- App class mapping details --> - <class name="App" table="fn_app"> - <id name="id" column="app_id"/> - <property name="name" column="app_name"/> - <property name="appPassword" column="app_password"/> - <property name="username" column="app_username"/> - <property name="imageUrl" column="app_image_url"/> - <property name="description" column="app_description"/> - <property name="notes" column="app_notes"/> - <property name="url" column="app_url"/> - <property name="alternateUrl" column="app_alternate_url"/> - <property name="restEndpoint" column="app_rest_endpoint"/> - <property name="mlAppName" column="ml_app_name"/> - <property name="mlAppAdminId" column="ml_app_admin_id"/> - <property name="motsId" column="mots_id"/> - <property name="open" column="open"/> - <property name="enabled" column="enabled"/> - <property name="thumbnail" column="thumbnail" type="blob"/> - <property name="uebKey" column="ueb_key"/> - <property name="uebSecret" column="ueb_secret"/> - <property name="uebTopicName" column="ueb_topic_name"/> - </class> - - - <!-- Audit Log class mapping details --> - <class name="AuditLog" table="fn_audit_log"> - <id name="id" column="log_id"> - <!-- <generator class="sequence"> - <param name="sequence">seq_fn_audit_log</param> - </generator> --> - <generator class="native"> - <param name="sequence">seq_fn_audit_log</param> - </generator> - </id> - <property name="activityCode" column="activity_cd"/> - <property name="affectedRecordId" column="affected_record_id" /> - <property name="comments" column="comments" /> - <property name="createdId" column="user_id" /> - </class> - - <!-- User Role class mapping details --> - <class name="Role" table="FN_ROLE"> - <id name="id" column="role_id"> - <generator class="native"> - <param name="sequence">seq_fn_role</param> - </generator> - </id> - - <property name="name" column="role_name"/> - <property name="priority" column="priority" /> - <property name="active" column="active_yn" type="yes_no"/> - - <set name="roleFunctions" table="FN_ROLE_FUNCTION" lazy="false" sort="natural"> - <key column="role_id"/> - <many-to-many column="function_cd" class="org.openecomp.portalsdk.core.domain.RoleFunction"/> - </set> - - <set name="childRoles" table="FN_ROLE_COMPOSITE" lazy="false" sort="natural"> - <key column="parent_role_id"/> - <many-to-many column="child_role_id" class="org.openecomp.portalsdk.core.domain.Role"/> - </set> - - <set name="parentRoles" table="FN_ROLE_COMPOSITE" lazy="false" sort="natural"> - <key column="child_role_id"/> - <many-to-many column="parent_role_id" class="org.openecomp.portalsdk.core.domain.Role"/> - </set> - - </class> - - - - <!-- User Role Function class mapping details --> - <class name="RoleFunction" table="FN_FUNCTION"> - <id name="code" column="function_cd" /> - <property name="name" column="function_name" /> - </class> - - <!-- Menu class mapping details --> - <class name="Menu" table="FN_MENU"> - <id name="id" column="menu_id"> - <generator class="native"> - <param name="sequence">seq_fn_menu</param> - </generator> - </id> - - <!-- <property name="menuLevel" column="level-1"/> --> - <property name="label" column="label"/> - <property name="parentId" column="parent_id"/> - <property name="action" column="action"/> - <property name="functionCd" column="function_cd"/> - <property name="sortOrder" column="sort_order"/> - <property name="servlet" column="servlet"/> - <property name="queryString" column="query_string"/> - <property name="externalUrl" column="external_url"/> - <property name="target" column="target"/> - <property name="menuSetCode" column="menu_set_cd"/> - <property name="active" column="active_yn" type="yes_no"/> - <property name="separator" column="separator_yn" type="yes_no"/> - <property name="imageSrc" column="image_src" /> - </class> - - <class name="MenuData" table="FN_MENU"> - <!-- <id name="id" column="menu_id"/> --> - <id name="id" column="menu_id"> - <generator class="native"> - <param name="sequence">seq_fn_menu</param> - </generator> - </id> - <property name="label" column="label"/> - <property name="action" column="action"/> - <property name="functionCd" column="function_cd"/> - <property name="sortOrder" column="sort_order"/> - <property name="servlet" column="servlet"/> - <property name="queryString" column="query_string"/> - <property name="externalUrl" column="external_url"/> - <property name="target" column="target"/> - <property name="active" column="active_yn" type="yes_no"/> - <property name="separator" column="separator_yn" type="yes_no"/> - <property name="imageSrc" column="image_src" /> - <property name="menuSetCode" column="menu_set_cd" /> - - <many-to-one name="parentMenu" column="parent_id" class="MenuData"/> - - <set name="childMenus" lazy="false" sort="natural" inverse="true" where="active_yn = 'Y'"> - <key column="parent_id"/> - <one-to-many class="MenuData"/> - </set> - </class> - - <!-- Broadcast Message class mapping details --> - <class name="BroadcastMessage" table="fn_broadcast_message"> - <id name="id" column="message_id"> - <generator class="native"> - <param name="sequence">seq_fn_broadcast_message</param> - </generator> - </id> - <property name="messageText" column="message_text"/> - <property name="locationId" column="message_location_id"/> - - <property name="startDate" column="broadcast_start_date" type="timestamp"/> - <property name="endDate" column="broadcast_end_date" type="timestamp"/> - - <property name="sortOrder" column="sort_order"/> - <property name="active" column="active_yn" type="yes_no"/> - - <property name="siteCd" column="broadcast_site_cd" /> - </class> - - <!-- - <class name="org.openecomp.portalsdk.analytics.model.base.ReportUserRole" table="cr_report_access"> - <composite-id> - <key-property name="repId" column="rep_id" /> - <key-property name="orderNo" column="order_no" /> - </composite-id> - - <property name="roleId" column="role_id"/> - <property name="userId" column="user_id"/> - <property name="readOnlyYn" column="read_only_yn"/> - </class> - --> - - <!-- State Lookup class mapping details --> - <class name="LuState" table="FN_LU_STATE"> - <id name="abbr" column="state_cd" /> - <property name="state" /> - </class> - - <!-- Country Lookup class mapping details --> - <class name="LuCountry" table="FN_LU_COUNTRY"> - <id name="abbr" column="country_cd" /> - <property name="country" /> - <property name="fullName" column="full_name" /> - <property name="webphoneCountryLabel" column="fullwebphone_country_label_name" /> - </class> - - <class name="LuTimeZone" table="FN_LU_TIMEZONE"> - <id name="timezoneId" column="timezone_id" /> - <property name="name" column="timezone_name" /> - <property name="value" column="timezone_value" /> - </class> - - - <!-- Lookup (id/value bean) class mapping details --> - <class name="Lookup"> - <composite-id name="nameValueId" class="org.openecomp.portalsdk.core.domain.support.NameValueId"> - <key-property name="val"/> - <key-property name="lab" /> - </composite-id> - </class> - - <class name="UrlsAccessible" table="V_URL_ACCESS"> - <composite-id name="urlsAccessibleKey" class="org.openecomp.portalsdk.core.domain.UrlsAccessibleKey"> - <key-property name="url" column="url"/> - <key-property name="functionCd" column="function_cd"/> - </composite-id> - </class> - - - <query name="ParentIdForLabelList"> - select distinct md.parentMenu.id from MenuData as md where md.label = :paramLabel and md.label is not null - </query> - - <query name="IdForLabelList"> - select distinct md.id from MenuData as md where md.label = :paramLabel - </query> - - <query name="parentList"> - select distinct md.id, md.label, md.parentMenu.id from MenuData as md where md.label is not null - </query> - - <query name="functionCDlistOld"> - select distinct functionCd from MenuData - </query> - - <query name="functionCDlist"> - select distinct code from RoleFunction - </query> - - <query name="menuData"> - from MenuData where menuSetCode = :menu_set_cd and parentMenu is null - </query> - <query name="restrictedUrls"> - FROM UrlsAccessible A where upper(A.urlsAccessibleKey.url) = upper(:current_url) - </query> - - <query name="getUserNameById"> - select firstName, lastName from User where id = :user_id - </query> - - <query name="getUserEmail"> - select email from User where id = :user_id - </query> - - <query name="getAllUsers"> - select id, firstName, lastName from User where active = true order by lastName, firstName - </query> - - <query name="getRoleNameById"> - select name from Role where id = :role_id - </query> - - <query name="getAllRoles"> - select id, name from Role order by name - </query> - - <!-- - <query name="getReportSecurityUsers"> - select repId, orderNo, roleId, userId, readOnlyYn from ReportUserRole where repId = :report_id and userId is not null - </query> - - <query name="getReportSecurityRoles"> - select repId, orderNo, roleId, userId, readOnlyYn from ReportUserRole where repId = :report_id and roleId is not null - </query> - --> - -<!-- <query name="insertReportSecurityUsers"> - insert into ReportUserRole (repId, roleId, userId, readOnlyYn) values (:report_id, :role_id, :user_id, :read_only_yn) - </query> --> - - <!-- - <query name="deleteReportSecurityUsers"> - delete from ReportUserRole where repId = :report_id and userId =:user_id - </query> - - <query name="deleteReportSecurityRoles"> - delete from ReportUserRole where repId = :report_id and roleId =:role_id - </query> - --> - -</hibernate-mapping> +<?xml version="1.0"?>
+<!--
+ ================================================================================
+ ECOMP Portal SDK
+ ================================================================================
+ Copyright (C) 2017 AT&T Intellectual Property
+ ================================================================================
+ 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.
+ ================================================================================
+ -->
+
+<!-- This is a COPY, modifies the original to drop RAPTOR classes and queries not needed -->
+
+<!DOCTYPE hibernate-mapping PUBLIC
+ "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
+ "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
+
+<hibernate-mapping package="org.onap.portalsdk.core.domain">
+
+ <!-- User class mapping details -->
+ <class name="User" table="FN_USER">
+ <id name="id" column="user_id" >
+ <generator class="native">
+ <param name="sequence">seq_fn_user</param>
+ </generator>
+ </id>
+
+ <property name="orgId" column="org_id"/>
+ <property name="managerId" column="manager_id"/>
+ <property name="firstName" column="first_name"/>
+ <property name="middleInitial" column="middle_name"/>
+ <property name="lastName" column="last_name"/>
+ <property name="phone" column="phone"/>
+ <property name="fax" column="fax"/>
+ <property name="cellular" column="cellular"/>
+ <property name="email" column="email"/>
+ <property name="addressId" column="address_id"/>
+ <property name="alertMethodCd" column="alert_method_cd"/>
+
+ <property name="address1" column="address_line_1"/>
+ <property name="address2" column="address_line_2"/>
+ <property name="city" column="city"/>
+ <property name="state" column="state_cd"/>
+ <property name="zipCode" column="zip_code"/>
+ <property name="country" column="country_cd"/>
+
+ <property name="hrid" column="hrid"/>
+ <property name="orgUserId" column="org_user_id"/>
+ <property name="orgCode" column="org_code"/>
+ <property name="loginId" column="login_id"/>
+ <property name="loginPwd" column="login_pwd"/>
+ <property name="lastLoginDate" column="last_login_date" type="timestamp"/>
+
+ <property name="locationClli" column="location_clli" />
+ <property name="orgManagerUserId" column="org_manager_userid" />
+ <property name="company" column="company" />
+ <property name="department" column="department" />
+ <property name="departmentName" column="department_name" />
+ <property name="businessUnit" column="business_unit" />
+ <property name="businessUnitName" column="business_unit_name" />
+ <property name="jobTitle" column="job_title" />
+ <property name="siloStatus" column="silo_status" />
+ <property name="financialLocCode" column="fin_loc_code" />
+
+ <property name="active" column="active_yn" type="yes_no"/>
+ <property name="internal" column="is_internal_yn" type="yes_no"/>
+
+ <property name="created" type="timestamp" column="created_date" />
+ <property name="modified" type="timestamp" column="modified_date" />
+
+ <property name="createdId" column="created_id" />
+ <property name="modifiedId" column="modified_id" />
+ <property name="timeZoneId" column="timezone" />
+
+ <set name="userApps" table="FN_USER_ROLE" lazy="false" sort="natural" inverse="true" cascade="all-delete-orphan">
+ <key column="user_id"/>
+ <one-to-many class="org.onap.portalsdk.core.domain.UserApp"/>
+ </set>
+
+ <set name="pseudoRoles" table="FN_USER_PSEUDO_ROLE" lazy="false" sort="natural">
+ <key column="user_id"/>
+ <many-to-many column="pseudo_role_id" class="org.onap.portalsdk.core.domain.Role"/>
+ </set>
+ </class>
+
+ <!-- Profile class mapping details;
+ dupe of User class, but fewer fields -->
+ <class name="Profile" table="FN_USER">
+ <id name="id" column="user_id" >
+ <generator class="increment"/>
+ </id>
+ <property name="first_name" column="first_name"/>
+ <property name="last_name" column="last_name"/>
+ <property name="email" column="email"/>
+ <property name="orgManagerUserId" column="org_manager_userid" />
+ <property name="active_yn" column="active_yn"/>
+ <property name="orgUserId" column="org_user_id"/>
+ </class>
+
+ <class name="UserApp" table="fn_user_role">
+ <composite-id>
+ <key-property name="userId" type="long">
+ <column name="user_id" precision="11" scale="0" />
+ </key-property>
+ <key-many-to-one name="app" class="org.onap.portalsdk.core.domain.App" column="app_id"/>
+ <key-many-to-one name="role" class="org.onap.portalsdk.core.domain.Role" column="role_id"/>
+ </composite-id>
+ <property name="priority" type="java.lang.Short">
+ <column name="priority" precision="4" scale="0" />
+ </property>
+ </class>
+
+ <!-- App class mapping details -->
+ <class name="App" table="fn_app">
+ <id name="id" column="app_id"/>
+ <property name="name" column="app_name"/>
+ <property name="appPassword" column="app_password"/>
+ <property name="username" column="app_username"/>
+ <property name="imageUrl" column="app_image_url"/>
+ <property name="description" column="app_description"/>
+ <property name="notes" column="app_notes"/>
+ <property name="url" column="app_url"/>
+ <property name="alternateUrl" column="app_alternate_url"/>
+ <property name="restEndpoint" column="app_rest_endpoint"/>
+ <property name="mlAppName" column="ml_app_name"/>
+ <property name="mlAppAdminId" column="ml_app_admin_id"/>
+ <property name="motsId" column="mots_id"/>
+ <property name="open" column="open"/>
+ <property name="enabled" column="enabled"/>
+ <property name="thumbnail" column="thumbnail" type="blob"/>
+ <property name="uebKey" column="ueb_key"/>
+ <property name="uebSecret" column="ueb_secret"/>
+ <property name="uebTopicName" column="ueb_topic_name"/>
+ </class>
+
+
+ <!-- Audit Log class mapping details -->
+ <class name="AuditLog" table="fn_audit_log">
+ <id name="id" column="log_id">
+ <!-- <generator class="sequence">
+ <param name="sequence">seq_fn_audit_log</param>
+ </generator> -->
+ <generator class="native">
+ <param name="sequence">seq_fn_audit_log</param>
+ </generator>
+ </id>
+ <property name="activityCode" column="activity_cd"/>
+ <property name="affectedRecordId" column="affected_record_id" />
+ <property name="comments" column="comments" />
+ <property name="createdId" column="user_id" />
+ </class>
+
+ <!-- User Role class mapping details -->
+ <class name="Role" table="FN_ROLE">
+ <id name="id" column="role_id">
+ <generator class="native">
+ <param name="sequence">seq_fn_role</param>
+ </generator>
+ </id>
+
+ <property name="name" column="role_name"/>
+ <property name="priority" column="priority" />
+ <property name="active" column="active_yn" type="yes_no"/>
+
+ <set name="roleFunctions" table="FN_ROLE_FUNCTION" lazy="false" sort="natural">
+ <key column="role_id"/>
+ <many-to-many column="function_cd" class="org.onap.portalsdk.core.domain.RoleFunction"/>
+ </set>
+
+ <set name="childRoles" table="FN_ROLE_COMPOSITE" lazy="false" sort="natural">
+ <key column="parent_role_id"/>
+ <many-to-many column="child_role_id" class="org.onap.portalsdk.core.domain.Role"/>
+ </set>
+
+ <set name="parentRoles" table="FN_ROLE_COMPOSITE" lazy="false" sort="natural">
+ <key column="child_role_id"/>
+ <many-to-many column="parent_role_id" class="org.onap.portalsdk.core.domain.Role"/>
+ </set>
+
+ </class>
+
+
+
+ <!-- User Role Function class mapping details -->
+ <class name="RoleFunction" table="FN_FUNCTION">
+ <id name="code" column="function_cd" />
+ <property name="name" column="function_name" />
+ </class>
+
+ <!-- Menu class mapping details -->
+ <class name="Menu" table="FN_MENU">
+ <id name="id" column="menu_id">
+ <generator class="native">
+ <param name="sequence">seq_fn_menu</param>
+ </generator>
+ </id>
+
+ <!-- <property name="menuLevel" column="level-1"/> -->
+ <property name="label" column="label"/>
+ <property name="parentId" column="parent_id"/>
+ <property name="action" column="action"/>
+ <property name="functionCd" column="function_cd"/>
+ <property name="sortOrder" column="sort_order"/>
+ <property name="servlet" column="servlet"/>
+ <property name="queryString" column="query_string"/>
+ <property name="externalUrl" column="external_url"/>
+ <property name="target" column="target"/>
+ <property name="menuSetCode" column="menu_set_cd"/>
+ <property name="active" column="active_yn" type="yes_no"/>
+ <property name="separator" column="separator_yn" type="yes_no"/>
+ <property name="imageSrc" column="image_src" />
+ </class>
+
+ <class name="MenuData" table="FN_MENU">
+ <!-- <id name="id" column="menu_id"/> -->
+ <id name="id" column="menu_id">
+ <generator class="native">
+ <param name="sequence">seq_fn_menu</param>
+ </generator>
+ </id>
+ <property name="label" column="label"/>
+ <property name="action" column="action"/>
+ <property name="functionCd" column="function_cd"/>
+ <property name="sortOrder" column="sort_order"/>
+ <property name="servlet" column="servlet"/>
+ <property name="queryString" column="query_string"/>
+ <property name="externalUrl" column="external_url"/>
+ <property name="target" column="target"/>
+ <property name="active" column="active_yn" type="yes_no"/>
+ <property name="separator" column="separator_yn" type="yes_no"/>
+ <property name="imageSrc" column="image_src" />
+ <property name="menuSetCode" column="menu_set_cd" />
+
+ <many-to-one name="parentMenu" column="parent_id" class="MenuData"/>
+
+ <set name="childMenus" lazy="false" sort="natural" inverse="true" where="active_yn = 'Y'">
+ <key column="parent_id"/>
+ <one-to-many class="MenuData"/>
+ </set>
+ </class>
+
+ <!-- Broadcast Message class mapping details -->
+ <class name="BroadcastMessage" table="fn_broadcast_message">
+ <id name="id" column="message_id">
+ <generator class="native">
+ <param name="sequence">seq_fn_broadcast_message</param>
+ </generator>
+ </id>
+ <property name="messageText" column="message_text"/>
+ <property name="locationId" column="message_location_id"/>
+
+ <property name="startDate" column="broadcast_start_date" type="timestamp"/>
+ <property name="endDate" column="broadcast_end_date" type="timestamp"/>
+
+ <property name="sortOrder" column="sort_order"/>
+ <property name="active" column="active_yn" type="yes_no"/>
+
+ <property name="siteCd" column="broadcast_site_cd" />
+ </class>
+
+ <!--
+ <class name="org.onap.portalsdk.analytics.model.base.ReportUserRole" table="cr_report_access">
+ <composite-id>
+ <key-property name="repId" column="rep_id" />
+ <key-property name="orderNo" column="order_no" />
+ </composite-id>
+
+ <property name="roleId" column="role_id"/>
+ <property name="userId" column="user_id"/>
+ <property name="readOnlyYn" column="read_only_yn"/>
+ </class>
+ -->
+
+ <!-- State Lookup class mapping details -->
+ <class name="LuState" table="FN_LU_STATE">
+ <id name="abbr" column="state_cd" />
+ <property name="state" />
+ </class>
+
+ <!-- Country Lookup class mapping details -->
+ <class name="LuCountry" table="FN_LU_COUNTRY">
+ <id name="abbr" column="country_cd" />
+ <property name="country" />
+ <property name="fullName" column="full_name" />
+ <property name="webphoneCountryLabel" column="fullwebphone_country_label_name" />
+ </class>
+
+ <class name="LuTimeZone" table="FN_LU_TIMEZONE">
+ <id name="timezoneId" column="timezone_id" />
+ <property name="name" column="timezone_name" />
+ <property name="value" column="timezone_value" />
+ </class>
+
+
+ <!-- Lookup (id/value bean) class mapping details -->
+ <class name="Lookup">
+ <composite-id name="nameValueId" class="org.onap.portalsdk.core.domain.support.NameValueId">
+ <key-property name="val"/>
+ <key-property name="lab" />
+ </composite-id>
+ </class>
+
+ <class name="UrlsAccessible" table="V_URL_ACCESS">
+ <composite-id name="urlsAccessibleKey" class="org.onap.portalsdk.core.domain.UrlsAccessibleKey">
+ <key-property name="url" column="url"/>
+ <key-property name="functionCd" column="function_cd"/>
+ </composite-id>
+ </class>
+
+
+ <query name="ParentIdForLabelList">
+ select distinct md.parentMenu.id from MenuData as md where md.label = :paramLabel and md.label is not null
+ </query>
+
+ <query name="IdForLabelList">
+ select distinct md.id from MenuData as md where md.label = :paramLabel
+ </query>
+
+ <query name="parentList">
+ select distinct md.id, md.label, md.parentMenu.id from MenuData as md where md.label is not null
+ </query>
+
+ <query name="functionCDlistOld">
+ select distinct functionCd from MenuData
+ </query>
+
+ <query name="functionCDlist">
+ select distinct code from RoleFunction
+ </query>
+
+ <query name="menuData">
+ from MenuData where menuSetCode = :menu_set_cd and parentMenu is null
+ </query>
+ <query name="restrictedUrls">
+ FROM UrlsAccessible A where upper(A.urlsAccessibleKey.url) = upper(:current_url)
+ </query>
+
+ <query name="getUserNameById">
+ select firstName, lastName from User where id = :user_id
+ </query>
+
+ <query name="getUserEmail">
+ select email from User where id = :user_id
+ </query>
+
+ <query name="getAllUsers">
+ select id, firstName, lastName from User where active = true order by lastName, firstName
+ </query>
+
+ <query name="getRoleNameById">
+ select name from Role where id = :role_id
+ </query>
+
+ <query name="getAllRoles">
+ select id, name from Role order by name
+ </query>
+
+ <!--
+ <query name="getReportSecurityUsers">
+ select repId, orderNo, roleId, userId, readOnlyYn from ReportUserRole where repId = :report_id and userId is not null
+ </query>
+
+ <query name="getReportSecurityRoles">
+ select repId, orderNo, roleId, userId, readOnlyYn from ReportUserRole where repId = :report_id and roleId is not null
+ </query>
+ -->
+
+<!-- <query name="insertReportSecurityUsers">
+ insert into ReportUserRole (repId, roleId, userId, readOnlyYn) values (:report_id, :role_id, :user_id, :read_only_yn)
+ </query> -->
+
+ <!--
+ <query name="deleteReportSecurityUsers">
+ delete from ReportUserRole where repId = :report_id and userId =:user_id
+ </query>
+
+ <query name="deleteReportSecurityRoles">
+ delete from ReportUserRole where repId = :report_id and roleId =:role_id
+ </query>
+ -->
+
+</hibernate-mapping>
@@ -1,48 +1,48 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> - <modelVersion>4.0.0</modelVersion> - - <!-- Add oparent parent --> - <parent> - <groupId>org.onap.oparent</groupId> - <artifactId>oparent</artifactId> - <version>1.0.0-SNAPSHOT</version> - </parent> - <!-- Maven parent project for convenience of building and cleaning --> - <groupId>org.onap.ccsdk.dashboard</groupId> - <artifactId>ccsdk-app-parent</artifactId> - <version>0</version> - <packaging>pom</packaging> - <name>ccsdk-dashboard</name> - - <modules> - <module>ccsdk-app-common</module> - <module>ccsdk-app-overlay</module> - <module>ccsdk-app-os</module> - </modules> - <distributionManagement> - <repository> - <id>ecomp-releases</id> - <url>${onap.nexus.url}/content/repositories/releases</url> - </repository> - <snapshotRepository> - <id>ecomp-snapshots</id> - <url>${onap.nexus.url}/content/repositories/snapshots</url> - </snapshotRepository> - </distributionManagement> - - <build> - <plugins> - <plugin> - <groupId>org.apache.maven.plugins</groupId> - <artifactId>maven-deploy-plugin</artifactId> - <version>2.8</version> - <configuration> - <skip>true</skip> - </configuration> - </plugin> - </plugins> - </build> - -</project> +<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+
+ <!-- Add oparent parent -->
+ <parent>
+ <groupId>org.onap.oparent</groupId>
+ <artifactId>oparent</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ </parent>
+ <!-- Maven parent project for convenience of building and cleaning -->
+ <groupId>org.onap.ccsdk.dashboard</groupId>
+ <artifactId>ccsdk-app-parent</artifactId>
+ <version>0</version>
+ <packaging>pom</packaging>
+ <name>ccsdk-dashboard</name>
+
+ <modules>
+ <module>ccsdk-app-common</module>
+ <module>ccsdk-app-overlay</module>
+ <!-- <module>ccsdk-app-os</module> -->
+ </modules>
+ <distributionManagement>
+ <repository>
+ <id>ecomp-releases</id>
+ <url>${onap.nexus.url}/content/repositories/releases</url>
+ </repository>
+ <snapshotRepository>
+ <id>ecomp-snapshots</id>
+ <url>${onap.nexus.url}/content/repositories/snapshots</url>
+ </snapshotRepository>
+ </distributionManagement>
+
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-deploy-plugin</artifactId>
+ <version>2.8</version>
+ <configuration>
+ <skip>true</skip>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+
+</project>
|