diff options
57 files changed, 5298 insertions, 1 deletions
diff --git a/cmso-database/src/main/resources/optimizer-dbchanges/onap-optimizer-v1-schema.sql b/cmso-database/src/main/resources/optimizer-dbchanges/onap-optimizer-v1-schema.sql index 171cb2d..02daa60 100644 --- a/cmso-database/src/main/resources/optimizer-dbchanges/onap-optimizer-v1-schema.sql +++ b/cmso-database/src/main/resources/optimizer-dbchanges/onap-optimizer-v1-schema.sql @@ -13,7 +13,7 @@ DEFAULT CHARACTER SET = utf8; CREATE TABLE IF NOT EXISTS `optimizer`.`response` ( uuid BINARY(16) NOT NULL, - repsonse LONGTEXT NULL DEFAULT NULL, + response LONGTEXT NULL DEFAULT NULL, delivered_time BIGINT(20) NULL DEFAULT NULL, PRIMARY KEY (`uuid`)) ENGINE = InnoDB diff --git a/cmso-optimizer/etc/config/README.txt b/cmso-optimizer/etc/config/README.txt new file mode 100644 index 0000000..f815955 --- /dev/null +++ b/cmso-optimizer/etc/config/README.txt @@ -0,0 +1,3 @@ +The files in this etc/config folder are here for testing locally on eclipse. + +The files actually deployed are elsewhere diff --git a/cmso-optimizer/etc/config/cadi.properties b/cmso-optimizer/etc/config/cadi.properties new file mode 100644 index 0000000..9a6b91c --- /dev/null +++ b/cmso-optimizer/etc/config/cadi.properties @@ -0,0 +1,21 @@ +#------------------------------------------------------------------------------- +# ============LICENSE_START============================================== +# Copyright (c) 2019 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. +# ============LICENSE_END================================================= +# +#------------------------------------------------------------------------------- +cadi_loglevel=DEBUG +cadi_prop_files=src/main/resources/aaf/org.onap.oof.props + diff --git a/cmso-optimizer/etc/config/optimizer.properties b/cmso-optimizer/etc/config/optimizer.properties new file mode 100644 index 0000000..7dc75f5 --- /dev/null +++ b/cmso-optimizer/etc/config/optimizer.properties @@ -0,0 +1,47 @@ +#------------------------------------------------------------------------------- +# ============LICENSE_START============================================== +# Copyright (c) 2019 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. +# ============LICENSE_END================================================= +# +#------------------------------------------------------------------------------- +### + +### MySQL DB. +spring.datasource.url=jdbc:mariadb://localhost:3306/optimizer +spring.datasource.driver-class-name=org.mariadb.jdbc.Driver +spring.datasource.username=root +spring.datasource.password=beer +cmso.database.password=beer + +spring.datasource.initialize=false +spring.datasource.tomcat.max-wait=10000 +spring.datasource.tomcat.initialSize=5 +spring.datasource.tomcat.max-active=25 +spring.datasource.tomcat.test-on-borrow=true + +spring.jpa.show-sql=true +spring.jpa.hibernate.ddl-auto=none +spring.jpa.hibernate.naming.strategy=org.hibernate.cfg.EJB3NamingStrategy +spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect +spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl +spring.jpa.hibernate.id.new_generator_mappings=false +hibernate.id.new_generator_mappings=false + +logging.level.org.hibernate.SQL=TRACE + +logging.level.org.hibernate=TRACE + + +cmso.topology.create.request.url=http://127.0.0.1:7998/topology/v1/current diff --git a/cmso-optimizer/pom.xml b/cmso-optimizer/pom.xml new file mode 100644 index 0000000..afa75f2 --- /dev/null +++ b/cmso-optimizer/pom.xml @@ -0,0 +1,520 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- ============LICENSE_START======================================================= + org.onap.optf.cmso ================================================================================ + Copyright © 2019 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========================================================= --> + + +<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> + + <parent> + <groupId>org.onap.optf.cmso</groupId> + <artifactId>cmso</artifactId> + <version>1.0.1-SNAPSHOT</version> + </parent> + + <groupId>org.onap.optf.cmso.optimizer</groupId> + <artifactId>cmso-optimizer</artifactId> + + <packaging>jar</packaging> + + <name>cmso</name> + + <properties> + <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format> + + <cmso.project.version>${project.version}</cmso.project.version> + <cmso.build.timestamp>${maven.build.timestamp}</cmso.build.timestamp> + + <service.name>cmso</service.name> + <release-tag>Dublin</release-tag> + <name.space>org.onap.optf.cmso</name.space> + <serviceArtifactName>cmso</serviceArtifactName> + + <java.version>1.8</java.version> + <eelf.version>1.0.0</eelf.version> + <pact.version>3.3.9</pact.version> + <spring.version>5.0.10.RELEASE</spring.version> + <spring.boot.version>2.1.3.RELEASE</spring.boot.version> + <swagger.core.version>2.0.0</swagger.core.version> + + <maven.compiler.target>1.8</maven.compiler.target> + <maven.compiler.source>1.8</maven.compiler.source> + <build.number>${maven.build.timestamp}</build.number> + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> + <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> + <maven.build.timestamp.format>yyyyMMdd'T'HHmmss'Z'</maven.build.timestamp.format> + <mariadb.version>2.2.1</mariadb.version> + <swagger.directory>${basedir}/src/main/resources/META-INF/resources/swagger/</swagger.directory> + <aaf.version>2.1.4</aaf.version> + + <!-- Sonar --> + <ilib.version>2.0.7</ilib.version> + <sonar.language>java</sonar.language> + <jacoco.path>${basedir}/target/jacoco_report</jacoco.path> + <jacoco.itPath>${basedir}/target/jacoco_itReport</jacoco.itPath> + <sonar.dynamicAnalysis>reuseReports</sonar.dynamicAnalysis> + <sonar.java.coveragePlugin>jacoco</sonar.java.coveragePlugin> + <sonar.jacoco.reportPath>${basedir}/target/jacoco-ut.exec</sonar.jacoco.reportPath> + <sonar.jacoco.itReportPath>${basedir}/target/jacoco-it.exec</sonar.jacoco.itReportPath> + <sonar.surefire.reportsPath>${basedir}/target/surefire-reports</sonar.surefire.reportsPath> + <sonar.failsafe.reportsPath>${basedir}/target/failsafe-reports</sonar.failsafe.reportsPath> + + <docker.push.registry>localhost:5000</docker.push.registry> + <docker.pull.registry>nexus3.onap.org:10001</docker.pull.registry> + <docker.skip.build>false</docker.skip.build> + <docker.skip.push>false</docker.skip.push> + <docker.skip.tag>false</docker.skip.tag> + <skip.staging.artifacts>false</skip.staging.artifacts> + + </properties> + + <dependencyManagement> + <dependencies> + <!-- Spring boot --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-dependencies</artifactId> + <version>${spring.boot.version}</version> + <type>pom</type> + <scope>import</scope> + </dependency> + </dependencies> + </dependencyManagement> + + <dependencies> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-actuator</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-jersey</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-security</artifactId> + </dependency> + <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-loader-tools</artifactId> + </dependency> --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-jpa</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-tomcat</artifactId> + </dependency> + <!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> + </dependency> --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + <exclusions> + <exclusion> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-aop</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-beans</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-core</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-expression</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-tx</artifactId> + </dependency> + <dependency> + <groupId>org.springframework</groupId> + <artifactId>spring-context-support</artifactId> + </dependency> + <dependency> + <groupId>com.att.eelf</groupId> + <artifactId>eelf-core</artifactId> + <version>${eelf.version}</version> + <exclusions> + <exclusion> + <groupId>org.mockito</groupId> + <artifactId>mockito-core</artifactId> + </exclusion> + <exclusion> + <groupId>org.powermock</groupId> + <artifactId>powermock-module</artifactId> + </exclusion> + <exclusion> + <groupId>org.powermock</groupId> + <artifactId>powermock-api-mockito</artifactId> + </exclusion> + <exclusion> + <groupId>org.powermock</groupId> + <artifactId>powermock-module-junit4</artifactId> + </exclusion> + + </exclusions> + </dependency> + <!-- <dependency> <groupId>org.onap.aaf.authz</groupId> <artifactId>aaf-cadi-aaf</artifactId> + <version>2.1.1</version> </dependency> --> + <dependency> + <groupId>javax.ws.rs</groupId> + <artifactId>javax.ws.rs-api</artifactId> + <version>2.1</version> + </dependency> + + <!--Swagger Dependencies --> + <dependency> + <groupId>io.swagger.core.v3</groupId> + <artifactId>swagger-jaxrs2</artifactId> + <version>${swagger.core.version}</version> + </dependency> + <dependency> + <groupId>io.swagger.core.v3</groupId> + <artifactId>swagger-jaxrs2-servlet-initializer</artifactId> + <version>${swagger.core.version}</version> + </dependency> + + <dependency> + <groupId>io.swagger</groupId> + <artifactId>swagger-jersey2-jaxrs</artifactId> + <version>1.5.0</version> + </dependency> + + + <!-- Database --> + <dependency> + <groupId>org.mariadb.jdbc</groupId> + <artifactId>mariadb-java-client</artifactId> + </dependency> + + <dependency> + <groupId>joda-time</groupId> + <artifactId>joda-time</artifactId> + </dependency> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-text</artifactId> + <version>1.6</version> + </dependency> + <!-- Testing Dependencies --> + <!-- <dependency> <groupId>org.powermock</groupId> <artifactId>powermock-api-mockito2</artifactId> + <version>1.7.4</version> <scope>test</scope> </dependency> --> + <dependency> + <groupId>org.mockito</groupId> + <artifactId>mockito-all</artifactId> + <version>1.9.5</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.jacoco</groupId> + <artifactId>jacoco-maven-plugin</artifactId> + <version>0.8.1</version> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.onap.aaf.authz</groupId> + <artifactId>aaf-cadi-aaf</artifactId> + <version>${aaf.version}</version> + </dependency> + </dependencies> + + <build> + <finalName>cmso-optimizer</finalName> + <plugins> + <plugin> + <groupId>au.com.dius</groupId> + <artifactId>pact-jvm-provider-maven_2.11</artifactId> + <version>${pact.version}</version> + <configuration> + <!--pactBrokerUrl,user name,password and project version required only + for consumer --> + <pactBrokerUrl>${BROKER_URL}</pactBrokerUrl> + <pactBrokerUsername>pactadmin</pactBrokerUsername> + <pactBrokerPassword>pactadmin</pactBrokerPassword> + <projectVersion>1.0.0</projectVersion> + <!-- service provider required only for producer --> + <serviceProviders> + <serviceProvider> + <name>core</name> + <protocol>http</protocol> + <host>${APP_URL}</host> + <port>${APP_PORT}</port> + <path>/</path> + <pactBroker> + <url>${BROKER_URL}</url> + <authentication> + <username>pactadmin</username> + <password>pactadmin</password> + </authentication> + </pactBroker> + </serviceProvider> + </serviceProviders> + </configuration> + </plugin> + <plugin> + <artifactId>maven-dependency-plugin</artifactId> + </plugin> + <plugin> + <groupId>com.github.kongchen</groupId> + <artifactId>swagger-maven-plugin</artifactId> + <version>3.1.5</version> + <configuration> + <apiSources> + <apiSource> + <locations> + <location>org.onap.optf.cmso.optimizer.service.rs</location> + </locations> + <basePath>/optimizer</basePath> + <info> + <title>${project.artifactId}</title> + <version>${project.version}</version> + </info> + <swaggerDirectory>${swagger.directory}</swaggerDirectory> + </apiSource> + </apiSources> + </configuration> + <executions> + <execution> + <phase>compile</phase> + <goals> + <goal>generate</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.codehaus.groovy.maven</groupId> + <artifactId>gmaven-plugin</artifactId> + <version>1.0</version> + <executions> + <execution> + <phase>validate</phase> + <goals> + <goal>execute</goal> + </goals> + <configuration> + <source>${project.basedir}/src/main/script/TagVersion.groovy</source> + </configuration> + </execution> + </executions> + </plugin> + <plugin> + <artifactId>exec-maven-plugin</artifactId> + <groupId>org.codehaus.mojo</groupId> + </plugin> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <version>${spring.boot.version}</version> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>io.fabric8</groupId> + <artifactId>docker-maven-plugin</artifactId> + <version>0.26.0</version> + <configuration> + <verbose>true</verbose> + <apiVersion>1.23</apiVersion> + <images> + <image> + <name>onap/optf-cmso-tciketmgt</name> + <alias>onap-optf-cmso-tciketmgt</alias> + <build> + <cleanup>true</cleanup> + <tags> + <tag>latest</tag> + <tag>${project.docker.latesttagtimestamp.version}</tag> + <tag>${project.docker.latesttag.version}</tag> + </tags> + <dockerFile>${project.basedir}/src/main/docker/Dockerfile</dockerFile> + <assembly> + <descriptor>${project.basedir}/src/main/docker/assembly/cmso-files.xml</descriptor> + <name>onap-cmso-optimizer</name> + </assembly> + </build> + </image> + </images> + </configuration> + <executions> + <execution> + <id>generate-images</id> + <phase>install</phase> + <goals> + <goal>build</goal> + </goals> + </execution> + <execution> + <id>push-images</id> + <phase>deploy</phase> + <goals> + <goal>build</goal> + <goal>push</goal> + </goals> + <configuration> + <image>onap/optf-cmso-optimizer:%l</image> + </configuration> + </execution> + </executions> + </plugin> + </plugins> + <!-- mention the logback.xml location through system property or environment + variable to edit logback.xml at run time --> + <resources> + <resource> + <directory>src/main/resources</directory> + <filtering>true</filtering> + <includes> + <include>**/*</include> + </includes> + </resource> + <resource> + <directory>etc/config</directory> + <filtering>true</filtering> + <includes> + <include>**/*</include> + </includes> + </resource> + <resource> + <directory>${basedir}/truststore</directory> + <targetPath>${basedir}/target/truststore</targetPath> + <filtering>true</filtering> + <includes> + <include>**/*</include> + </includes> + </resource> + <resource> + <directory>${basedir}/bin</directory> + <targetPath>${basedir}/target/bin</targetPath> + <filtering>true</filtering> + <includes> + <include>**/*</include> + </includes> + </resource> + <resource> + <directory>${basedir}/data</directory> + <targetPath>${basedir}/target/data</targetPath> + <filtering>true</filtering> + <includes> + <include>**/*</include> + </includes> + </resource> + </resources> + <pluginManagement> + <plugins> + <!--This plugin's configuration is used to store Eclipse m2e settings + only. It has no influence on the Maven build itself. --> + <plugin> + <groupId>org.eclipse.m2e</groupId> + <artifactId>lifecycle-mapping</artifactId> + <version>1.0.0</version> + <configuration> + <lifecycleMappingMetadata> + <pluginExecutions> + <pluginExecution> + <pluginExecutionFilter> + <groupId> + com.github.kongchen + </groupId> + <artifactId> + swagger-maven-plugin + </artifactId> + <versionRange> + [3.1.5] + </versionRange> + <goals> + <goal>generate</goal> + </goals> + </pluginExecutionFilter> + <action> + <ignore></ignore> + </action> + </pluginExecution> + </pluginExecutions> + </lifecycleMappingMetadata> + </configuration> + </plugin> + </plugins> + </pluginManagement> + </build> + + <profiles> + <profile> + <id>snapshot</id> + <activation> + <activeByDefault>true</activeByDefault> + </activation> + <properties> + <versionSuffix>-${build.number}-${release-tag}</versionSuffix> + </properties> + </profile> + <profile> + <id>next-stable</id> + <properties> + <versionSuffix>-${release-tag}</versionSuffix> + </properties> + </profile> + <profile> + <id>last-stable</id> + <properties> + <versionSuffix>-${release-tag}</versionSuffix> + </properties> + </profile> + </profiles> +</project> diff --git a/cmso-optimizer/src/main/docker/Dockerfile b/cmso-optimizer/src/main/docker/Dockerfile new file mode 100644 index 0000000..9ef42ab --- /dev/null +++ b/cmso-optimizer/src/main/docker/Dockerfile @@ -0,0 +1,33 @@ +FROM ubuntu:16.04 + +MAINTAINER "The Onap Team" +LABEL Description="This image contains ubuntu 16.04 with the openjdk installed" Version="16.04-8" +ENV APP_HOME=/opt/app/cmso +ARG http_proxy +ARG https_proxy +ENV HTTP_PROXY=$http_proxy +ENV HTTPS_PROXY=$https_proxy +ENV http_proxy=$HTTP_PROXY +ENV https_proxy=$HTTPS_PROXY + +RUN test -n "$http_proxy" && echo "Acquire::Proxy \"http://$http_proxy\";" > /etc/apt/apt.conf.d/02proxy || true && \ + apt-get update && \ + apt-get -y dist-upgrade && \ + apt-get install -y openjdk-8-jre-headless + +COPY onap-cmso-optimizer/cmso-optimizer.jar ${APP_HOME}/app.jar + +VOLUME /share/etc +VOLUME /share/logs +VOLUME /share/debug-logs + +COPY onap-cmso-optimizer/startService.sh ${APP_HOME}/startService.sh +COPY onap-cmso-optimizer/data ${APP_HOME}/data + +RUN chmod 700 ${APP_HOME}/startService.sh +RUN ln -s /share/etc ${APP_HOME}/etc +RUN ln -s /share/logs ${APP_HOME}/logs +RUN ln -s /share/debug-logs ${APP_HOME}/debug-logs + +WORKDIR ${APP_HOME} +ENTRYPOINT ./startService.sh diff --git a/cmso-optimizer/src/main/docker/assembly/cmso-files.xml b/cmso-optimizer/src/main/docker/assembly/cmso-files.xml new file mode 100644 index 0000000..37804ec --- /dev/null +++ b/cmso-optimizer/src/main/docker/assembly/cmso-files.xml @@ -0,0 +1,64 @@ +<!-- ============LICENSE_START======================================================= + ECOMP CMSO ================================================================================ + Copyright (C) 2019 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========================================================= --> + +<assembly + xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.1 http://maven.apache.org/xsd/assembly-1.1.1.xsd"> + <id>cmso-files</id> + + <formats> + <format>tar.gz</format> + </formats> + <includeBaseDirectory>false</includeBaseDirectory> + + + <fileSets> + <!-- include config files --> + <fileSet> + <includes> + <include>${project.build.finalName}.jar</include> + </includes> + <directory>${project.build.directory}</directory> + <outputDirectory>/</outputDirectory> + </fileSet> + <fileSet> + <includes> + <include>**</include> + </includes> + <directory>src/main/docker/extra-files</directory> + <outputDirectory>/</outputDirectory> + </fileSet> + <fileSet> + <includes> + <include>**</include> + </includes> + <directory>data</directory> + <outputDirectory>/data</outputDirectory> + </fileSet> + <fileSet> + <directory>${project.basedir}/src/main/resources</directory> + <outputDirectory>./resources</outputDirectory> + <includes> + <include>**/*</include> + </includes> + </fileSet> + <fileSet> + <directory>${project.basedir}/etc/config</directory> + <outputDirectory>./</outputDirectory> + <includes> + <include>**/*</include> + </includes> + </fileSet> + + </fileSets> + +</assembly> diff --git a/cmso-optimizer/src/main/docker/extra-files/startService.sh b/cmso-optimizer/src/main/docker/extra-files/startService.sh new file mode 100644 index 0000000..199c637 --- /dev/null +++ b/cmso-optimizer/src/main/docker/extra-files/startService.sh @@ -0,0 +1,7 @@ +#!/bin/sh + +VM_ARGS="${VM_ARGS} -Dserver.local.startpath=${RESOURCES_HOME}" + +echo "VM_ARGS="${VM_ARGS} + +java -Djava.security.egd=file:/dev/./urandom ${VM_ARGS} -Xms256m -Xmx1024m -jar ./app.jar diff --git a/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java b/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java new file mode 100644 index 0000000..0686f59 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/observations/Mdc.java @@ -0,0 +1,279 @@ +/* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.observations; + +import static com.att.eelf.configuration.Configuration.MDC_BEGIN_TIMESTAMP; +import static com.att.eelf.configuration.Configuration.MDC_END_TIMESTAMP; +import static com.att.eelf.configuration.Configuration.MDC_KEY_REQUEST_ID; +import static com.att.eelf.configuration.Configuration.MDC_PARTNER_NAME; +import static com.att.eelf.configuration.Configuration.MDC_REMOTE_HOST; +import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_CODE; +import static com.att.eelf.configuration.Configuration.MDC_RESPONSE_DESC; +import static com.att.eelf.configuration.Configuration.MDC_STATUS_CODE; +import static com.att.eelf.configuration.Configuration.MDC_TARGET_ENTITY; +import static com.att.eelf.configuration.Configuration.MDC_TARGET_SERVICE_NAME; + +import com.att.eelf.utils.Stopwatch; +import java.net.URI; +import java.util.Date; +import java.util.Map; +import java.util.UUID; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientResponseContext; +import javax.ws.rs.container.ContainerRequestContext; +import javax.ws.rs.container.ContainerResponseContext; +import javax.ws.rs.core.MultivaluedMap; +import javax.ws.rs.core.Response.StatusType; +import org.onap.observations.MessageHeaders.HeadersEnum; +import org.slf4j.MDC; + +/** + * ECOMP EELF logging MDC fields not defined in the MDC Configuration (i.e. MDC_ALERT_SEVERITY) + **/ +public class Mdc { + + /** The Constant SERVICE_NAME. */ + public static final String SERVICE_NAME = "CSS-Scheduler"; + + /** + * The Enum Enum. + */ + public enum Enum { + // BeginTimestamp, + // EndTimeStamp, + // RequestId, + // ServiceInstanceId, + VirtualServerName, + // ServiceName, + // PartnerName, + // StatusCOde, + // ResponseCode, + // ResponseDescription, + // InstanceUUID, + // AlertSeverity, + // ServerIPAddress, + // ElapsedTime, + // ServerFQDN, + // RemoteHost, + ClassName, + Unused, + // ProcessKey, + CustomField1, + CustomField2, + CustomField3, + CustomField4, + // TargetVirtualEntity, + // TargetEntity, + // TargetServiceName, + ErrorCode, + ErrorDescription, + Timer, + } + + /** + * Gets the caller. + * + * @param back the back + * @return the caller + */ + public static String getCaller(int back) { + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + return stackTraceElements[back].getClassName() + "." + stackTraceElements[back].getMethodName(); + } + + /** + * Sets the caller. + * + * @param back the new caller + */ + public static void setCaller(int back) { + String caller = MDC.get(Enum.ClassName.name()); + if (caller == null) { + MDC.put(Enum.ClassName.name(), getCaller(back)); + } + } + + /** + * Sets the observation. + * + * @param obs the new observation + */ + public static void setObservation(ObservationInterface obs) { + MDC.put(Enum.CustomField4.name(), obs.name()); + } + + /** + * Clear caller. + */ + public static void clearCaller() { + MDC.remove(Enum.ClassName.name()); + } + + + /** + * Save. + * + * @return the map + */ + public static Map<String, String> save() { + Map<String, String> save = MDC.getCopyOfContextMap(); + return save; + } + + /** + * Restore. + * + * @param mdcSave the mdc save + */ + public static void restore(Map<String, String> mdcSave) { + MDC.clear(); + for (String name : mdcSave.keySet()) { + MDC.put(name, mdcSave.get(name)); + } + } + + + + /** + * Sets the request id if not set. + * + * @param requestId the new request id if not set + */ + public static void setRequestIdIfNotSet(String requestId) { + if (MDC.get(MDC_KEY_REQUEST_ID) == null || MDC.get(MDC_KEY_REQUEST_ID).equals("")) { + setRequestId(requestId); + } + } + + /** + * Sets the request id. + * + * @param requestId the new request id + */ + public static void setRequestId(String requestId) { + MDC.put(MDC_KEY_REQUEST_ID, requestId); + } + + /** + * Metric start. + * + * @param requestContext the request context + */ + public static void metricStart(ClientRequestContext requestContext) { + MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date())); + MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP)); + setPartnerTargetFromUri(requestContext.getUri()); + } + + /** + * Metric end. + * + * @param response the response + */ + public static void metricEnd(ClientResponseContext response) { + + Date now = new Date(); + // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now)); + MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now)); + setResponseInfo(response.getStatusInfo()); + + } + + /** + * Audit start. + * + * @param requestContext the request context + * @param servletRequest the servlet request + */ + public static void auditStart(ContainerRequestContext requestContext, HttpServletRequest servletRequest) { + MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date())); + MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP)); + MDC.put(MDC_REMOTE_HOST, servletRequest.getRemoteHost()); + MDC.put(Enum.ClassName.name(), getCaller(4)); + MultivaluedMap<String, String> headers = requestContext.getHeaders(); + String transactionId = headers.getFirst(HeadersEnum.TransactionID.toString()); + if (transactionId != null) { + setRequestId(transactionId); + } else { + setRequestId(UUID.randomUUID().toString()); + } + + } + + /** + * Audit end. + * + * @param requestContext the request context + * @param response the response + */ + public static void auditEnd(ContainerRequestContext requestContext, ContainerResponseContext response) { + Date now = new Date(); + // MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(now)); + MDC.put(MDC_END_TIMESTAMP, Stopwatch.isoFormatter.format(now)); + MDC.put(Enum.ClassName.name(), getCaller(4)); + + setResponseInfo(response.getStatusInfo()); + + } + + private static void setResponseInfo(StatusType statusInfo) { + Integer status = statusInfo.getStatusCode(); + String completed = "ERROR"; + if (status >= 200 && status < 300) { + completed = "COMPLETE"; + } + MDC.put(MDC_RESPONSE_CODE, status.toString()); + MDC.put(MDC_RESPONSE_DESC, statusInfo.getReasonPhrase()); + MDC.put(MDC_STATUS_CODE, completed); + } + + /** + * Sets the event. + * + * @param requestId the new event + */ + public static void setEvent(String requestId) { + MDC.put(MDC_BEGIN_TIMESTAMP, Stopwatch.isoFormatter.format(new Date())); + MDC.put(MDC_END_TIMESTAMP, MDC.get(MDC_BEGIN_TIMESTAMP)); + setRequestId(requestId); + } + + private static void setPartnerTargetFromUri(URI uri) { + try { + MDC.put(MDC_PARTNER_NAME, uri.getHost()); + MDC.put(MDC_TARGET_ENTITY, uri.getScheme() + "://" + uri.getHost() + ":" + uri.getPort()); + MDC.put(MDC_TARGET_SERVICE_NAME, uri.getPath()); + } catch (Exception e) { + MDC.put(MDC_PARTNER_NAME, "UNKNOWN"); + MDC.put(MDC_TARGET_ENTITY, "UNKNOWN"); + MDC.put(MDC_TARGET_SERVICE_NAME, "UNKNOWN"); + } + } + + +} diff --git a/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java b/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java new file mode 100644 index 0000000..fe6cea2 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/observations/MessageHeaders.java @@ -0,0 +1,155 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.observations; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +/** + * The Class MessageHeaders. + */ +public class MessageHeaders { + + /** + * The Enum HeadersEnum. + */ + public enum HeadersEnum { + UNDEFINED("UNDEFINED"), + TransactionID("X-TransactionId"), + FromAppID("X-FromAppId"), + MinorVersion("X-MinorVersion"), + PatchVersion("X-PatchVersion"), + LatestVersion("X-LatestVersion"),; + + private final String text; + + private HeadersEnum(String text) { + this.text = text; + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + return text; + } + } + + /** The Constant supportedMajorVersions. */ + public static final Map<String, String> supportedMajorVersions = new HashMap<String, String>(); + + static { + supportedMajorVersions.put("v1", "0"); + supportedMajorVersions.put("v2", "0"); + } + + /** The Constant supportedMajorMinorVersions. */ + public static final Set<String> supportedMajorMinorVersions = new HashSet<String>(); + + static { + supportedMajorMinorVersions.add("v1.0"); + supportedMajorMinorVersions.add("v2.0"); + } + + /** The Constant latestVersion. */ + public static final String latestVersion = "2.0.0"; + + /** The Constant patchVersion. */ + public static final String patchVersion = "0"; + + /** + * From string. + * + * @param text the text + * @return the headers enum + */ + public static HeadersEnum fromString(String text) { + for (HeadersEnum e : HeadersEnum.values()) { + if (e.text.equals(text)) { + return e; + } + } + return HeadersEnum.UNDEFINED; + } + + /** + * Gets the patch version. + * + * @return the patch version + */ + public static String getPatchVersion() { + return patchVersion; + } + + /** + * Gets the latest version. + * + * @return the latest version + */ + public static String getLatestVersion() { + return latestVersion; + } + + /** + * Validate major version. + * + * @param major the major + * @return true, if successful + */ + public static boolean validateMajorVersion(String major) { + String majorKey = major.toLowerCase(); + if (!supportedMajorVersions.containsKey(majorKey)) { + return false; + } + return true; + } + + /** + * Validate major minor version. + * + * @param major the major + * @param minor the minor + * @return true, if successful + */ + public static boolean validateMajorMinorVersion(String major, String minor) { + String majorKey = major.toLowerCase(); + if (!supportedMajorVersions.containsKey(majorKey)) { + return false; + } + + if (minor != null) { + String majorMinorKey = majorKey + "." + minor; + return supportedMajorMinorVersions.contains(majorMinorKey); + } + return true; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/observations/Observation.java b/cmso-optimizer/src/main/java/org/onap/observations/Observation.java new file mode 100644 index 0000000..05fe983 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/observations/Observation.java @@ -0,0 +1,129 @@ +/* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.observations; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import org.apache.log4j.Level; +import org.onap.optf.cmso.optimizer.Application; + + +/** + * The Class Observation. + */ +public class Observation { + private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class); + private static EELFLogger metrics = EELFManager.getInstance().getMetricsLogger(); + private static EELFLogger audit = EELFManager.getInstance().getAuditLogger(); + private static EELFLogger errors = EELFManager.getInstance().getErrorLogger(); + private static EELFLogger debug = EELFManager.getInstance().getDebugLogger(); + + /** + * Report. + * + * @param obs the o + * @param execpt the e + * @param arguments the arguments + */ + // ************************************************************************************************* + public static void report(ObservationInterface obs, Exception execpt, String... arguments) { + Mdc.setCaller(4); + Mdc.setObservation(obs); + if (obs.getAudit()) { + audit.info(obs, execpt, arguments); + } + if (obs.getMetric()) { + metrics.info(obs, execpt, arguments); + } + Level lev = obs.getLevel(); + switch (lev.toInt()) { + case Level.WARN_INT: + errors.warn(obs, arguments); + debug.debug(obs, execpt, arguments); + break; + case Level.INFO_INT: + log.info(obs, execpt, arguments); + debug.debug(obs, execpt, arguments); + break; + case Level.ERROR_INT: + errors.error(obs, arguments); + debug.debug(obs, execpt, arguments); + break; + case Level.TRACE_INT: + debug.trace(obs, execpt, arguments); + break; + case Level.DEBUG_INT: + debug.debug(obs, execpt, arguments); + break; + default: + log.info(obs, execpt, arguments); + } + Mdc.clearCaller(); + } + + /** + * Report. + * + * @param obs the o + * @param arguments the arguments + */ + public static void report(ObservationInterface obs, String... arguments) { + Mdc.setCaller(4); + Mdc.setObservation(obs); + if (obs.getAudit()) { + audit.info(obs, arguments); + } + if (obs.getMetric()) { + metrics.info(obs, arguments); + } + Level levl = obs.getLevel(); + switch (levl.toInt()) { + case Level.WARN_INT: + errors.warn(obs, arguments); + debug.debug(obs, arguments); + break; + case Level.INFO_INT: + log.info(obs, arguments); + debug.debug(obs, arguments); + break; + case Level.ERROR_INT: + errors.error(obs, arguments); + debug.debug(obs, arguments); + break; + case Level.TRACE_INT: + debug.debug(obs, arguments); + break; + case Level.DEBUG_INT: + debug.debug(obs, arguments); + break; + default: + log.info(obs, arguments); + } + Mdc.clearCaller(); + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java b/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java new file mode 100644 index 0000000..0dce93d --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/observations/ObservationInterface.java @@ -0,0 +1,49 @@ +/* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.observations; + +import com.att.eelf.i18n.EELFResolvableErrorEnum; +import javax.ws.rs.core.Response.Status; +import org.apache.log4j.Level; + +public interface ObservationInterface extends EELFResolvableErrorEnum { + public Enum<?> getValue(); + + public Level getLevel(); + + public String getMessage(); + + public Status getStatus(); + + public String getDomain(); + + public String name(); + + public Boolean getAudit(); + + public Boolean getMetric(); +} diff --git a/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java b/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java new file mode 100644 index 0000000..f1c1277 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/observations/ObservationObject.java @@ -0,0 +1,198 @@ +/* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.observations; + +import com.att.eelf.i18n.EELFResolvableErrorEnum; +import com.att.eelf.i18n.EELFResourceManager; +import javax.ws.rs.core.Response.Status; +import org.apache.log4j.Level; + + +/** + * The Class ObservationObject. + */ +public class ObservationObject implements ObservationInterface { + + // ************************************************************************************************* + // Interface class that matches the ObservationInteface pattern + // This will be used in case we decide to provide external overrides and we need to instantiate + // For now, we'll just use the Enum itself. + // + // + private Enum<?> value = null; + + private Level level = null; + private String message = null; + private Status status = null; + private String domain = null; + private Boolean metric = false; + private Boolean audit = false; + + /** + * Instantiates a new observation object. + * + * @param obs the o + */ + public ObservationObject(ObservationInterface obs) { + this.value = obs.getValue(); + this.level = obs.getLevel(); + this.message = obs.getMessage(); + this.status = obs.getStatus(); + this.domain = obs.getDomain(); + this.metric = obs.getMetric(); + this.audit = obs.getAudit(); + + } + + /** + * Gets the value. + * + * @return the value + */ + @Override + public Enum<?> getValue() { + return value; + } + + /** + * Gets the message. + * + * @return the message + */ + @Override + public String getMessage() { + return message; + } + + /** + * Gets the status. + * + * @return the status + */ + @Override + public Status getStatus() { + return status; + } + + /** + * Gets the domain. + * + * @return the domain + */ + @Override + public String getDomain() { + return domain; + } + + /** + * Gets the level. + * + * @return the level + */ + @Override + public Level getLevel() { + return level; + } + + /** + * Name. + * + * @return the string + */ + @Override + public String name() { + return value.name(); + } + + /** + * Gets the audit. + * + * @return the audit + */ + @Override + public Boolean getAudit() { + return audit; + } + + /** + * Gets the metric. + * + * @return the metric + */ + @Override + public Boolean getMetric() { + return metric; + } + + /** + * Gets the message. + * + * @param arguments the arguments + * @return the message + */ + public String getMessagef(String... arguments) { + return EELFResourceManager.format((EELFResolvableErrorEnum) value, arguments); + } + + /** + * Sets the value. + * + * @param value the new value + */ + public void setValue(Enum<?> value) { + this.value = value; + } + + /** + * Sets the level. + * + * @param level the new level + */ + public void setLevel(Level level) { + this.level = level; + } + + /** + * Sets the message. + * + * @param message the new message + */ + public void setMessage(String message) { + this.message = message; + } + + /** + * Sets the status. + * + * @param status the new status + */ + public void setStatus(Status status) { + this.status = status; + } + + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java new file mode 100644 index 0000000..5f873e3 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/CmsoEnvironmentPostProcessor.java @@ -0,0 +1,65 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso; + +import java.util.HashMap; +import java.util.Map; +import org.onap.optf.cmso.common.PropertiesManagement; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; + +/** + * The Class CMSEnvironmentPostProcessor. + */ +public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor { + // tested in ONAP springboot and this is called before all of the properties files have been + // loaded... + // perhaps there is a post post processor? Until this works. DB password will be in the clear in the + /** + * Post process environment. + * + * @param environment the environment + * @param application the application + */ + // proeprties files. + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + String pwd = environment.getProperty("cmso.database.password"); + if (pwd != null) { + pwd = PropertiesManagement.getDecryptedValue(pwd); + Map<String, Object> map = new HashMap<String, Object>(); + map.put("spring.datasource.password", pwd); + MapPropertySource propertySource = new MapPropertySource("abc", map); + MutablePropertySources proeprtySources = environment.getPropertySources(); + proeprtySources.addLast(propertySource); + } + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java new file mode 100644 index 0000000..ba9aa6d --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafAuthorizationFilter.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import java.io.IOException; +import java.util.List; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.onap.aaf.cadi.CadiWrap; +import org.onap.aaf.cadi.Permission; +import org.onap.observations.Observation; +import org.onap.optf.cmso.common.exceptions.CmsoException; +import org.onap.optf.cmso.optimizer.SpringProfiles; +import org.onap.optf.cmso.optimizer.common.LogMessages; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +/** + * AAF authorization filter. + */ + +@Component +@Profile(SpringProfiles.AAF_AUTHENTICATION) +public class AafAuthorizationFilter extends OrderedRequestContextFilter { + + @Autowired + AafUserRoleProperties userRoleProperties; + + /** + * Instantiates a new aaf authorization filter. + */ + public AafAuthorizationFilter() { + this.setOrder(FilterPriority.AAF_AUTHORIZATION.getPriority()); + + + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + try { + if (request instanceof CadiWrap) { + CadiWrap cw = (CadiWrap) request; + List<Permission> perms = cw.getPermissions(cw.getUserPrincipal()); + if (userRoleProperties.processPermissions(request, perms)) { + filterChain.doFilter(request, response); + } else { + Observation.report(LogMessages.UNAUTHORIZED); + ResponseFormatter.errorResponse(request, response, new CmsoException( + LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, "")); + } + } else { + throw new Exception(); + } + } catch (Exception e) { + Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + ResponseFormatter.errorResponse(request, response, + new CmsoException(LogMessages.UNAUTHORIZED.getStatus(), LogMessages.UNAUTHORIZED, "")); + } + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java new file mode 100644 index 0000000..246c396 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafFilter.java @@ -0,0 +1,81 @@ +/******************************************************************************* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import java.io.IOException; +import java.util.Properties; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.onap.aaf.cadi.PropAccess; +import org.onap.aaf.cadi.filter.CadiFilter; +import org.onap.observations.Observation; +import org.onap.optf.cmso.common.exceptions.CmsoException; +import org.onap.optf.cmso.optimizer.Application; +import org.onap.optf.cmso.optimizer.SpringProfiles; +import org.onap.optf.cmso.optimizer.common.LogMessages; +import org.springframework.boot.web.servlet.filter.OrderedRequestContextFilter; +import org.springframework.context.annotation.Profile; +import org.springframework.stereotype.Component; + +/** + * AAF authentication filter. + */ + +@Component +@Profile(SpringProfiles.AAF_AUTHENTICATION) +public class AafFilter extends OrderedRequestContextFilter { + + private final CadiFilter cadiFilter; + + /** + * Instantiates a new aaf filter. + * + * @throws IOException Signals that an I/O exception has occurred. + * @throws ServletException the servlet exception + */ + public AafFilter() throws IOException, ServletException { + Properties cadiProperties = new Properties(); + cadiProperties.load(Application.class.getClassLoader().getResourceAsStream("cadi.properties")); + cadiFilter = new CadiFilter(new PropAccess(cadiProperties)); + this.setOrder(FilterPriority.AAF_AUTHENTICATION.getPriority()); + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws IOException, ServletException { + cadiFilter.doFilter(request, response, filterChain); + if (response.getStatus() == 401) { + Observation.report(LogMessages.UNAUTHENTICATED); + ResponseFormatter.errorResponse(request, response, + new CmsoException(LogMessages.UNAUTHENTICATED.getStatus(), LogMessages.UNAUTHENTICATED, "")); + } + } + + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java new file mode 100644 index 0000000..db58156 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafPerm.java @@ -0,0 +1,137 @@ +/******************************************************************************* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import java.util.HashSet; +import java.util.Set; +import org.onap.aaf.cadi.aaf.AAFPermission; + + +/** + * The Class AafPerm. + */ +public class AafPerm { + private String type; + private String instance; + private String action; + private Set<String> actions = new HashSet<>(); + + /** + * Gets the action. + * + * @return the action + */ + public String getAction() { + return action; + } + + /** + * Sets the action. + * + * @param action the new action + */ + public void setAction(String action) { + this.action = action; + String[] list = action.split(","); + for (String a : list) { + actions.add(a); + } + } + + /** + * Gets the type. + * + * @return the type + */ + public String getType() { + return type; + } + + /** + * Sets the type. + * + * @param type the new type + */ + public void setType(String type) { + this.type = type; + } + + /** + * Gets the single instance of AafPerm. + * + * @return single instance of AafPerm + */ + public String getInstance() { + return instance; + } + + /** + * Sets the instance. + * + * @param instance the new instance + */ + public void setInstance(String instance) { + this.instance = instance; + } + + /** + * Gets the actions. + * + * @return the actions + */ + public Set<String> getActions() { + return actions; + } + + /** + * Sets the actions. + * + * @param actions the new actions + */ + public void setActions(Set<String> actions) { + this.actions = actions; + } + + /** + * Matches. + * + * @param userPerm the user perm + * @return true, if successful + */ + public boolean matches(AAFPermission userPerm) { + if (type.equals(userPerm.getType())) { + if (userPerm.getInstance().equals("*") || instance.equals("*") || userPerm.getInstance().equals(instance)) { + for (String userAction : userPerm.getAction().split(",")) { + if (userAction.equals("*") || actions.contains("*") || actions.contains(userAction)) { + return true; + } + } + } + } + return false; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java new file mode 100644 index 0000000..38e9af4 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafSecurityConfig.java @@ -0,0 +1,56 @@ +/* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import org.onap.optf.cmso.optimizer.SpringProfiles; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +@ComponentScan("org.onap.optf") +@Profile(SpringProfiles.AAF_AUTHENTICATION) +public class AafSecurityConfig extends WebSecurityConfigurerAdapter { + + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http.csrf().disable(); + + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java new file mode 100644 index 0000000..65decec --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRole.java @@ -0,0 +1,176 @@ +/******************************************************************************* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import java.util.ArrayList; +import java.util.List; + +/** + * The Class AafUserRole. + */ +public class AafUserRole { + private String url = ""; + private String[] pathParts = {}; + private String perm = ""; + private String method = ""; + private List<AafPerm> aafPerms = new ArrayList<>(); + + /** + * Instantiates a new aaf user role. + * + * @param url the url + * @param perm the perm + */ + public AafUserRole(String url, String perm) { + this.setUrl(url); + this.setPerm(perm); + pathParts = url.split("\\/"); + + String[] perms = perm.split(","); + for (String p : perms) { + String[] parts = p.split(" "); + if (parts.length == 2) { + method = parts[1]; + } else { + method = "ALL"; + } + + String[] list = parts[0].split("\\|"); + if (list.length == 3) { + AafPerm aafPerm = new AafPerm(); + aafPerm.setAction(list[2]); + aafPerm.setInstance(list[1]); + aafPerm.setType(list[0]); + aafPerms.add(aafPerm); + } + } + } + + /** + * Gets the url. + * + * @return the url + */ + public String getUrl() { + return url; + } + + /** + * Sets the url. + * + * @param url the new url + */ + public void setUrl(String url) { + this.url = url; + } + + /** + * Gets the perm. + * + * @return the perm + */ + public String getPerm() { + return perm; + } + + /** + * Sets the perm. + * + * @param perm the new perm + */ + public void setPerm(String perm) { + this.perm = perm; + } + + /** + * Gets the aaf perms. + * + * @return the aaf perms + */ + public List<AafPerm> getAafPerms() { + return aafPerms; + } + + /** + * Sets the aaf perms. + * + * @param aafPerms the new aaf perms + */ + public void setAafPerms(List<AafPerm> aafPerms) { + this.aafPerms = aafPerms; + } + + /** + * Matches. + * + * @param path the path + * @param matchMethod the match method + * @return true, if successful + */ + public boolean matches(String path, String matchMethod) { + if (!this.method.equalsIgnoreCase("ALL") && !this.method.equals("*") && !this.method.equals(matchMethod)) { + return false; + } + List<String> inNodes = new ArrayList<>(); + List<String> matchNodes = new ArrayList<>(); + String[] pathList = path.split("\\/"); + for (String n : pathList) { + inNodes.add(n); + } + for (String n : pathParts) { + matchNodes.add(n); + } + + while (!inNodes.isEmpty() && !matchNodes.isEmpty()) { + String inNode = inNodes.remove(0); + String matchNode = matchNodes.get(0); + if (matchNode.equals(inNode) || matchNode.equals("*")) { + matchNodes.remove(0); + } else { + if (!matchNode.equals("**")) { + return false; + } + } + } + + // + if (inNodes.isEmpty() && matchNodes.isEmpty()) { + return true; + } + + // We have incoming nodes remaining, see if we can wildcard them + if (matchNodes.size() == 1) { + if (matchNodes.get(0).equals("**")) { + return true; + } + if (inNodes.size() == 1 && matchNodes.get(0).equals("*")) { + return true; + } + } + return false; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java new file mode 100644 index 0000000..171a11f --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/AafUserRoleProperties.java @@ -0,0 +1,133 @@ +/******************************************************************************* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import java.io.File; +import java.io.FileInputStream; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; +import org.onap.aaf.cadi.Permission; +import org.onap.aaf.cadi.aaf.AAFPermission; +import org.onap.observations.Observation; +import org.onap.optf.cmso.optimizer.SpringProfiles; +import org.onap.optf.cmso.optimizer.common.LogMessages; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * This class uses a properties file to map URL patterns/method to AAF Permissions (AafPerm). + * + * @author jf9860 + * + */ +@Component +@Profile(SpringProfiles.AAF_AUTHENTICATION) +public class AafUserRoleProperties { + @Autowired + Environment env; + + private List<AafUserRole> list = new ArrayList<>(); + + /** + * Initialize permissions. + */ + @PostConstruct + public void initializePermissions() { + String userRolePropertiesName = + env.getProperty("aaf.user.roles", "src/main/resources/aaf/AAFUserRoles.properties"); + Properties props = new Properties(); + try { + props.load(new FileInputStream(new File(userRolePropertiesName))); + } catch (Exception e) { + Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + } + for (Object url : props.keySet()) { + Object value = props.get(url); + list.add(new AafUserRole((String) url, (String) value)); + } + } + + /** + * Gets the for url method. + * + * @param url the url + * @param method the method + * @return the for url method + */ + public List<AafUserRole> getForUrlMethod(String url, String method) { + List<AafUserRole> userRoleList = new ArrayList<>(); + for (AafUserRole aur : list) { + if (aur.matches(url, method)) { + userRoleList.add(aur); + } + } + return userRoleList; + } + + /** + * Process permissions. + * + * @param request the request + * @param userPerms the user perms + * @return true, if successful + */ + public boolean processPermissions(HttpServletRequest request, List<Permission> userPerms) { + try { + // Get list of perms that match incoming URL. May be more than 1... + // Users perms must match all that match URL + List<AafUserRole> perms = getForUrlMethod(request.getRequestURI(), request.getMethod()); + int tested = 0; + int passed = 0; + for (AafUserRole perm : perms) { + for (AafPerm test : perm.getAafPerms()) { + tested++; + for (Permission userPerm : userPerms) { + + if (test.matches((AAFPermission) userPerm)) { + passed++; + break; + } + } + } + } + // All permissions must be OK + if (tested > 0 && tested == passed) { + return true; + } else { + return false; + } + } catch (Exception e) { + Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + } + return false; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java new file mode 100644 index 0000000..bfafbd8 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/FilterPriority.java @@ -0,0 +1,42 @@ +/******************************************************************************* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import org.springframework.core.Ordered; + +public enum FilterPriority { + AAF_AUTHENTICATION(Ordered.HIGHEST_PRECEDENCE), AAF_AUTHORIZATION(Ordered.HIGHEST_PRECEDENCE + 1); + private final int priority; + + FilterPriority(final int ppri) { + priority = ppri; + } + + public int getPriority() { + return priority; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java new file mode 100644 index 0000000..518814e --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/aaf/ResponseFormatter.java @@ -0,0 +1,45 @@ +/******************************************************************************* + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.aaf; + +import java.io.IOException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.onap.optf.cmso.common.exceptions.CmsoException; + +class ResponseFormatter { + + + static void errorResponse(HttpServletRequest request, HttpServletResponse response, CmsoException error) + throws IOException { + response.setStatus(error.getStatus().getStatusCode()); + response.getWriter().write(error.getRequestError().toString()); + response.getWriter().flush(); + response.getWriter().close(); + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java new file mode 100644 index 0000000..4c85246 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/BasicAuthenticatorFilter.java @@ -0,0 +1,111 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.common; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.client.ClientRequestContext; +import javax.ws.rs.client.ClientRequestFilter; +import javax.ws.rs.core.MultivaluedMap; +import javax.xml.bind.DatatypeConverter; + +/** + * The Class BasicAuthenticatorFilter. + */ +public class BasicAuthenticatorFilter implements ClientRequestFilter { + private static EELFLogger log = EELFManager.getInstance().getLogger(BasicAuthenticatorFilter.class); + private final String user; + private final String password; + + /** + * Instantiates a new basic authenticator filter. + * + * @param user the user + * @param password the password + */ + public BasicAuthenticatorFilter(String user, String password) { + this.user = user; + this.password = password; + log.info("user: " + user + " pass:" + password); + } + + /** + * Filter. + * + * @param requestContext the request context + * @throws IOException Signals that an I/O exception has occurred. + */ + @Override + public void filter(ClientRequestContext requestContext) throws IOException { + MultivaluedMap<String, Object> headers = requestContext.getHeaders(); + final String basicAuthentication = getBasicAuthentication(); + headers.add("Authorization", basicAuthentication); + } + + private String getBasicAuthentication() { + String token = this.user + ":" + this.password; + try { + return "Basic " + DatatypeConverter.printBase64Binary(token.getBytes("UTF-8")); + } catch (UnsupportedEncodingException ex) { + throw new IllegalStateException("Cannot encode with UTF-8", ex); + } + } + + /** + * Gets the user. + * + * @param request the request + * @return the user + */ + public static String getUser(HttpServletRequest request) { + String user = ""; + String header = request.getHeader("Authorization"); + if (header != null) { + String[] auth = header.split("Basic "); + if (auth.length == 2) { + String token = getToken(auth[1]); + if (token.contains(":")) { + String[] tokens = token.split(":"); + user = tokens[0]; + } + } + } + return user; + } + + private static String getToken(String auth) { + try { + String token = new String(DatatypeConverter.parseBase64Binary(auth)); + return token; + } catch (Exception e) { + return auth; + } + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java new file mode 100644 index 0000000..d56a992 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/CmsoRequestError.java @@ -0,0 +1,103 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.common; + +import com.fasterxml.jackson.annotation.JsonProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +/** + * The Class CMSRequestError. + */ +public class CmsoRequestError implements Serializable { + private static final long serialVersionUID = 1L; + @JsonProperty + RequestError requestError; + + /** + * Instantiates a new CMS request error. + * + * @param messageId the message id + * @param text the text + * @param variables the variables + */ + public CmsoRequestError(String messageId, String text, List<String> variables) { + requestError = new RequestError(messageId, text, variables); + } + + /** + * Instantiates a new CMS request error. + * + * @param messageId the message id + * @param text the text + */ + public CmsoRequestError(String messageId, String text) { + requestError = new RequestError(messageId, text, new ArrayList<String>()); + } + + /** + * The Class RequestError. + */ + public class RequestError { + @JsonProperty + private String messageId; + @JsonProperty + private String text; + @JsonProperty + private List<String> variables; + + private RequestError(String messageId, String text, List<String> variables) { + this.messageId = "CMSO." + messageId; + this.text = text; + this.variables = variables; + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append(messageId).append(":").append(text).append(":").append(variables); + return sb.toString(); + + } + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + return requestError.toString(); + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java new file mode 100644 index 0000000..79a0a79 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/PropertiesManagement.java @@ -0,0 +1,135 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.common; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import javax.crypto.Cipher; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import org.apache.commons.codec.binary.Base64; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +/** + * The Class PropertiesManagement. + */ +@Component +public class PropertiesManagement { + + private static EELFLogger debug = EELFManager.getInstance().getDebugLogger(); + private static EELFLogger errors = EELFManager.getInstance().getErrorLogger(); + + private static final String algorithm = "AES"; + + private static final String cipherMode = "CBC"; + + private static final String paddingScheme = "PKCS5Padding"; + + private static final String transformation = algorithm + "/" + cipherMode + "/" + paddingScheme; + + private static final String initVector = "ONAPCMSOVECTORIV"; // 16 bytes IV + + @Autowired + Environment env; + + /** + * Gets the property. + * + * @param key the key + * @param defaultValue the default value + * @return the property + */ + public String getProperty(String key, String defaultValue) { + String value = env.getProperty(key, defaultValue); + value = getDecryptedValue(value); + return value; + } + + /** + * Gets the decrypted value. + * + * @param value the value + * @return the decrypted value + */ + public static String getDecryptedValue(String value) { + if (value.startsWith("enc:")) { + String secret = getSecret(); + value = decrypt(secret, initVector, value.substring(4)); + } + return value; + } + + /** + * Gets the encrypted value. + * + * @param value the value + * @return the encrypted value + */ + public static String getEncryptedValue(String value) { + String secret = getSecret(); + value = encrypt(secret, initVector, value); + return value; + } + + private static final String encrypt(String key, String initVector, String value) { + try { + IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); + SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); + Cipher cipher = Cipher.getInstance(transformation); + cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv); + byte[] encrypted = cipher.doFinal(value.getBytes()); + return Base64.encodeBase64String(encrypted); + } catch (Exception ex) { + errors.error("Unexpected exception {0}", ex.getMessage()); + debug.debug("Unexpected exception", ex); + } + + return null; + } + + private static final String decrypt(String key, String initVector, String encrypted) { + try { + IvParameterSpec iv = new IvParameterSpec(initVector.getBytes("UTF-8")); + SecretKeySpec skeySpec = new SecretKeySpec(key.getBytes("UTF-8"), "AES"); + Cipher cipher = Cipher.getInstance(transformation); + cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv); + byte[] original = cipher.doFinal(Base64.decodeBase64(encrypted)); + return new String(original); + } catch (Exception ex) { + errors.error("Unexpected exception {0}", ex.getMessage()); + debug.debug("Unexpected exception", ex); + } + return null; + } + + private static String getSecret() { + return "ONAPCMSOSECRETIV"; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java new file mode 100644 index 0000000..a83437f --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/common/exceptions/CmsoException.java @@ -0,0 +1,99 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.common.exceptions; + +import com.att.eelf.i18n.EELFResourceManager; +import java.util.ArrayList; +import java.util.List; +import javax.ws.rs.core.Response.Status; +import org.onap.observations.ObservationInterface; +import org.onap.optf.cmso.common.CmsoRequestError; + +/** + * The Class CMSException. + */ +public class CmsoException extends Exception { + private static final long serialVersionUID = 1L; + + protected CmsoRequestError requestError = null; + private List<String> variables = new ArrayList<String>(); + protected ObservationInterface messageCode; + protected Status status; + + /** + * Instantiates a new CMS exception. + * + * @param status the status + * @param messageCode the message code + * @param args the args + */ + public CmsoException(Status status, ObservationInterface messageCode, String... args) { + super(EELFResourceManager.format(messageCode, args)); + this.status = status; + this.messageCode = messageCode; + for (String arg : args) { + variables.add(arg); + } + requestError = new CmsoRequestError(messageCode.name(), getMessage(), variables); + } + + /** + * Gets the status. + * + * @return the status + */ + public Status getStatus() { + return status; + } + + /** + * Gets the message code. + * + * @return the message code + */ + public ObservationInterface getMessageCode() { + return messageCode; + } + + /** + * Gets the variables. + * + * @return the variables + */ + public String[] getVariables() { + return variables.toArray(new String[variables.size()]); + } + + /** + * Gets the request error. + * + * @return the request error + */ + public CmsoRequestError getRequestError() { + return requestError; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/Application.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/Application.java new file mode 100644 index 0000000..e4bcc1d --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/Application.java @@ -0,0 +1,94 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer; + +import com.att.eelf.configuration.Configuration; +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.net.InetAddress; +import java.util.TimeZone; +import javax.annotation.PostConstruct; +import org.onap.optf.cmso.optimizer.common.LogMessages; +import org.slf4j.MDC; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.builder.SpringApplicationBuilder; +import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory; +import org.springframework.boot.web.servlet.server.ServletWebServerFactory; +import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; + +@SpringBootApplication +@ComponentScan(basePackages = {"org.onap.optf.cmso"}) +@EnableAsync + +@EnableAutoConfiguration(exclude = {/* DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class */} ) +public class Application extends SpringBootServletInitializer { + + private static EELFLogger log = EELFManager.getInstance().getLogger(Application.class); + + @Override + protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { + return application.sources(Application.class); + } + + @PostConstruct + void started() { + // Make sure all datetimes are stored in UTC format. + TimeZone.setDefault(TimeZone.getTimeZone("UTC")); + } + + public static void main(String[] args) { + initMdcData(); + SpringApplication.run(Application.class, args); + } + + protected static void initMdcData() { + MDC.clear(); + try { + MDC.put(Configuration.MDC_SERVER_FQDN, InetAddress.getLocalHost().getHostName()); + MDC.put("hostname", InetAddress.getLocalHost().getCanonicalHostName()); + MDC.put("serviceName", System.getProperty("info.build.artifact")); + MDC.put("version", System.getProperty("info.build.version")); + MDC.put(Configuration.MDC_SERVER_IP_ADDRESS, InetAddress.getLocalHost().getHostAddress()); + } catch (Exception e) { + log.error(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + } + } + + @Bean + public ServletWebServerFactory servletContainer() { + TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory(); + return tomcat; + } + + + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/ApplicationPropertiesFiles.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/ApplicationPropertiesFiles.java new file mode 100644 index 0000000..283c19e --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/ApplicationPropertiesFiles.java @@ -0,0 +1,37 @@ +/* + * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer; + +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; + + +@Configuration +@PropertySources({@PropertySource("file:etc/config/optimizer.properties"),}) +public class ApplicationPropertiesFiles { +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/AuthProvider.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/AuthProvider.java new file mode 100644 index 0000000..ba763fa --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/AuthProvider.java @@ -0,0 +1,58 @@ +/* + * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2019 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer; + +import java.util.ArrayList; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Profile; +import org.springframework.core.env.Environment; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +@Component +@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION) + +public class AuthProvider implements AuthenticationProvider { + + @Autowired + Environment env; + + @Override + public Authentication authenticate(Authentication authentication) { + String name = authentication.getName(); + String password = authentication.getCredentials().toString(); + // TODO check credentials until we enable AAF + return new UsernamePasswordAuthenticationToken(name, password, new ArrayList<>()); + } + + @Override + public boolean supports(Class<?> authentication) { + return authentication.equals(UsernamePasswordAuthenticationToken.class); + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/CmsoEnvironmentPostProcessor.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/CmsoEnvironmentPostProcessor.java new file mode 100644 index 0000000..5e425d0 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/CmsoEnvironmentPostProcessor.java @@ -0,0 +1,56 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer; + +import java.util.HashMap; +import java.util.Map; +import org.onap.optf.cmso.common.PropertiesManagement; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.env.EnvironmentPostProcessor; +import org.springframework.core.env.ConfigurableEnvironment; +import org.springframework.core.env.MapPropertySource; +import org.springframework.core.env.MutablePropertySources; + +public class CmsoEnvironmentPostProcessor implements EnvironmentPostProcessor { + // TODO tested in ONAP springboot and this is called before all of the properties files have been + // loaded... + // perhaps there is a post post processor? Until this works. DB password will be in the clear in the + // proeprties files. + @Override + public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { + String pwd = environment.getProperty("cmso.database.password"); + if (pwd != null) { + pwd = PropertiesManagement.getDecryptedValue(pwd); + Map<String, Object> map = new HashMap<String, Object>(); + map.put("spring.datasource.password", pwd); + MapPropertySource propertySource = new MapPropertySource("abc", map); + MutablePropertySources proeprtySources = environment.getPropertySources(); + proeprtySources.addLast(propertySource); + } + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/JerseyConfiguration.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/JerseyConfiguration.java new file mode 100644 index 0000000..fb8191b --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/JerseyConfiguration.java @@ -0,0 +1,106 @@ +/* + * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.MapperFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.SerializationFeature; +import java.util.logging.Logger; +import javax.ws.rs.ApplicationPath; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import org.glassfish.jersey.client.ClientConfig; +import org.glassfish.jersey.logging.LoggingFeature; +import org.glassfish.jersey.server.ResourceConfig; +import org.glassfish.jersey.servlet.ServletProperties; +import org.onap.optf.cmso.optimizer.filters.CmsoContainerFilters; +import org.onap.optf.cmso.optimizer.service.rs.AdminToolImpl; +import org.onap.optf.cmso.optimizer.service.rs.HealthCheckImpl; +import org.onap.optf.cmso.optimizer.service.rs.OptimizerInterfaceImpl; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Component; + +@Component +@ApplicationPath("/") +public class JerseyConfiguration extends ResourceConfig { + private static final Logger log = Logger.getLogger(JerseyConfiguration.class.getName()); + + /** + * Object mapper. + * + * @return the object mapper + */ + @Bean + @Primary + public ObjectMapper objectMapper() { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); + objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false); + objectMapper.enable(MapperFeature.ACCEPT_CASE_INSENSITIVE_PROPERTIES); + objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING); + return objectMapper; + } + + /** + * Instantiates a new jersey configuration. + */ + @Autowired + public JerseyConfiguration( /* LogRequestFilter lrf */ ) { + register(HealthCheckImpl.class); + register(AdminToolImpl.class); + register(OptimizerInterfaceImpl.class); + property(ServletProperties.FILTER_FORWARD_ON_404, true); + // TODO: ONAP Conversion identify appropriate ONAP logging filters if any + // register(lrf, 6001); + // register(LogResponseFilter.class, 6004); + + // TODO: Examine which logging features to enable + register(new LoggingFeature(log)); + register(CmsoContainerFilters.class); + } + + /** + * Jersey client. + * + * @return the client + */ + @Bean + public Client jerseyClient() { + ClientConfig client = new ClientConfig(); + + // TODO: ONAP Conversion identify appropriate ONAP logging filters if any + // client.register(TransactionIdRequestFilter.class); + // client.register(TransactionIdResponseFilter.class); + // client.register(DateTimeParamConverterProvider.class); + + return ClientBuilder.newClient(client); + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SecurityConfig.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SecurityConfig.java new file mode 100644 index 0000000..ff3f1b4 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SecurityConfig.java @@ -0,0 +1,59 @@ +/* + * Copyright © 2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Profile; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +@Configuration +@EnableWebSecurity +@ComponentScan("org.onap.optf") +@Profile(SpringProfiles.PROPRIETARY__AUTHENTICATION) +public class SecurityConfig extends WebSecurityConfigurerAdapter { + + @Autowired + private AuthProvider authProvider; + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + + auth.authenticationProvider(authProvider); + } + + @Override + protected void configure(HttpSecurity http) throws Exception { + + http.csrf().disable().authorizeRequests().anyRequest().authenticated().and().httpBasic(); + + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SpringProfiles.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SpringProfiles.java new file mode 100644 index 0000000..54d4b46 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/SpringProfiles.java @@ -0,0 +1,37 @@ +/******************************************************************************* + * + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * + * * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer; + +public class SpringProfiles { + + public static final String AAF_AUTHENTICATION = "aaf-auth"; + public static final String PROPRIETARY__AUTHENTICATION = "proprietary-auth"; + + private SpringProfiles() {} +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java new file mode 100644 index 0000000..7674f43 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyClient.java @@ -0,0 +1,183 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.clients.topology; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonMappingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; +import javax.ws.rs.client.Client; +import javax.ws.rs.client.ClientBuilder; +import javax.ws.rs.client.Entity; +import javax.ws.rs.client.Invocation; +import javax.ws.rs.client.WebTarget; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; +import org.onap.observations.Observation; +import org.onap.optf.cmso.common.BasicAuthenticatorFilter; +import org.onap.optf.cmso.common.PropertiesManagement; +import org.onap.optf.cmso.common.exceptions.CmsoException; +import org.onap.optf.cmso.optimizer.clients.topology.models.ElementCriteria; +import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyPolicyInfo; +import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyRequest; +import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse; +import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse.TopologyRequestStatus; +import org.onap.optf.cmso.optimizer.common.LogMessages; +import org.onap.optf.cmso.optimizer.filters.CmsoClientFilters; +import org.onap.optf.cmso.optimizer.model.Request; +import org.onap.optf.cmso.optimizer.model.Topology; +import org.onap.optf.cmso.optimizer.model.dao.RequestDao; +import org.onap.optf.cmso.optimizer.model.dao.TopologyDao; +import org.onap.optf.cmso.optimizer.service.rs.models.ElementInfo; +import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest; +import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse.OptimizeScheduleStatus; +import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Component +public class TopologyClient { + private static EELFLogger debug = EELFManager.getInstance().getDebugLogger(); + + @Autowired + Environment env; + + @Autowired + PropertiesManagement pm; + + @Autowired + RequestDao requestDao; + + @Autowired + TopologyDao topologyDao; + + public TopologyResponse makeRequest(Request request, Topology topology) { + Integer maxAttempts = env.getProperty("cmso.optimizer.maxAttempts", Integer.class, 20); + if (topology.getTopologyRetries() >= maxAttempts) { + request.setStatus(OptimizeScheduleStatus.FAILED.toString()); + request.setRequestEnd(System.currentTimeMillis()); + requestDao.save(request); + return null; + } + TopologyRequest topologyRequest = new TopologyRequest(); + ObjectMapper om = new ObjectMapper(); + String originalRequest = request.getRequest(); + TopologyResponse topologyResponse = new TopologyResponse(); + OptimizerRequest optimizerRequest = null;; + try { + optimizerRequest = om.readValue(originalRequest, OptimizerRequest.class); + } catch (Exception e) { + topologyResponse.setStatus(TopologyRequestStatus.FAILED); + Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + } + topologyRequest = new TopologyRequest(); + topologyRequest.setRequestId(optimizerRequest.getRequestId()); + topologyRequest.setCommonData(optimizerRequest.getCommonData()); + topologyRequest.setElements(getElementCriteria(optimizerRequest)); + topologyRequest.setPolicies(getPolicies(optimizerRequest)); + try { + topologyResponse = initiateTopology(topologyRequest, topology, request); + } catch (Exception e) { + topologyResponse.setStatus(TopologyRequestStatus.FAILED); + Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + } + return topologyResponse; + } + + private List<TopologyPolicyInfo> getPolicies(OptimizerRequest optimizerRequest) { + List<TopologyPolicyInfo> list = new ArrayList<>(); + for (PolicyInfo optInfo : optimizerRequest.getPolicies()) { + TopologyPolicyInfo topInfo = new TopologyPolicyInfo(); + topInfo.setPolicyDescription(optInfo.getPolicyDescription()); + topInfo.setPolicyName(optInfo.getPolicyName()); + topInfo.setPolicyModifiers(optInfo.getPolicyModifiers()); + list.add(topInfo); + } + return list; + } + + private List<ElementCriteria> getElementCriteria(OptimizerRequest optimizerRequest) { + List<ElementCriteria> list = new ArrayList<>(); + for (ElementInfo info : optimizerRequest.getElements()) { + ElementCriteria criteria = new ElementCriteria(); + criteria.setElementId(info.getElementId()); + criteria.setElementData(info.getElementData()); + list.add(criteria); + } + return list; + } + + private TopologyResponse initiateTopology(TopologyRequest request, Topology topology, Request requestRow) throws CmsoException, JsonProcessingException { + String url = env.getProperty("cmso.topology.create.request.url"); + String username = env.getProperty("mechid.user"); + String password = pm.getProperty("mechid.pass", ""); + Client client = ClientBuilder.newClient(); + client.register(new BasicAuthenticatorFilter(username, password)); + client.register(new CmsoClientFilters()); + WebTarget webTarget = client.target(url); + Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); + debug.debug("topology url / user: " + url + " / " + username); + debug.debug("topology Request: " + new ObjectMapper().writeValueAsString(request)); + Observation.report(LogMessages.TOPOLOGY_REQUEST, "Begin", request.getRequestId(), url); + topology.setTopologyStart(System.currentTimeMillis()); + Response response = invocationBuilder.post(Entity.json(request)); + Observation.report(LogMessages.TOPOLOGY_REQUEST, "End", request.getRequestId(), url); + TopologyResponse topologyResponse = null; + switch (response.getStatus()) { + case 202: + debug.debug("Successfully scheduled asynchronous topology: " + request.getRequestId()); + break; + case 200: + debug.debug("Successfully retrieved topology: " + request.getRequestId()); + topologyResponse = processTopologyResponse(request, response, topology, requestRow); + break; + default: + throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.UNEXPECTED_RESPONSE, + url, response.getStatusInfo().toString()); + } + return topologyResponse; + } + + private TopologyResponse processTopologyResponse(TopologyRequest request, Response response, Topology topology, + Request requestRow) { + String responseString = response.readEntity(String.class); + TopologyResponse topologyResponse = null; + try { + topologyResponse = new ObjectMapper().readValue(responseString, TopologyResponse.class); + } + catch (Exception e) + { + Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + topologyResponse = new TopologyResponse(); + topologyResponse.setRequestId(request.getRequestId()); + topologyResponse.setStatus(TopologyRequestStatus.FAILED); + topologyResponse.setErrorMessage(e.getMessage()); + } + return topologyResponse; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java new file mode 100644 index 0000000..3120e0d --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/TopologyRequestManager.java @@ -0,0 +1,100 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.clients.topology; + +import java.util.Optional; +import java.util.UUID; +import javax.ws.rs.core.Response.Status; +import org.onap.observations.Observation; +import org.onap.optf.cmso.common.exceptions.CmsoException; +import org.onap.optf.cmso.optimizer.clients.topology.models.TopologyResponse; +import org.onap.optf.cmso.optimizer.common.LogMessages; +import org.onap.optf.cmso.optimizer.model.Request; +import org.onap.optf.cmso.optimizer.model.Topology; +import org.onap.optf.cmso.optimizer.model.dao.RequestDao; +import org.onap.optf.cmso.optimizer.model.dao.TopologyDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Component; + +@Component +public class TopologyRequestManager { + + @Autowired + Environment env; + + @Autowired + RequestDao requestDao; + + @Autowired + TopologyDao topologyDao; + + @Autowired + TopologyClient topologyClient; + + public TopologyResponse createTopologyRequest(UUID uuid) + { + try + { + Request request = null; + Optional<Request> requestOptional = requestDao.findById(uuid); + if (requestOptional.isPresent()) + { + request = requestOptional.get(); + } + if (request == null) + { + throw new CmsoException(Status.INTERNAL_SERVER_ERROR, LogMessages.EXPECTED_DATA_NOT_FOUND, + uuid.toString(), "Request table"); + } + Topology topology = null; + Optional<Topology> topologyOpt = topologyDao.findById(uuid); + if (topologyOpt.isPresent()) + { + topology = topologyOpt.get(); + + } + if (topology == null) + { + topology = new Topology(); + topology.setUuid(uuid); + topology.setTopologyRetries(0); + } + TopologyResponse topologyResponse = topologyClient.makeRequest(request, topology); + switch(topologyResponse.getStatus()) + { + case COMPLETED: + break; + case FAILED: + break; + case IN_PROGRESS: + break; + } + return topologyResponse; + } + catch (Exception e) + { + Observation.report(LogMessages.UNEXPECTED_EXCEPTION, e, e.getMessage()); + } + return null; + + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ConstraintElements.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ConstraintElements.java new file mode 100644 index 0000000..dfd4fad --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ConstraintElements.java @@ -0,0 +1,127 @@ +/******************************************************************************* + * + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.List; + +@ApiModel(value = "Topology Constraint ELements", + description = "Constraining Element Information returned from TopologyRequuest.") +public class ConstraintElements implements Serializable { + private static final long serialVersionUID = 1L; + + public enum AvailabilityMatrixScope { + NONE, GLOBAL, ELEMENT, + } + + @ApiModelProperty(value = "Element identifier") + private String elementId; + + @ApiModelProperty(value = "Type of constraint.") + private String constraintType; + + @ApiModelProperty( + value = "If more than one instance of constraintType," + + " minimum number of available instances required." + + " Useful for identifying availableBackup elements, service paths.") + private Integer constraintTypeMinimum = 1; + + @ApiModelProperty(value = "Availability matrix name. Availability matrix will not be passed to optimizer engine." + + " Generally useful for global concurrency type constraints.") + private String optimizerAvailabilityMatrixName; + + @ApiModelProperty(value = "Availability matrix scope global or scoped per elementId.") + private AvailabilityMatrixScope availabilityMatrixScope = AvailabilityMatrixScope.NONE; + + @ApiModelProperty(value = "Availability matrix is aggregated into element availability marrix.") + private boolean elementAvailabilityAggreagation = true; + + @ApiModelProperty(value = "Elements ") + private List<String> elements; + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public String getConstraintType() { + return constraintType; + } + + public void setConstraintType(String constraintType) { + this.constraintType = constraintType; + } + + public Integer getConstraintTypeMinimum() { + return constraintTypeMinimum; + } + + public void setConstraintTypeMinimum(Integer constraintTypeMinimum) { + this.constraintTypeMinimum = constraintTypeMinimum; + } + + public String getOptimizerAvailabilityMatrixName() { + return optimizerAvailabilityMatrixName; + } + + public void setOptimizerAvailabilityMatrixName(String optimizerAvailabilityMatrixName) { + this.optimizerAvailabilityMatrixName = optimizerAvailabilityMatrixName; + } + + public List<String> getElements() { + return elements; + } + + public void setElements(List<String> elements) { + this.elements = elements; + } + + public AvailabilityMatrixScope getAvailabilityMatrixScope() { + return availabilityMatrixScope; + } + + public void setAvailabilityMatrixScope(AvailabilityMatrixScope availabilityMatrixScope) { + this.availabilityMatrixScope = availabilityMatrixScope; + } + + public boolean isElementAvailabilityAggreagation() { + return elementAvailabilityAggreagation; + } + + public void setElementAvailabilityAggreagation(boolean elementAvailabilityAggreagation) { + this.elementAvailabilityAggreagation = elementAvailabilityAggreagation; + } + + + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementCriteria.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementCriteria.java new file mode 100644 index 0000000..e018533 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementCriteria.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.onap.optf.cmso.optimizer.service.rs.models.NameValue; + +@ApiModel(value = "Element Critera", description = "Element criteria for retrieving topology.") +public class ElementCriteria implements Serializable { + private static final long serialVersionUID = 1L; + + @ApiModelProperty(value = "Element id unique to the request.") + private String elementId; + + @ApiModelProperty(value = "Implementation specific element data.") + public List<NameValue> elementData = new ArrayList<>(); + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public List<NameValue> getElementData() { + return elementData; + } + + public void setElementData(List<NameValue> elementData) { + this.elementData = elementData; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementLocation.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementLocation.java new file mode 100644 index 0000000..e7f8202 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ElementLocation.java @@ -0,0 +1,92 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; + +@ApiModel(value = "Element Location", description = "Location information necessary to determine timezone." + + " lat/lon and/or timezone must be provided") +public class ElementLocation implements Serializable { + private static final long serialVersionUID = 1L; + private static EELFLogger log = EELFManager.getInstance().getLogger(ElementLocation.class); + + @ApiModelProperty(value = "Geographic latitude of element.") + private Float lat; + + @ApiModelProperty(value = "Geographic longitude of element.") + private Float lon; + + @ApiModelProperty(value = "Timezone.") + private String timezone; + + public Float getLat() { + return lat; + } + + public void setLat(Float lat) { + this.lat = lat; + } + + public Float getLon() { + return lon; + } + + public void setLon(Float lon) { + this.lon = lon; + } + + public String getTimezone() { + return timezone; + } + + public void setTimezone(String timezone) { + this.timezone = timezone; + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + log.debug("Error in toString()", e); + } + return ""; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckComponent.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckComponent.java new file mode 100644 index 0000000..0cd9763 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckComponent.java @@ -0,0 +1,93 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.ApiModel; +import java.io.Serializable; + +@ApiModel +public class HealthCheckComponent implements Serializable { + private static final long serialVersionUID = 1L; + private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckComponent.class); + + private String name; + private String url; + private String status; + private Boolean healthy = false; + + public Boolean getHealthy() { + return healthy; + } + + public void setHealthy(Boolean healthy) { + this.healthy = healthy; + } + + 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; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + log.debug("Error in toString()", e); + } + return ""; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckMessage.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckMessage.java new file mode 100644 index 0000000..c139736 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/HealthCheckMessage.java @@ -0,0 +1,109 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.ApiModel; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; + +@ApiModel +public class HealthCheckMessage implements Serializable { + private static final long serialVersionUID = 1L; + private static EELFLogger log = EELFManager.getInstance().getLogger(HealthCheckMessage.class); + + private Boolean healthy = false; + private String buildInfo = ""; + private String currentTime = ""; + private String hostname = ""; + + private List<HealthCheckComponent> components = new ArrayList<HealthCheckComponent>(); + + public Boolean getHealthy() { + return healthy; + } + + public void setHealthy(Boolean healthy) { + this.healthy = healthy; + } + + public String getBuildInfo() { + return buildInfo; + } + + public void setBuildInfo(String buildInfo) { + this.buildInfo = buildInfo; + } + + public String getCurrentTime() { + return currentTime; + } + + public void setCurrentTime(String currentTime) { + this.currentTime = currentTime; + } + + public String getHostname() { + return hostname; + } + + public void setHostname(String hostname) { + this.hostname = hostname; + } + + public List<HealthCheckComponent> getComponents() { + return components; + } + + public void setComponents(List<HealthCheckComponent> components) { + this.components = components; + } + + public void addComponent(HealthCheckComponent components) { + this.components.add(components); + } + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + log.debug("Error in toString()", e); + } + return ""; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ReferencedElementInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ReferencedElementInfo.java new file mode 100644 index 0000000..e51ce70 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/ReferencedElementInfo.java @@ -0,0 +1,101 @@ +/******************************************************************************* + * + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.onap.optf.cmso.optimizer.service.rs.models.NameValue; + +@ApiModel(value = "Topology Related Element", description = "Element Information returned from TopologyRequuest.") +public class ReferencedElementInfo implements Serializable { + private static final long serialVersionUID = 1L; + private static EELFLogger log = EELFManager.getInstance().getLogger(ReferencedElementInfo.class); + + @ApiModelProperty(value = "Element identifier") + private String elementId; + + @ApiModelProperty(value = "Location information for the element.") + private ElementLocation elementLocation; + + @ApiModelProperty(value = "Related elements only. Element ids of the element(s) ") + private List<String> referencingElements; + + @ApiModelProperty(value = "Implementation specific element data.") + public List<NameValue> elementData = new ArrayList<>(); + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public ElementLocation getElementLocation() { + return elementLocation; + } + + public void setElementLocation(ElementLocation elementLocation) { + this.elementLocation = elementLocation; + } + + + public List<String> getRelatedElements() { + return referencingElements; + } + + public void setRelatedElements(List<String> relatedElements) { + this.referencingElements = relatedElements; + } + + public List<NameValue> getElementData() { + return elementData; + } + + public void setElementData(List<NameValue> elementData) { + this.elementData = elementData; + } + + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + log.debug("Error in toString()", e); + } + return ""; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyElementInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyElementInfo.java new file mode 100644 index 0000000..14c96a0 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyElementInfo.java @@ -0,0 +1,113 @@ +/******************************************************************************* + * + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.onap.optf.cmso.optimizer.service.rs.models.NameValue; + +@ApiModel(value = "Topology Element", description = "Element Information returned from TopologyRequuest.") +public class TopologyElementInfo implements Serializable { + private static final long serialVersionUID = 1L; + private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyElementInfo.class); + + @ApiModelProperty(value = "Element identifier") + private String elementId; + + @ApiModelProperty(value = "Location information for the element.") + private ElementLocation elementLocation; + + @ApiModelProperty(value = "List of related elements required to be available to execute the chenge.") + private List<String> requiredElements; + + @ApiModelProperty(value = "Lists of related elements that must be " + + " available to avoid network outage while executing the change." + + " Each set constraint elements") + private List<ConstraintElements> constraintElements = new ArrayList<>(); + + @ApiModelProperty(value = "Implementation specific element data.") + public List<NameValue> elementData = new ArrayList<>(); + + public String getElementId() { + return elementId; + } + + public void setElementId(String elementId) { + this.elementId = elementId; + } + + public ElementLocation getElementLocation() { + return elementLocation; + } + + public void setElementLocation(ElementLocation elementLocation) { + this.elementLocation = elementLocation; + } + + public List<String> getRequiredElements() { + return requiredElements; + } + + public void setRequiredElements(List<String> requiredElements) { + this.requiredElements = requiredElements; + } + + public List<NameValue> getElementData() { + return elementData; + } + + public void setElementData(List<NameValue> elementData) { + this.elementData = elementData; + } + + public List<ConstraintElements> getConstraintElements() { + return constraintElements; + } + + public void setConstraintElements(List<ConstraintElements> constraintElements) { + this.constraintElements = constraintElements; + } + + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + log.debug("Error in toString()", e); + } + return ""; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyPolicyInfo.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyPolicyInfo.java new file mode 100644 index 0000000..9266758 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyPolicyInfo.java @@ -0,0 +1,89 @@ +/******************************************************************************* + * + * Copyright © 2019 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.onap.optf.cmso.optimizer.service.rs.models.NameValue; + +@ApiModel(value = "Supported Policy Information", description = "Policy Information returned from get policies API.") +public class TopologyPolicyInfo implements Serializable { + private static final long serialVersionUID = 1L; + private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyPolicyInfo.class); + + @ApiModelProperty(value = "Policy name") + private String policyName; + + @ApiModelProperty(value = "Policy description") + private String policyDescription; + + @ApiModelProperty(value = "Named values to modify/override policy attributes.") + public List<NameValue> policyModifiers = new ArrayList<>(); + + public String getPolicyName() { + return policyName; + } + + public void setPolicyName(String policyName) { + this.policyName = policyName; + } + + public String getPolicyDescription() { + return policyDescription; + } + + public void setPolicyDescription(String policyDescription) { + this.policyDescription = policyDescription; + } + + public List<NameValue> getPolicyModifiers() { + return policyModifiers; + } + + public void setPolicyModifiers(List<NameValue> policyModifiers) { + this.policyModifiers = policyModifiers; + } + + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + log.debug("Error in toString()", e); + } + return ""; + } +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyRequest.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyRequest.java new file mode 100644 index 0000000..e0e95f7 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/clients/topology/models/TopologyRequest.java @@ -0,0 +1,114 @@ +/* + * Copyright © 2017-2018 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.clients.topology.models; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import org.onap.optf.cmso.optimizer.service.rs.models.NameValue; + +@ApiModel(value = "Topology Request", + description = "Request to retrieve topology information for the provided elements.") +public class TopologyRequest implements Serializable { + private static final long serialVersionUID = 1L; + private static EELFLogger log = EELFManager.getInstance().getLogger(TopologyRequest.class); + + @ApiModelProperty(value = "Unique Id of the request") + private String requestId; + + @ApiModelProperty(value = "Implementation specific name value pairs.") + private List<NameValue> commonData; + + @ApiModelProperty(value = "List of the elements for which topology information is requested.") + private List<ElementCriteria> elements = new ArrayList<>(); + + @ApiModelProperty(value = "List of the policies to control topology retrieve.") + private List<TopologyPolicyInfo> policies = new ArrayList<>(); + + public String getRequestId() { + return requestId; + } + + + public void setRequestId(String requestId) { + this.requestId = requestId; + } + + + public List<NameValue> getCommonData() { + return commonData; + } + + + public void setCommonData(List<NameValue> commonData) { + this.commonData = commonData; + } + + + public List<ElementCriteria> getElements() { + return elements; + } + + + public void setElements(List<ElementCriteria> elements) { + this.elements = elements; + } + + + public List<TopologyPolicyInfo> getPolicies() { + return policies; + } + + + public void setPolicies(List<TopologyPolicyInfo> policies) { + this.policies = policies; + } + + + /** + * To string. + * + * @return the string + */ + @Override + public String toString() { + ObjectMapper mapper = new ObjectMapper(); + try { + return mapper.writeValueAsString(this); + } catch (JsonProcessingException e) { + log.debug("Error in toString()", e); + } + return ""; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Response.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Response.java new file mode 100644 index 0000000..b327ccd --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Response.java @@ -0,0 +1,75 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model; + +import java.io.Serializable; +import java.util.UUID; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.NamedQuery; + + +/** + * The persistent class for the response database table. + * + */ +@Entity +@NamedQuery(name = "Response.findAll", query = "SELECT r FROM Response r") +public class Response implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + private UUID uuid; + + @Column(name = "delivered_time") + private Long deliveredTime; + + @Lob + private String response; + + public Response() {} + + public UUID getUuid() { + return this.uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public Long getDeliveredTime() { + return this.deliveredTime; + } + + public void setDeliveredTime(Long deliveredTime) { + this.deliveredTime = deliveredTime; + } + + public String getRepsonse() { + return this.response; + } + + public void setRepsonse(String repsonse) { + this.response = repsonse; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Ticket.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Ticket.java new file mode 100644 index 0000000..1fb9ed5 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Ticket.java @@ -0,0 +1,110 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model; + +import java.io.Serializable; +import java.util.UUID; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.NamedQuery; +import javax.persistence.Table; + + +/** + * The persistent class for the tickets database table. + * + */ +@Entity +@Table(name = "tickets") +@NamedQuery(name = "Ticket.findAll", query = "SELECT t FROM Ticket t") +public class Ticket implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + private UUID uuid; + + @Lob + private String tickets; + + @Column(name = "tickets_end") + private Long ticketsEnd; + + @Column(name = "tickets_retries") + private Integer ticketsRetries; + + @Column(name = "tickets_start") + private Long ticketsStart; + + @Column(name = "topology_polling_interval") + private Integer topologyPollingInterval; + + public Ticket() {} + + public UUID getUuid() { + return this.uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public String getTickets() { + return this.tickets; + } + + public void setTickets(String tickets) { + this.tickets = tickets; + } + + public Long getTicketsEnd() { + return this.ticketsEnd; + } + + public void setTicketsEnd(Long ticketsEnd) { + this.ticketsEnd = ticketsEnd; + } + + public Integer getTicketsRetries() { + return this.ticketsRetries; + } + + public void setTicketsRetries(Integer ticketsRetries) { + this.ticketsRetries = ticketsRetries; + } + + public Long getTicketsStart() { + return this.ticketsStart; + } + + public void setTicketsStart(Long ticketsStart) { + this.ticketsStart = ticketsStart; + } + + public Integer getTopologyPollingInterval() { + return this.topologyPollingInterval; + } + + public void setTopologyPollingInterval(Integer topologyPollingInterval) { + this.topologyPollingInterval = topologyPollingInterval; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Topology.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Topology.java new file mode 100644 index 0000000..f113634 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/Topology.java @@ -0,0 +1,108 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model; + +import java.io.Serializable; +import java.util.UUID; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Id; +import javax.persistence.Lob; +import javax.persistence.NamedQuery; + + +/** + * The persistent class for the topology database table. + * + */ +@Entity +@NamedQuery(name = "Topology.findAll", query = "SELECT t FROM Topology t") +public class Topology implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + private UUID uuid; + + @Lob + private String topology; + + @Column(name = "topology_end") + private Long topologyEnd; + + @Column(name = "topology_polling_interval") + private Integer topologyPollingInterval; + + @Column(name = "topology_retries") + private Integer topologyRetries; + + @Column(name = "topology_start") + private Long topologyStart; + + public Topology() {} + + public UUID getUuid() { + return this.uuid; + } + + public void setUuid(UUID uuid) { + this.uuid = uuid; + } + + public String getTopology() { + return this.topology; + } + + public void setTopology(String topology) { + this.topology = topology; + } + + public Long getTopologyEnd() { + return this.topologyEnd; + } + + public void setTopologyEnd(Long topologyEnd) { + this.topologyEnd = topologyEnd; + } + + public Integer getTopologyPollingInterval() { + return this.topologyPollingInterval; + } + + public void setTopologyPollingInterval(Integer topologyPollingInterval) { + this.topologyPollingInterval = topologyPollingInterval; + } + + public Integer getTopologyRetries() { + return this.topologyRetries; + } + + public void setTopologyRetries(Integer topologyRetries) { + this.topologyRetries = topologyRetries; + } + + public Long getTopologyStart() { + return this.topologyStart; + } + + public void setTopologyStart(Long topologyStart) { + this.topologyStart = topologyStart; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/OptimizerDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/OptimizerDao.java new file mode 100644 index 0000000..96a4fe1 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/OptimizerDao.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model.dao; + +import java.util.Optional; +import java.util.UUID; +import org.onap.optf.cmso.optimizer.model.Optimizer; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface OptimizerDao extends PagingAndSortingRepository<Optimizer, UUID> { + @Override + Optional<Optimizer> findById(UUID id); + + @SuppressWarnings("unchecked") + @Override + Optimizer save(Optimizer persisted); + + @Override + void delete(Optimizer toDelete); + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/RequestDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/RequestDao.java new file mode 100644 index 0000000..6a2ac3b --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/RequestDao.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model.dao; + +import java.util.Optional; +import java.util.UUID; +import org.onap.optf.cmso.optimizer.model.Request; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface RequestDao extends PagingAndSortingRepository<Request, UUID> { + @Override + Optional<Request> findById(UUID id); + + @SuppressWarnings("unchecked") + @Override + Request save(Request persisted); + + @Override + void delete(Request toDelete); + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/ResponseDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/ResponseDao.java new file mode 100644 index 0000000..bf91b6b --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/ResponseDao.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model.dao; + +import java.util.Optional; +import java.util.UUID; +import org.onap.optf.cmso.optimizer.model.Response; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface ResponseDao extends PagingAndSortingRepository<Response, UUID> { + @Override + Optional<Response> findById(UUID id); + + @SuppressWarnings("unchecked") + @Override + Response save(Response persisted); + + @Override + void delete(Response toDelete); + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TicketDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TicketDao.java new file mode 100644 index 0000000..41642f7 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TicketDao.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model.dao; + +import java.util.Optional; +import java.util.UUID; +import org.onap.optf.cmso.optimizer.model.Ticket; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface TicketDao extends PagingAndSortingRepository<Ticket, UUID> { + @Override + Optional<Ticket> findById(UUID id); + + @SuppressWarnings("unchecked") + @Override + Ticket save(Ticket persisted); + + @Override + void delete(Ticket toDelete); + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TopologyDao.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TopologyDao.java new file mode 100644 index 0000000..e0d0566 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/model/dao/TopologyDao.java @@ -0,0 +1,38 @@ +/* + * ============LICENSE_START============================================== + * Copyright (c) 2019 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. + * ============LICENSE_END================================================= + * + */ + +package org.onap.optf.cmso.optimizer.model.dao; + +import java.util.Optional; +import java.util.UUID; +import org.onap.optf.cmso.optimizer.model.Topology; +import org.springframework.data.repository.PagingAndSortingRepository; + +public interface TopologyDao extends PagingAndSortingRepository<Topology, UUID> { + @Override + Optional<Topology> findById(UUID id); + + @SuppressWarnings("unchecked") + @Override + Topology save(Topology persisted); + + @Override + void delete(Topology toDelete); + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminTool.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminTool.java new file mode 100644 index 0000000..bc9a389 --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminTool.java @@ -0,0 +1,63 @@ +/* + * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.service.rs; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + + +@Api("Administration") +@Path("/{apiVersion}") +@Produces({MediaType.APPLICATION_JSON}) +public interface AdminTool { + + // ****************************************************************** + @GET + @Path("/admin/{id}") + @Produces({MediaType.TEXT_PLAIN}) + @RequestMapping(value = "/{apiVersion}/admin/{id}", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN) + @ApiOperation(value = "", notes = "Returns encrypted value of id.", response = String.class) + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Request failed")}) + public Response exec(@ApiParam( + value = "v1|v2") @PathVariable @PathParam("apiVersion") @DefaultValue("v1") String apiVersion, + @ApiParam(value = "Identifier") @PathVariable @PathParam("id") String id); + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminToolImpl.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminToolImpl.java new file mode 100644 index 0000000..7b4859d --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/AdminToolImpl.java @@ -0,0 +1,60 @@ +/* + * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.service.rs; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import org.onap.optf.cmso.common.PropertiesManagement; +import org.springframework.stereotype.Controller; + +@Controller +public class AdminToolImpl implements AdminTool { + private static EELFLogger log = EELFManager.getInstance().getLogger(AdminToolImpl.class); + + + @Context + UriInfo uri; + + @Context + HttpServletRequest request; + + @Override + public Response exec(String apiVersion, String id) { + log.info("AdminTool.exec entered " + uri.getPath()); + if (id.length() < 4) { + return Response.ok("").build(); + } + String encrypted = PropertiesManagement.getEncryptedValue(id); + Response response = Response.ok(encrypted).build(); + return response; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheck.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheck.java new file mode 100644 index 0000000..aba9cde --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheck.java @@ -0,0 +1,62 @@ +/* + * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.service.rs; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.onap.optf.cmso.optimizer.service.rs.models.HealthCheckMessage; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Api("Administration") +@Path("/{apiVersion}") +@Produces({MediaType.APPLICATION_JSON}) +public interface HealthCheck { + + // ****************************************************************** + @GET + @Path("/health") + @Produces({MediaType.APPLICATION_JSON}) + @RequestMapping(value = "/{apiVersion}/health", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "", notes = "Returns health status of server.", response = HealthCheckMessage.class) + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Not healthy", response = HealthCheckMessage.class)}) + public Response healthCheck(@ApiParam(value = "v1") @PathParam("apiVersion") @DefaultValue("v1") String apiVersion, + @ApiParam(value = "Check Interfaces") @QueryParam("checkInterfaces") @DefaultValue( + value = "true") Boolean checkInterfaces); +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheckImpl.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheckImpl.java new file mode 100644 index 0000000..80deaaf --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/HealthCheckImpl.java @@ -0,0 +1,106 @@ +/* + * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.service.rs; + +import com.att.eelf.configuration.EELFLogger; +import com.att.eelf.configuration.EELFManager; +import java.util.UUID; +import javax.servlet.http.HttpServletRequest; +import javax.ws.rs.core.Context; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.UriInfo; +import org.onap.optf.cmso.optimizer.model.dao.RequestDao; +import org.onap.optf.cmso.optimizer.service.rs.models.HealthCheckComponent; +import org.onap.optf.cmso.optimizer.service.rs.models.HealthCheckMessage; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.core.env.Environment; +import org.springframework.stereotype.Controller; + +@Controller +public class HealthCheckImpl implements HealthCheck { + private static EELFLogger debug = EELFManager.getInstance().getDebugLogger(); + + + @Autowired + Environment env; + + @Autowired + RequestDao requestDao; + + + + @Context + UriInfo uri; + + @Context + HttpServletRequest request; + + + @Override + public Response healthCheck(String apiVersion, Boolean checkInterfaces) { + debug.debug("Entered healthcheck"); + Response response = null; + HealthCheckMessage hc = new HealthCheckMessage(); + hc.setHealthy(true); + + addToHealthCheckMessage(hc, this.healthCheckDb()); + + if (hc.getHealthy()) { + response = Response.ok().entity(hc).build(); + } + else { + response = Response.status(Response.Status.BAD_REQUEST).entity(hc).build(); + } + return response; + } + + private void addToHealthCheckMessage(HealthCheckMessage hc, HealthCheckComponent hcc) { + if (!hcc.getHealthy()) { + hc.setHealthy(false); + } + + hc.setHostname(System.getenv("HOSTNAME")); + hc.addComponent(hcc); + } + + private HealthCheckComponent healthCheckDb() { + HealthCheckComponent hcc = new HealthCheckComponent(); + hcc.setName("Optimizer database"); + String url = env.getProperty("spring.datasource.url"); + hcc.setUrl(url); + try { + requestDao.findById(UUID.randomUUID()); + hcc.setHealthy(true); + hcc.setStatus("OK"); + } catch (Exception e) { + hcc.setStatus(e.getMessage()); + + } + return hcc; + } + +} diff --git a/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterface.java b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterface.java new file mode 100644 index 0000000..27a368f --- /dev/null +++ b/cmso-optimizer/src/main/java/org/onap/optf/cmso/optimizer/service/rs/OptimizerInterface.java @@ -0,0 +1,115 @@ +/* + * Copyright © 2017-2019 AT&T Intellectual Property. Modifications Copyright © 2018 IBM. + * + * 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. + * + * + * Unless otherwise specified, all documentation contained herein is licensed under the Creative + * Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except + * in compliance with the License. You may obtain a copy of the License at + * + * https://creativecommons.org/licenses/by/4.0/ + * + * Unless required by applicable law or agreed to in writing, documentation 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.optf.cmso.optimizer.service.rs; + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import io.swagger.annotations.ApiResponse; +import io.swagger.annotations.ApiResponses; +import javax.ws.rs.DELETE; +import javax.ws.rs.DefaultValue; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import org.onap.optf.cmso.common.CmsoRequestError; +import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerRequest; +import org.onap.optf.cmso.optimizer.service.rs.models.OptimizerResponse; +import org.onap.optf.cmso.optimizer.service.rs.models.PolicyInfo; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; + +@Api("Optimizer Interface") +@Path("/{apiVersion}") +@Produces({MediaType.APPLICATION_JSON}) +public interface OptimizerInterface { + // ****************************************************************** + + @POST + @Path("/optimize/schedule") + @Produces({MediaType.APPLICATION_JSON}) + @RequestMapping(value = "/{apiVersion}/optimize/shedule", method = RequestMethod.POST, + consumes = MediaType.APPLICATION_JSON, produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "", notes = "API to request schedule optimization for the passed elements.") + @ApiResponses(value = {@ApiResponse(code = 202, message = "Accepted"), + @ApiResponse(code = 400, message = "Bad request", response = CmsoRequestError.class), + @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)}) + public Response optimizeSchedule( + @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable( + value = "v1") @DefaultValue("v1") String apiVersion, + @ApiParam(value = "Optimization data.") OptimizerRequest optimizerRequest); + + @GET + @Path("/policies") + @Produces({MediaType.APPLICATION_JSON}) + @RequestMapping(value = "/{apiVersion}/policies", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "", notes = "API to retrieve supported change management policies.", + response = PolicyInfo.class, responseContainer = "List") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 400, message = "Bad request", response = CmsoRequestError.class), + @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)}) + public Response getPolicies(@ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable( + value = "v1") @DefaultValue("v1") String apiVersion); + + @GET + @Path("/optimize/schedule/{id}") + @Produces({MediaType.APPLICATION_JSON}) + @RequestMapping(value = "/{apiVersion}/schedule/{id}", method = RequestMethod.GET, + produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "", notes = "API to poll for " + " optimized schedule.", response = OptimizerResponse.class) + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK"), + @ApiResponse(code = 404, message = "Not found.", response = CmsoRequestError.class), + @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)}) + public Response getSchedule( + @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable( + value = "v1") @DefaultValue("v1") String apiVersion, + @ApiParam(value = "Request id") @PathParam("id") @PathVariable(value = "id") String id); + + @DELETE + @Path("/optimize/schedule/{id}") + @Produces({MediaType.APPLICATION_JSON}) + @RequestMapping(value = "/{apiVersion}/schedule/{id}", method = RequestMethod.DELETE, + produces = MediaType.APPLICATION_JSON) + @ApiOperation(value = "", notes = "API to acknowledge and delete" + + " optimized schedule request. Acknowledgesthat optimization has " + + "results have been retrieved an are safe to delete") + @ApiResponses(value = {@ApiResponse(code = 204, message = "Deleted"), + @ApiResponse(code = 404, message = "Not found.", response = CmsoRequestError.class), + @ApiResponse(code = 500, message = "Unexpected Runtime error", response = Exception.class)}) + public Response deleteSchedule( + @ApiParam(value = "v1") @PathParam("apiVersion") @PathVariable( + value = "v1") @DefaultValue("v1") String apiVersion, + @ApiParam(value = "Request id") @PathParam("id") @PathVariable(value = "id") String id); + + + +} |