aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rwxr-xr-xdeliveries/pom.xml2
-rwxr-xr-xdeliveries/src/main/docker/docker-files/Dockerfile12
-rwxr-xr-xdeliveries/src/main/docker/docker-files/conf.d/logback.xml (renamed from epsdk-app-onap/src/main/resources/logback.xml)742
-rwxr-xr-xdeliveries/src/main/docker/docker-files/conf.d/logback_template.xml (renamed from epsdk-app-onap/src/main/resources/logback_template.xml)682
-rwxr-xr-xdeliveries/src/main/scripts/localize.sh29
-rwxr-xr-xdeliveries/src/main/scripts/localize_asdc.sh4
-rwxr-xr-xdeliveries/src/main/scripts/localize_cache.sh4
-rwxr-xr-xdeliveries/src/main/scripts/localize_log4j.sh4
-rwxr-xr-xdeliveries/src/main/scripts/localize_logback.sh5
-rwxr-xr-xdeliveries/src/main/scripts/localize_portal.sh4
-rwxr-xr-xdeliveries/src/main/scripts/localize_quartz.sh4
-rwxr-xr-xdeliveries/src/main/scripts/localize_system.sh4
-rwxr-xr-xdeliveries/src/main/scripts/localize_war.sh10
-rw-r--r--docs/installation.rst4
-rw-r--r--docs/offeredapis.rst80
-rw-r--r--docs/release-notes.rst61
-rwxr-xr-xepsdk-app-onap/pom.xml2
-rwxr-xr-xepsdk-app-onap/src/main/resources/portal.properties3
-rwxr-xr-xepsdk-app-onap/src/main/resources/portal_template.properties3
-rwxr-xr-xepsdk-app-onap/src/main/resources/vid-data.sql13
-rwxr-xr-xepsdk-app-onap/src/main/resources/vid-schema.sql16
-rwxr-xr-xepsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties3
-rwxr-xr-xepsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties21
-rw-r--r--epsdk-app-onap/version.properties2
-rw-r--r--pom.xml4
-rw-r--r--version.properties2
-rwxr-xr-xvid-app-common/pom.xml2
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java15
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java72
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java26
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java36
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java38
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java16
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java2
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java174
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java31
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java142
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java161
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java20
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java114
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java25
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java12
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java23
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java53
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java2
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java357
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java2
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java2
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java10
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java59
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java33
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java34
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java24
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java23
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java2
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java20
-rw-r--r--vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java20
-rwxr-xr-xvid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js2
-rw-r--r--vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js38
-rw-r--r--vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html6
-rwxr-xr-xvid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js6
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java81
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java135
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java352
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java395
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java124
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java143
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java157
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java110
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java121
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java347
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java61
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java163
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java17
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java63
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java135
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java288
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java40
-rw-r--r--vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java142
-rw-r--r--vid-app-common/src/test/resources/WEB-INF/conf/system.properties24
-rw-r--r--vid-app-common/src/test/resources/git.properties3
-rw-r--r--vid-app-common/src/test/resources/mso.properties2
-rw-r--r--vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json174
-rw-r--r--vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json108
-rw-r--r--vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json67
-rw-r--r--vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json66
-rwxr-xr-xvid-app-common/version.properties2
-rw-r--r--vid-ext-services-simulator/src/main/resources/preset_registration/changeManagement/get_sdc_catalog_services_83d587e1.json38
-rw-r--r--vid-ext-services-simulator/src/main/resources/preset_registration/general/ecompportal_getSessionSlotCheckInterval.json6
-rw-r--r--vid-ext-services-simulator/src/main/resources/preset_registration/service-design-and-creation.json18
90 files changed, 4547 insertions, 2157 deletions
diff --git a/deliveries/pom.xml b/deliveries/pom.xml
index 2dad0d4f5..e36697432 100755
--- a/deliveries/pom.xml
+++ b/deliveries/pom.xml
@@ -62,7 +62,7 @@
<descriptor>assembly/assembly-for-plugin.xml</descriptor>
</assembly>
<tags>
- <tag>3.0-STAGING-latest</tag>
+ <tag>4.0-STAGING-latest</tag>
<tag>latest</tag>
</tags>
diff --git a/deliveries/src/main/docker/docker-files/Dockerfile b/deliveries/src/main/docker/docker-files/Dockerfile
index ddaa8615b..4b04e22cf 100755
--- a/deliveries/src/main/docker/docker-files/Dockerfile
+++ b/deliveries/src/main/docker/docker-files/Dockerfile
@@ -1,13 +1,14 @@
FROM tomcat:8.0-jre8
+
# add vim and uncomment alias to speedup troubleshooting purpose
RUN apt-get update && apt-get install -y \
openjdk-8-jdk vim net-tools
-RUN sed -i 's/# alias/alias/g' /root/.bashrc
+COPY conf.d/ /etc/onap/vid/conf.d/
-RUN mkdir -p ${ROOT_DIR}/etc
+RUN sed -i 's/# alias/alias/g' /root/.bashrc
-ENV JAVA_OPTS="-Xmx1536m -Xms1536m"
+ENV JAVA_OPTS="-Xmx1536m -Xms1536m -Dlogback.configurationFile=/etc/onap/vid/conf.d/logback.xml"
ENV ROOT_DIR /opt/app/vid
@@ -29,7 +30,7 @@ ENV VID_AAI_HOST aai.api.simpledemo.onap.org
ENV VID_AAI_PORT 8443
ENV VID_APP_DISPLAY_NAME VID
ENV VID_ECOMP_SHARED_CONTEXT_REST_URL https://portal.api.simpledemo.onap.org:8080/onapportal/context
-ENV VID_MSO_SERVER_URL http://vm1.mso.simpledemo.onap.org:8080
+ENV VID_MSO_SERVER_URL http://vm1.mso.simpledemo.onap.org:8080/onap/so/infra
ENV VID_MYLOGIN_FEED_DIRECTORY /tmp/MyLogins
ENV VID_MSO_USER InfraPortalClient
ENV VID_MSO_PASS OBF:1ih71i271vny1yf41ymf1ylz1yf21vn41hzj1icz
@@ -49,6 +50,7 @@ ENV AAI_VNF_PROV_STATUS PREPROV,NVTPROV,PROV,CAPPED
ENV VID_ECOMP_REDIRECT_URL http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/login.htm
ENV VID_ECOMP_REST_URL http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/auxapi
ENV VID_ECOMP_SHARED_CONTEXT_REST_URL http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/context
+ENV VID_ROLE_ACCESS_CENTRALIZED local
ENV VID_CONTACT_US_LINK https://todo_contact_us_link.com
ENV VID_DECRYPTION_KEY AGLDdG4D04BKm2IxIWEr8o=
@@ -86,4 +88,4 @@ ADD maven/artifacts/vid.war /tmp/vid/stage/
RUN chmod +x /tmp/vid/localize.sh
-CMD ["/tmp/vid/localize.sh"]
+CMD ["/tmp/vid/localize.sh"] \ No newline at end of file
diff --git a/epsdk-app-onap/src/main/resources/logback.xml b/deliveries/src/main/docker/docker-files/conf.d/logback.xml
index 14b534da6..09d241456 100755
--- a/epsdk-app-onap/src/main/resources/logback.xml
+++ b/deliveries/src/main/docker/docker-files/conf.d/logback.xml
@@ -1,371 +1,371 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
- ============LICENSE_START==========================================
- ONAP Portal SDK
- ===================================================================
- Copyright © 2017 AT&T Intellectual Property. All rights reserved.
- ===================================================================
-
- Unless otherwise specified, all software contained herein is licensed
- under the Apache License, Version 2.0 (the “License”);
- you may not use this software 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.
-
- ============LICENSE_END============================================
-
- ECOMP is a trademark and service mark of AT&T Intellectual Property.
- -->
-<configuration scan="true" scanPeriod="3 seconds" debug="true">
- <!--
- Logback files for the ONAP Portal SDK Application "epsdk-app-os"
- are created in directory ${catalina.base}/logs/epsdk_app_os;
- e.g., apache-tomcat-8.0.35/logs/epsdk_app_os/application.log
- -->
- <!--<jmxConfigurator /> -->
-
- <!-- specify the component name -->
- <property name="componentName" value="ep_sdk_app"></property>
-
- <!-- specify the base path of the log directory -->
- <property name="logDirPrefix" value="${catalina.base}/logs"></property>
-
- <!-- The directories where logs are written -->
- <property name="logDirectory" value="${logDirPrefix}/${componentName}" />
- <!-- Can easily relocate debug logs by modifying this path. -->
- <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />
-
- <!-- log file names -->
- <property name="generalLogName" value="application" />
- <property name="errorLogName" value="error" />
- <property name="metricsLogName" value="metrics" />
- <property name="auditLogName" value="audit" />
- <property name="debugLogName" value="debug" />
- <!--
- These loggers are not used in code (yet).
- <property name="securityLogName" value="security" />
- <property name="policyLogName" value="policy" />
- <property name="performanceLogName" value="performance" />
- <property name="serverLogName" value="server" />
- -->
-
- <!-- 1610 Logging Fields Format Revisions -->
- <property name="auditLoggerPattern"
- value="%X{AuditLogBeginTimestamp}|%X{AuditLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
-
- <property name="metricsLoggerPattern"
- value="%X{MetricsLogBeginTimestamp}|%X{MetricsLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVisualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
-
- <property name="errorLoggerPattern"
- value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ClassName}|%X{AlertSeverity}|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />
-
- <property name="defaultLoggerPattern"
- value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ClassName}| %msg%n" />
-
- <!-- use %class so library logging calls yield their class name -->
- <property name="applicationLoggerPattern"
- value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%class{36}| %msg%n" />
-
- <!-- Example evaluator filter applied against console appender -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>${defaultLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <!-- ============================================================================ -->
- <!-- EELF Appenders -->
- <!-- ============================================================================ -->
-
- <!-- The EELFAppender is used to record events to the general application
- log -->
-
-
- <appender name="EELF"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${generalLogName}.log</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- daily rollover -->
- <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
-
- <!-- keep 30 days' worth of history capped at 3GB total size -->
- <maxHistory>30</maxHistory>
- <totalSizeCap>3GB</totalSizeCap>
-
- </rollingPolicy>
- <encoder>
- <pattern>${applicationLoggerPattern}</pattern>
- </encoder>
- <filter class="org.onap.portalapp.util.CustomLoggingFilter" />
- </appender>
-
- <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <!-- Class name is part of caller data -->
- <includeCallerData>true</includeCallerData>
- <appender-ref ref="EELF" />
- </appender>
-
- <!-- EELF Security Appender. This appender is used to record security events
- to the security log file. Security events are separate from other loggers
- in EELF so that security log records can be captured and managed in a secure
- way separate from the other logs. This appender is set to never discard any
- events. -->
- <!--
- <appender name="EELFSecurity"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${securityLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <discardingThreshold>0</discardingThreshold>
- <appender-ref ref="EELFSecurity" />
- </appender>
- -->
-
- <!-- EELF Performance Appender. This appender is used to record performance
- records. -->
- <!--
- <appender name="EELFPerformance"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${performanceLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <outputPatternAsHeader>true</outputPatternAsHeader>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPerformance" />
- </appender>
- -->
-
- <!-- EELF Server Appender. This appender is used to record Server related
- logging events. The Server logger and appender are specializations of the
- EELF application root logger and appender. This can be used to segregate Server
- events from other components, or it can be eliminated to record these events
- as part of the application root log. -->
- <!--
- <appender name="EELFServer"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${serverLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFServer" />
- </appender>
- -->
-
- <!-- EELF Policy Appender. This appender is used to record Policy engine
- related logging events. The Policy logger and appender are specializations
- of the EELF application root logger and appender. This can be used to segregate
- Policy engine events from other components, or it can be eliminated to record
- these events as part of the application root log. -->
- <!--
- <appender name="EELFPolicy"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${policyLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPolicy" />
- </appender>
- -->
-
- <!-- EELF Audit Appender. This appender is used to record audit engine
- related logging events. The audit logger and appender are specializations
- of the EELF application root logger and appender. This can be used to segregate
- Policy engine events from other components, or it can be eliminated to record
- these events as part of the application root log. -->
-
- <appender name="EELFAudit"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${auditLogName}.log</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- daily rollover -->
- <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
-
- <!-- keep 30 days' worth of history capped at 3GB total size -->
- <maxHistory>30</maxHistory>
- <totalSizeCap>3GB</totalSizeCap>
-
- </rollingPolicy>
- <encoder>
- <pattern>${auditLoggerPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFAudit" />
- </appender>
-
- <appender name="EELFMetrics"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${metricsLogName}.log</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- daily rollover -->
- <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
-
- <!-- keep 30 days' worth of history capped at 3GB total size -->
- <maxHistory>30</maxHistory>
- <totalSizeCap>3GB</totalSizeCap>
-
- </rollingPolicy>
- <encoder>
- <pattern>${metricsLoggerPattern}</pattern>
- </encoder>
- </appender>
-
-
- <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFMetrics"/>
- </appender>
-
- <appender name="EELFError"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${errorLogName}.log</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- daily rollover -->
- <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
-
- <!-- keep 30 days' worth of history capped at 3GB total size -->
- <maxHistory>30</maxHistory>
- <totalSizeCap>3GB</totalSizeCap>
-
- </rollingPolicy>
- <encoder>
- <pattern>${errorLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFError"/>
- </appender>
-
- <appender name="EELFDebug"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${debugLogDirectory}/${debugLogName}.log</file>
- <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
- <!-- daily rollover -->
- <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
-
- <!-- keep 30 days' worth of history capped at 3GB total size -->
- <maxHistory>30</maxHistory>
- <totalSizeCap>3GB</totalSizeCap>
-
- </rollingPolicy>
- <encoder>
- <pattern>${defaultLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFDebug" />
- </appender>
-
-
-
-
- <logger name="org.onap.eelf" level="info" additivity="false">
- <appender-ref ref="asyncEELF" />
- </logger>
-
- <logger name="org.onap.eelf.audit" level="info" additivity="false">
- <appender-ref ref="asyncEELFAudit" />
- </logger>
-
- <logger name="org.onap.eelf.debug" level="debug" additivity="false">
- <appender-ref ref="asyncEELFDebug" />
- </logger>
-
- <logger name="org.onap.eelf.error" level="info" additivity="false">
- <appender-ref ref="asyncEELFError" />
- </logger>
-
- <logger name="org.onap.eelf.metrics" level="info" additivity="false">
- <appender-ref ref="asyncEELFMetrics" />
- </logger>
-
-
- <root level="DEBUG">
- <appender-ref ref="asyncEELF" />
- </root>
-
-</configuration>
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ============LICENSE_START==========================================
+ ONAP Portal SDK
+ ===================================================================
+ Copyright © 2017 AT&T Intellectual Property. All rights reserved.
+ ===================================================================
+
+ Unless otherwise specified, all software contained herein is licensed
+ under the Apache License, Version 2.0 (the “License”);
+ you may not use this software 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.
+
+ ============LICENSE_END============================================
+
+ ECOMP is a trademark and service mark of AT&T Intellectual Property.
+ -->
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+ <!--
+ Logback files for the ONAP Portal SDK Application "epsdk-app-os"
+ are created in directory ${catalina.base}/logs/epsdk_app_os;
+ e.g., apache-tomcat-8.0.35/logs/epsdk_app_os/application.log
+ -->
+ <!--<jmxConfigurator /> -->
+
+ <!-- specify the component name -->
+ <property name="componentName" value="ep_sdk_app"></property>
+
+ <!-- specify the base path of the log directory -->
+ <property name="logDirPrefix" value="${catalina.base}/logs"></property>
+
+ <!-- The directories where logs are written -->
+ <property name="logDirectory" value="${logDirPrefix}/${componentName}" />
+ <!-- Can easily relocate debug logs by modifying this path. -->
+ <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />
+
+ <!-- log file names -->
+ <property name="generalLogName" value="application" />
+ <property name="errorLogName" value="error" />
+ <property name="metricsLogName" value="metrics" />
+ <property name="auditLogName" value="audit" />
+ <property name="debugLogName" value="debug" />
+ <!--
+ These loggers are not used in code (yet).
+ <property name="securityLogName" value="security" />
+ <property name="policyLogName" value="policy" />
+ <property name="performanceLogName" value="performance" />
+ <property name="serverLogName" value="server" />
+ -->
+
+ <!-- 1610 Logging Fields Format Revisions -->
+ <property name="auditLoggerPattern"
+ value="%X{AuditLogBeginTimestamp}|%X{AuditLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+ <property name="metricsLoggerPattern"
+ value="%X{MetricsLogBeginTimestamp}|%X{MetricsLogEndTimestamp}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{StatusCode}|%X{ResponseCode}|%X{ResponseDescription}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{Timer}|%X{ServerFQDN}|%X{ClientIPAddress}|%X{ClassName}|%X{Unused}|%X{ProcessKey}|%X{TargetVisualEntity}|%X{CustomField1}|%X{CustomField2}|%X{CustomField3}|%X{CustomField4}| %msg%n" />
+
+ <property name="errorLoggerPattern"
+ value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ServiceName}|%X{PartnerName}|%X{TargetEntity}|%X{TargetServiceName}|%X{ClassName}|%X{AlertSeverity}|%X{ErrorCode}|%X{ErrorDescription}| %msg%n" />
+
+ <property name="defaultLoggerPattern"
+ value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ClassName}| %msg%n" />
+
+ <!-- use %class so library logging calls yield their class name -->
+ <property name="applicationLoggerPattern"
+ value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%class{36}| %msg%n" />
+
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${defaultLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- EELF Appenders -->
+ <!-- ============================================================================ -->
+
+ <!-- The EELFAppender is used to record events to the general application
+ log -->
+
+
+ <appender name="EELF"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <!-- daily rollover -->
+ <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+ <!-- keep 30 days' worth of history capped at 3GB total size -->
+ <maxHistory>30</maxHistory>
+ <totalSizeCap>3GB</totalSizeCap>
+
+ </rollingPolicy>
+ <encoder>
+ <pattern>${applicationLoggerPattern}</pattern>
+ </encoder>
+ <filter class="org.onap.portalapp.util.CustomLoggingFilter" />
+ </appender>
+
+ <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <!-- Class name is part of caller data -->
+ <includeCallerData>true</includeCallerData>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <!--
+ <appender name="EELFSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender>
+ -->
+
+ <!-- EELF Performance Appender. This appender is used to record performance
+ records. -->
+ <!--
+ <appender name="EELFPerformance"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${performanceLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <outputPatternAsHeader>true</outputPatternAsHeader>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPerformance" />
+ </appender>
+ -->
+
+ <!-- EELF Server Appender. This appender is used to record Server related
+ logging events. The Server logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate Server
+ events from other components, or it can be eliminated to record these events
+ as part of the application root log. -->
+ <!--
+ <appender name="EELFServer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${serverLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFServer" />
+ </appender>
+ -->
+
+ <!-- EELF Policy Appender. This appender is used to record Policy engine
+ related logging events. The Policy logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+ <!--
+ <appender name="EELFPolicy"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${policyLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPolicy" />
+ </appender>
+ -->
+
+ <!-- EELF Audit Appender. This appender is used to record audit engine
+ related logging events. The audit logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+
+ <appender name="EELFAudit"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${auditLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <!-- daily rollover -->
+ <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+ <!-- keep 30 days' worth of history capped at 3GB total size -->
+ <maxHistory>30</maxHistory>
+ <totalSizeCap>3GB</totalSizeCap>
+
+ </rollingPolicy>
+ <encoder>
+ <pattern>${auditLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFAudit" />
+ </appender>
+
+ <appender name="EELFMetrics"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${metricsLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <!-- daily rollover -->
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+ <!-- keep 30 days' worth of history capped at 3GB total size -->
+ <maxHistory>30</maxHistory>
+ <totalSizeCap>3GB</totalSizeCap>
+
+ </rollingPolicy>
+ <encoder>
+ <pattern>${metricsLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics"/>
+ </appender>
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <!-- daily rollover -->
+ <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+ <!-- keep 30 days' worth of history capped at 3GB total size -->
+ <maxHistory>30</maxHistory>
+ <totalSizeCap>3GB</totalSizeCap>
+
+ </rollingPolicy>
+ <encoder>
+ <pattern>${errorLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError"/>
+ </appender>
+
+ <appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+ <!-- daily rollover -->
+ <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern>
+
+ <!-- keep 30 days' worth of history capped at 3GB total size -->
+ <maxHistory>30</maxHistory>
+ <totalSizeCap>3GB</totalSizeCap>
+
+ </rollingPolicy>
+ <encoder>
+ <pattern>${defaultLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ </appender>
+
+
+
+
+ <logger name="org.onap.eelf" level="info" additivity="false">
+ <appender-ref ref="asyncEELF" />
+ </logger>
+
+ <logger name="org.onap.eelf.audit" level="info" additivity="false">
+ <appender-ref ref="asyncEELFAudit" />
+ </logger>
+
+ <logger name="org.onap.eelf.debug" level="debug" additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+ </logger>
+
+ <logger name="org.onap.eelf.error" level="info" additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="org.onap.eelf.metrics" level="info" additivity="false">
+ <appender-ref ref="asyncEELFMetrics" />
+ </logger>
+
+
+ <root level="DEBUG">
+ <appender-ref ref="asyncEELF" />
+ </root>
+
+</configuration>
diff --git a/epsdk-app-onap/src/main/resources/logback_template.xml b/deliveries/src/main/docker/docker-files/conf.d/logback_template.xml
index 8753dd8e9..bbc58cf2f 100755
--- a/epsdk-app-onap/src/main/resources/logback_template.xml
+++ b/deliveries/src/main/docker/docker-files/conf.d/logback_template.xml
@@ -1,341 +1,341 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<configuration scan="true" scanPeriod="3 seconds" debug="true">
- <!-- specify the component name -->
- <property name="componentName" value="vid"></property>
-
- <!-- specify the base path of the log directory -->
- <property name="logDirPrefix" value="${VID_LOG_DIR}"></property>
-
- <!-- The directories where logs are written -->
- <property name="logDirectory" value="${logDirPrefix}/${componentName}" />
- <!-- Can easily relocate debug logs by modifying this path. -->
- <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />
-
- <!-- log file names -->
- <property name="generalLogName" value="application" />
- <property name="errorLogName" value="error" />
- <property name="metricsLogName" value="metrics" />
- <property name="auditLogName" value="audit" />
- <property name="debugLogName" value="debug" />
- <!--
- These loggers are not used in code (yet).
- <property name="securityLogName" value="security" />
- <property name="policyLogName" value="policy" />
- <property name="performanceLogName" value="performance" />
- <property name="serverLogName" value="server" />
- -->
-
- <property name="defaultPattern" value="%date{ISO8601}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
- <property name="debugLoggerPattern" value="%date{ISO8601}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
- <!-- <property name="debugLoggerPattern" value="%date{ISO8601}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />-->
-
- <!-- Example evaluator filter applied against console appender -->
- <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <!-- ============================================================================ -->
- <!-- EELF Appenders -->
- <!-- ============================================================================ -->
-
- <!-- The EELFAppender is used to record events to the general application
- log -->
-
-
- <appender name="EELF"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${generalLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- <filter class="org.onap.portalapp.util.CustomLoggingFilter" />
- </appender>
-
- <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELF" />
- </appender>
-
- <!-- EELF Security Appender. This appender is used to record security events
- to the security log file. Security events are separate from other loggers
- in EELF so that security log records can be captured and managed in a secure
- way separate from the other logs. This appender is set to never discard any
- events. -->
- <!--
- <appender name="EELFSecurity"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${securityLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <discardingThreshold>0</discardingThreshold>
- <appender-ref ref="EELFSecurity" />
- </appender>
- -->
-
- <!-- EELF Performance Appender. This appender is used to record performance
- records. -->
- <!--
- <appender name="EELFPerformance"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${performanceLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <outputPatternAsHeader>true</outputPatternAsHeader>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPerformance" />
- </appender>
- -->
-
- <!-- EELF Server Appender. This appender is used to record Server related
- logging events. The Server logger and appender are specializations of the
- EELF application root logger and appender. This can be used to segregate Server
- events from other components, or it can be eliminated to record these events
- as part of the application root log. -->
- <!--
- <appender name="EELFServer"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${serverLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFServer" />
- </appender>
- -->
-
- <!-- EELF Policy Appender. This appender is used to record Policy engine
- related logging events. The Policy logger and appender are specializations
- of the EELF application root logger and appender. This can be used to segregate
- Policy engine events from other components, or it can be eliminated to record
- these events as part of the application root log. -->
- <!--
- <appender name="EELFPolicy"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${policyLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFPolicy" />
- </appender>
- -->
-
- <!-- EELF Audit Appender. This appender is used to record audit engine
- related logging events. The audit logger and appender are specializations
- of the EELF application root logger and appender. This can be used to segregate
- Policy engine events from other components, or it can be eliminated to record
- these events as part of the application root log. -->
-
- <appender name="EELFAudit"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${auditLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
- <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFAudit" />
- </appender>
-
- <appender name="EELFMetrics"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${metricsLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
- %msg%n"</pattern> -->
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
-
- <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFMetrics"/>
- </appender>
-
- <appender name="EELFError"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${logDirectory}/${errorLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${defaultPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFError"/>
- </appender>
-
- <appender name="EELFDebug"
- class="ch.qos.logback.core.rolling.RollingFileAppender">
- <file>${debugLogDirectory}/${debugLogName}.log</file>
- <rollingPolicy
- class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
- <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
- </fileNamePattern>
- <minIndex>1</minIndex>
- <maxIndex>9</maxIndex>
- </rollingPolicy>
- <triggeringPolicy
- class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
- <maxFileSize>5MB</maxFileSize>
- </triggeringPolicy>
- <encoder>
- <pattern>${debugLoggerPattern}</pattern>
- </encoder>
- </appender>
-
- <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
- <queueSize>256</queueSize>
- <appender-ref ref="EELFDebug" />
- <includeCallerData>true</includeCallerData>
- </appender>
-
-
- <!-- ============================================================================ -->
- <!-- EELF loggers -->
- <!-- ============================================================================ -->
- <logger name="com.att.eelf" level="debug" additivity="false">
- <appender-ref ref="asyncEELF" />
- </logger>
-
- <!--
- <logger name="com.att.eelf.security" level="info" additivity="false">
- <appender-ref ref="asyncEELFSecurity" />
- </logger>
- <logger name="com.att.eelf.perf" level="info" additivity="false">
- <appender-ref ref="asyncEELFPerformance" />
- </logger>
- <logger name="com.att.eelf.server" level="info" additivity="false">
- <appender-ref ref="asyncEELFServer" />
- </logger>
- <logger name="com.att.eelf.policy" level="info" additivity="false">
- <appender-ref ref="asyncEELFPolicy" />
- </logger>
- -->
-
- <logger name="com.att.eelf.audit" level="info" additivity="false">
- <appender-ref ref="asyncEELFAudit" />
- </logger>
-
- <logger name="com.att.eelf.metrics" level="info" additivity="false">
- <appender-ref ref="asyncEELFMetrics" />
- </logger>
-
- <logger name="com.att.eelf.error" level="info" additivity="false">
- <appender-ref ref="asyncEELFError" />
- </logger>
-
- <logger name="com.att.eelf.debug" level="debug" additivity="false">
- <appender-ref ref="asyncEELFDebug" />
- </logger>
-
-
- <root level="${VID_LOG_LEVEL}">
- <appender-ref ref="asyncEELF" />
- </root>
-
-</configuration>
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="3 seconds" debug="true">
+ <!-- specify the component name -->
+ <property name="componentName" value="vid"></property>
+
+ <!-- specify the base path of the log directory -->
+ <property name="logDirPrefix" value="${VID_LOG_DIR}"></property>
+
+ <!-- The directories where logs are written -->
+ <property name="logDirectory" value="${logDirPrefix}/${componentName}" />
+ <!-- Can easily relocate debug logs by modifying this path. -->
+ <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />
+
+ <!-- log file names -->
+ <property name="generalLogName" value="application" />
+ <property name="errorLogName" value="error" />
+ <property name="metricsLogName" value="metrics" />
+ <property name="auditLogName" value="audit" />
+ <property name="debugLogName" value="debug" />
+ <!--
+ These loggers are not used in code (yet).
+ <property name="securityLogName" value="security" />
+ <property name="policyLogName" value="policy" />
+ <property name="performanceLogName" value="performance" />
+ <property name="serverLogName" value="server" />
+ -->
+
+ <property name="defaultPattern" value="%date{ISO8601}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
+ <property name="debugLoggerPattern" value="%date{ISO8601}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{VirtualServerName}|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{ClassName}|%X{Timer}| %msg%n" />
+ <!-- <property name="debugLoggerPattern" value="%date{ISO8601}|%X{RequestId}|%X{ServiceInstanceId}|%thread|%X{ServiceName}|%X{InstanceUUID}|%.-5level|%X{AlertSeverity}|%X{ServerIPAddress}|%X{ServerFQDN}|%X{RemoteHost}|%X{Timer}|[%caller{3}]|%msg%n" />-->
+
+ <!-- Example evaluator filter applied against console appender -->
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <!-- ============================================================================ -->
+ <!-- EELF Appenders -->
+ <!-- ============================================================================ -->
+
+ <!-- The EELFAppender is used to record events to the general application
+ log -->
+
+
+ <appender name="EELF"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${generalLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ <filter class="org.onap.portalapp.util.CustomLoggingFilter" />
+ </appender>
+
+ <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELF" />
+ </appender>
+
+ <!-- EELF Security Appender. This appender is used to record security events
+ to the security log file. Security events are separate from other loggers
+ in EELF so that security log records can be captured and managed in a secure
+ way separate from the other logs. This appender is set to never discard any
+ events. -->
+ <!--
+ <appender name="EELFSecurity"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${securityLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <discardingThreshold>0</discardingThreshold>
+ <appender-ref ref="EELFSecurity" />
+ </appender>
+ -->
+
+ <!-- EELF Performance Appender. This appender is used to record performance
+ records. -->
+ <!--
+ <appender name="EELFPerformance"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${performanceLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <outputPatternAsHeader>true</outputPatternAsHeader>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPerformance" />
+ </appender>
+ -->
+
+ <!-- EELF Server Appender. This appender is used to record Server related
+ logging events. The Server logger and appender are specializations of the
+ EELF application root logger and appender. This can be used to segregate Server
+ events from other components, or it can be eliminated to record these events
+ as part of the application root log. -->
+ <!--
+ <appender name="EELFServer"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${serverLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFServer" />
+ </appender>
+ -->
+
+ <!-- EELF Policy Appender. This appender is used to record Policy engine
+ related logging events. The Policy logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+ <!--
+ <appender name="EELFPolicy"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${policyLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFPolicy" />
+ </appender>
+ -->
+
+ <!-- EELF Audit Appender. This appender is used to record audit engine
+ related logging events. The audit logger and appender are specializations
+ of the EELF application root logger and appender. This can be used to segregate
+ Policy engine events from other components, or it can be eliminated to record
+ these events as part of the application root log. -->
+
+ <appender name="EELFAudit"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${auditLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+ <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFAudit" />
+ </appender>
+
+ <appender name="EELFMetrics"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${metricsLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} -
+ %msg%n"</pattern> -->
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+
+ <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFMetrics"/>
+ </appender>
+
+ <appender name="EELFError"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${logDirectory}/${errorLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${defaultPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFError"/>
+ </appender>
+
+ <appender name="EELFDebug"
+ class="ch.qos.logback.core.rolling.RollingFileAppender">
+ <file>${debugLogDirectory}/${debugLogName}.log</file>
+ <rollingPolicy
+ class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
+ <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip
+ </fileNamePattern>
+ <minIndex>1</minIndex>
+ <maxIndex>9</maxIndex>
+ </rollingPolicy>
+ <triggeringPolicy
+ class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
+ <maxFileSize>5MB</maxFileSize>
+ </triggeringPolicy>
+ <encoder>
+ <pattern>${debugLoggerPattern}</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">
+ <queueSize>256</queueSize>
+ <appender-ref ref="EELFDebug" />
+ <includeCallerData>true</includeCallerData>
+ </appender>
+
+
+ <!-- ============================================================================ -->
+ <!-- EELF loggers -->
+ <!-- ============================================================================ -->
+ <logger name="com.att.eelf" level="debug" additivity="false">
+ <appender-ref ref="asyncEELF" />
+ </logger>
+
+ <!--
+ <logger name="com.att.eelf.security" level="info" additivity="false">
+ <appender-ref ref="asyncEELFSecurity" />
+ </logger>
+ <logger name="com.att.eelf.perf" level="info" additivity="false">
+ <appender-ref ref="asyncEELFPerformance" />
+ </logger>
+ <logger name="com.att.eelf.server" level="info" additivity="false">
+ <appender-ref ref="asyncEELFServer" />
+ </logger>
+ <logger name="com.att.eelf.policy" level="info" additivity="false">
+ <appender-ref ref="asyncEELFPolicy" />
+ </logger>
+ -->
+
+ <logger name="com.att.eelf.audit" level="info" additivity="false">
+ <appender-ref ref="asyncEELFAudit" />
+ </logger>
+
+ <logger name="com.att.eelf.metrics" level="info" additivity="false">
+ <appender-ref ref="asyncEELFMetrics" />
+ </logger>
+
+ <logger name="com.att.eelf.error" level="info" additivity="false">
+ <appender-ref ref="asyncEELFError" />
+ </logger>
+
+ <logger name="com.att.eelf.debug" level="debug" additivity="false">
+ <appender-ref ref="asyncEELFDebug" />
+ </logger>
+
+
+ <root level="${VID_LOG_LEVEL}">
+ <appender-ref ref="asyncEELF" />
+ </root>
+
+</configuration>
diff --git a/deliveries/src/main/scripts/localize.sh b/deliveries/src/main/scripts/localize.sh
index 3966f7023..aca557f36 100755
--- a/deliveries/src/main/scripts/localize.sh
+++ b/deliveries/src/main/scripts/localize.sh
@@ -1,18 +1,23 @@
#!/bin/bash
-#Extract the WAR so it can be customized by the localization script
-cd /tmp/vid/stage
-jar -xf vid.war
+fillTemplateProperties() {
+ source /tmp/vid/localize_war.sh $1 || {
+ echo "ERROR: Localization script failed"
+ exit 2
+ }
+}
-source /tmp/vid/localize_war.sh || {
- echo "ERROR: Localization script failed"
- exit 2
+deployWarOnTomcatManually() {
+ cd /usr/local/tomcat/webapps/
+ mkdir vid
+ cd vid
+ jar -xf /tmp/vid/stage/vid.war
}
-#Create the customized WAR and deploy it to Tomcat
-mkdir -p /tmp/vid/deployed
-cd /tmp/vid/stage
-jar -cvf /tmp/vid/deployed/vid.war .
-cd
-mv -f /tmp/vid/deployed/vid.war /usr/local/tomcat/webapps
+deployWarOnTomcatManually
+
+TEMPLATES_BASE_DIR=/usr/local/tomcat/webapps/vid/WEB-INF
+
+fillTemplateProperties ${TEMPLATES_BASE_DIR}
+
catalina.sh run
diff --git a/deliveries/src/main/scripts/localize_asdc.sh b/deliveries/src/main/scripts/localize_asdc.sh
index 549c17af1..af483186f 100755
--- a/deliveries/src/main/scripts/localize_asdc.sh
+++ b/deliveries/src/main/scripts/localize_asdc.sh
@@ -1,7 +1,7 @@
#!/bin/bash
-FINAL_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/asdc.properties
-TEMPLATE_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/asdc_template.properties
+FINAL_CONFIG_FILE=$1/conf/asdc.properties
+TEMPLATE_CONFIG_FILE=$1/conf/asdc_template.properties
echo "Localizing the ASDC client configuration"
diff --git a/deliveries/src/main/scripts/localize_cache.sh b/deliveries/src/main/scripts/localize_cache.sh
index d25949ccc..2d676c373 100755
--- a/deliveries/src/main/scripts/localize_cache.sh
+++ b/deliveries/src/main/scripts/localize_cache.sh
@@ -1,7 +1,7 @@
#!/bin/bash
-FINAL_CONFIG_FILE=/tmp/vid/stage/WEB-INF/classes/cache.ccf
-TEMPLATE_CONFIG_FILE=/tmp/vid/stage/WEB-INF/classes/cache_template.ccf
+FINAL_CONFIG_FILE=$1/classes/cache.ccf
+TEMPLATE_CONFIG_FILE=$1/classes/cache_template.ccf
echo "Localizing the VID cache configuration"
diff --git a/deliveries/src/main/scripts/localize_log4j.sh b/deliveries/src/main/scripts/localize_log4j.sh
index d2ab2bba4..121f5673a 100755
--- a/deliveries/src/main/scripts/localize_log4j.sh
+++ b/deliveries/src/main/scripts/localize_log4j.sh
@@ -1,7 +1,7 @@
#!/bin/bash
-FINAL_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/log4j.properties
-TEMPLATE_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/log4j_template.properties
+FINAL_CONFIG_FILE=$1/conf/log4j.properties
+TEMPLATE_CONFIG_FILE=$1/conf/log4j_template.properties
echo "Localizing the VID log4j configuration"
diff --git a/deliveries/src/main/scripts/localize_logback.sh b/deliveries/src/main/scripts/localize_logback.sh
index 43798eb84..90ce883cc 100755
--- a/deliveries/src/main/scripts/localize_logback.sh
+++ b/deliveries/src/main/scripts/localize_logback.sh
@@ -1,7 +1,8 @@
#!/bin/bash
-FINAL_CONFIG_FILE=/tmp/vid/stage/WEB-INF/classes/logback.xml
-TEMPLATE_CONFIG_FILE=/tmp/vid/stage/WEB-INF/classes/logback_template.xml
+BASE_DIR=/etc/onap/vid/conf.d
+FINAL_CONFIG_FILE=${BASE_DIR}/logback.xml
+TEMPLATE_CONFIG_FILE=${BASE_DIR}/logback_template.xml
echo "Localizing the VID logback configuration"
diff --git a/deliveries/src/main/scripts/localize_portal.sh b/deliveries/src/main/scripts/localize_portal.sh
index f29d485eb..947e0e1d0 100755
--- a/deliveries/src/main/scripts/localize_portal.sh
+++ b/deliveries/src/main/scripts/localize_portal.sh
@@ -1,7 +1,7 @@
#!/bin/bash
-FINAL_CONFIG_FILE=/tmp/vid/stage/WEB-INF/classes/portal.properties
-TEMPLATE_CONFIG_FILE=/tmp/vid/stage/WEB-INF/classes/portal_template.properties
+FINAL_CONFIG_FILE=$1/classes/portal.properties
+TEMPLATE_CONFIG_FILE=$1/classes/portal_template.properties
echo "Localizing the VID portal configuration"
diff --git a/deliveries/src/main/scripts/localize_quartz.sh b/deliveries/src/main/scripts/localize_quartz.sh
index c284e6c24..c22d8793a 100755
--- a/deliveries/src/main/scripts/localize_quartz.sh
+++ b/deliveries/src/main/scripts/localize_quartz.sh
@@ -1,7 +1,7 @@
#!/bin/bash
-FINAL_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/quartz.properties
-TEMPLATE_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/quartz_template.properties
+FINAL_CONFIG_FILE=$1/conf/quartz.properties
+TEMPLATE_CONFIG_FILE=$1/conf/quartz_template.properties
echo "Localizing the VID quartz configuration"
diff --git a/deliveries/src/main/scripts/localize_system.sh b/deliveries/src/main/scripts/localize_system.sh
index a739335be..0947d49ea 100755
--- a/deliveries/src/main/scripts/localize_system.sh
+++ b/deliveries/src/main/scripts/localize_system.sh
@@ -1,7 +1,7 @@
#!/bin/bash
-FINAL_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/system.properties
-TEMPLATE_CONFIG_FILE=/tmp/vid/stage/WEB-INF/conf/system_template.properties
+FINAL_CONFIG_FILE=$1/conf/system.properties
+TEMPLATE_CONFIG_FILE=$1/conf/system_template.properties
echo "Localizing the VID system configuration"
diff --git a/deliveries/src/main/scripts/localize_war.sh b/deliveries/src/main/scripts/localize_war.sh
index f0669e0e6..53a928e84 100755
--- a/deliveries/src/main/scripts/localize_war.sh
+++ b/deliveries/src/main/scripts/localize_war.sh
@@ -5,27 +5,27 @@ source /tmp/vid/localize_logback.sh || {
exit 1
}
-source /tmp/vid/localize_portal.sh || {
+source /tmp/vid/localize_portal.sh $1 || {
echo "ERROR: Localizing portal.properties failed"
exit 1
}
-source /tmp/vid/localize_quartz.sh || {
+source /tmp/vid/localize_quartz.sh $1 || {
echo "ERROR: Localizing quartz.properties failed"
exit 1
}
-source /tmp/vid/localize_system.sh || {
+source /tmp/vid/localize_system.sh $1 || {
echo "ERROR: Localizing system.properties failed"
exit 1
}
-source /tmp/vid/localize_cache.sh || {
+source /tmp/vid/localize_cache.sh $1 || {
echo "ERROR: Localizing cache.ccf failed"
exit 1
}
-source /tmp/vid/localize_asdc.sh || {
+source /tmp/vid/localize_asdc.sh $1 || {
echo "ERROR: Localizing asdc.properties failed"
exit 1
}
diff --git a/docs/installation.rst b/docs/installation.rst
index e7a1585a4..040baf284 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -17,7 +17,7 @@ Please follow the instructions given below, for installing VID using a Docker im
docker pull mariadb:10
docker login -u docker -p docker nexus3.onap.org:10001
- docker pull nexus3.onap.org:10001/onap/vid:1.2.1
+ docker pull nexus3.onap.org:10001/onap/vid:3.1.0
2. Install by running following command (Use the path for the lf_config folder under the VID git repository as CONFIG_PATH)
@@ -27,7 +27,7 @@ Please follow the instructions given below, for installing VID using a Docker im
docker run --name vid-mariadb -e MYSQL_DATABASE=vid_openecomp_epsdk -e MYSQL_USER=vidadmin -e MYSQL_PASSWORD=YOUR_PASSWORD -e MYSQL_ROOT_PASSWORD=ROOT_PASSWORD -v CONFIG_PATH/vid-my.cnf:/etc/mysql/my.cnf -v /var/lib/mysql -d mariadb:10
#start VID server
- docker run -e VID_MYSQL_DBNAME=vid_openecomp_epsdk -e VID_MYSQL_PASS=YOUR_PASSWORD --name vid-server -p 8080:8080 --link vid-mariadb:vid-mariadb-docker-instance -d nexus3.onap.org:10001/onap/vid:1.2.1
+ docker run -e VID_MYSQL_DBNAME=vid_openecomp_epsdk -e VID_MYSQL_PASS=YOUR_PASSWORD --name vid-server -p 8080:8080 --link vid-mariadb:vid-mariadb-docker-instance -d nexus3.onap.org:10001/onap/vid:3.1.0
Or use docker-compose:
diff --git a/docs/offeredapis.rst b/docs/offeredapis.rst
index 4408bf6f0..c39e2c27c 100644
--- a/docs/offeredapis.rst
+++ b/docs/offeredapis.rst
@@ -17,7 +17,7 @@ Offered APIs
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | - statusCode Either 200 or 500 |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | - The message contains additional detail in the case of an error, and is empty in the case of success. |
+| | | | - detailedMsg of the result, in case of failure particular error message |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -25,11 +25,11 @@ Offered APIs
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | { |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “statusCode”:200, |
+| | | | “statusCode”: 200, |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “message”:“health check succeeded”, |
+| | | | “detailedMsg”: “health check succeeded”, |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “date”:null |
+| | | | “date”: current date |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | } |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -47,7 +47,7 @@ Offered APIs
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | - statusCode Either 200 or 500 |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | - message contains additional detail in the case of an error, and is empty in the case of success. |
+| | | | - detailedMsg of the result, in case of failure particular error message |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | - date string indicating the current date & time |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -57,9 +57,9 @@ Offered APIs
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | { |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “statusCode”:200, |
+| | | | “statusCode”: 200, |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “message”:“health check succeeded”, |
+| | | | “detailedMsg”: “health check succeeded”, |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | “date”: current date |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
@@ -69,79 +69,33 @@ Offered APIs
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Change management | GET | change-management/workflow {vnfStringsList} | Get Workflow details for the VNFs list |
+| Commit Version | GET | /commitInfo | Displays info about the last commit of the running build |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | Expected HTTP Code 200 |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Change management | GET | change-management/mso | Get MSO Change Management details |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | [{“requestId”:“”,“requestScope”:“vnf”,“requestStatus”:{“percentProgress”:, |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “requestState”:“FAILED”, |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “statusMessage”:“Service request FAILED schema validation. No valid vnf-id is specified”, |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “finishTime”:“Fri, 20 May 2016 13:36:53 GMT”}, |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “requestType”:“updateInstance”, |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “startTime”:“Fri, 20 May 2016 13:36:53 GMT”, |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | “instanceReferences”:{“vnfInstanceName”:“ZRDM1PCRF01”,“vfModuleInstanceName”:“ZRDM1PCRF01-PCRF::base::module-0”,“volumeGroupInstanceId”:“1cc27274-1376-4168-af5d-3e35d1365a4c”}}, {…}…] |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
+| | | | return response entity: |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | Expected HTTP Code 200 |
+| | | | - commitId full id of the commit |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
+| | | | - commitMessageShort short message from the commit |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Change management | POST | change-management/workflow/{vnfName} | Post workflow request for vnf |
+| | | | - commitTime time of the commit |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | Request body: |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
+| | | | Expected: |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | requestDetails:{ |
+| | | | { |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | vnfName: vnfNAME |
+| | | | “commitId”: id of the last commit |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | vnfInstanceId: ID |
+| | | | “commitMessageShort”: short message of the last commit |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | RelatedInstanceList:[ ] |
+| | | | “commitTime”: time of the last commit |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | } |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | requestType: |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | Expected HTTP Code 200 |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| Change management | GET | change-management/scheduler | Get Scheduler Change Management Details |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| | | | |
+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | Expected |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | HTTP Code 200 |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | response: Scheduler details in json |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | Explicit HTTP Error Codes |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | 404, 406 |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| | | | |
-+---------------------+----------+-------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ \ No newline at end of file
diff --git a/docs/release-notes.rst b/docs/release-notes.rst
index 89e1919df..d1e39eb4b 100644
--- a/docs/release-notes.rst
+++ b/docs/release-notes.rst
@@ -3,6 +3,67 @@
VID Release Notes
=================
+Version: 3.2.0
+--------------
+
+:Release Date: 2018-11-15
+
+New Features
+------------
+1. PNF plug & play services instantiation.
+2. HTTPS support.
+3. Manual vNF Scale Out enhancements.
+
+**Epics**
+
+- [`VID-159`_] - AAF integration
+- [`VID-194`_] - PNF Use case support
+- [`VID-248`_] - Support scaling use case
+- [`VID-254`_] - Usability
+- [`VID-258`_] - Security
+
+.. _VID-159: /browse/VID-159
+.. _VID-194: /browse/VID-194
+.. _VID-248: /browse/VID-248
+.. _VID-254: /browse/VID-254
+.. _VID-258: /browse/VID-258
+
+**Stories**
+
+- [`VID-166`_] - Improve CSIT coverage
+- [`VID-203`_] - PNF Plug & Play use case with vCPE flow
+- [`VID-236`_] - Align OOM templates
+- [`VID-249`_] - Change Manual Scaling Use Case to use the same SO API that Policy is using in Auto Scaling
+- [`VID-250`_] - Remove Controller Type from the VID GUI and from the request sent to SO
+- [`VID-256`_] - Add tutorials/user guides
+- [`VID-257`_] - AAF integration
+- [`VID-260`_] - Use HTTPS for external interfaces
+- [`VID-261`_] - Use HTTPS for internal interfaces
+
+.. _VID-166: /browse/VID-166
+.. _VID-203: /browse/VID-203
+.. _VID-236: /browse/VID-236
+.. _VID-249: /browse/VID-249
+.. _VID-250: /browse/VID-250
+.. _VID-256: /browse/VID-256
+.. _VID-257: /browse/VID-257
+.. _VID-260: /browse/VID-260
+.. _VID-261: /browse/VID-261
+
+**Security Notes**
+
+VID code has been formally scanned during build time using NexusIQ and all Critical vulnerabilities have been addressed, items that remain open have been assessed for risk and determined to be false positive. The VID open Critical security vulnerabilities and their risk assessment have been documented as part of the `project <https://wiki.onap.org/pages/viewpage.action?pageId=28378623>`_.
+
+Quick Links:
+
+- `VID project page <https://wiki.onap.org/display/DW/Virtual+Infrastructure+Deployment+Project>`_
+- `Passing Badge information for VID <https://bestpractices.coreinfrastructure.org/en/projects/1658>`_
+- `Project Vulnerability Review Table for VID <https://wiki.onap.org/pages/viewpage.action?pageId=28378623>`_
+
+**Other**
+
+In order to work properly, VID needs a working instance of SDC, A&AI and SO.
+
Version: 2.0.0
--------------
diff --git a/epsdk-app-onap/pom.xml b/epsdk-app-onap/pom.xml
index 025b63a03..9b0136f0c 100755
--- a/epsdk-app-onap/pom.xml
+++ b/epsdk-app-onap/pom.xml
@@ -8,7 +8,7 @@
the Portal team. -->
<groupId>org.onap.vid</groupId>
<artifactId>epsdk-app-onap</artifactId>
- <version>3.0.0-SNAPSHOT</version>
+ <version>4.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>ECOMP SDK Webapp for OpenSource</name>
<description>ECOMP SDK Web Application for public release</description>
diff --git a/epsdk-app-onap/src/main/resources/portal.properties b/epsdk-app-onap/src/main/resources/portal.properties
index 104e85dc3..edb35807b 100755
--- a/epsdk-app-onap/src/main/resources/portal.properties
+++ b/epsdk-app-onap/src/main/resources/portal.properties
@@ -61,6 +61,9 @@ ecomp_redirect_url = http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/login
# URL of the ECOMP Portal REST API
ecomp_rest_url = http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/auxapi
+# Non AAF Mode
+role_access_centralized = local
+
# Applications do not need to run a UEB listener after 1607.
ueb_listeners_enable = false
diff --git a/epsdk-app-onap/src/main/resources/portal_template.properties b/epsdk-app-onap/src/main/resources/portal_template.properties
index d01413aa1..51f39494c 100755
--- a/epsdk-app-onap/src/main/resources/portal_template.properties
+++ b/epsdk-app-onap/src/main/resources/portal_template.properties
@@ -13,6 +13,9 @@ ecomp_redirect_url = ${VID_ECOMP_REDIRECT_URL}
# URL of the ECOMP Portal REST API
ecomp_rest_url = ${VID_ECOMP_REST_URL}
+# AAF Mode
+role_access_centralized = ${VID_ROLE_ACCESS_CENTRALIZED}
+
# UEB servers
ueb_url_list = ${VID_UEB_URL_LIST}
diff --git a/epsdk-app-onap/src/main/resources/vid-data.sql b/epsdk-app-onap/src/main/resources/vid-data.sql
index e2af216e6..9c48f853b 100755
--- a/epsdk-app-onap/src/main/resources/vid-data.sql
+++ b/epsdk-app-onap/src/main/resources/vid-data.sql
@@ -625,6 +625,12 @@ REPLACE INTO `fn_restricted_url` VALUES ('serviceModels.htm','menu_servicemodels
--
INSERT INTO `fn_role` VALUES (1,'System Administrator','Y',1) ON DUPLICATE KEY UPDATE ROLE_NAME='System Administrator', ACTIVE_YN='Y', PRIORITY=1;
INSERT INTO `fn_role` VALUES (16,'Standard User','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Standard User', ACTIVE_YN='Y', PRIORITY=5;
+INSERT INTO `fn_role` VALUES (17,'Demonstration___vFWCL','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vFWCL', ACTIVE_YN='Y', PRIORITY=5;
+INSERT INTO `fn_role` VALUES (18,'Demonstration___vFW','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vFW', ACTIVE_YN='Y', PRIORITY=5;
+INSERT INTO `fn_role` VALUES (19,'Demonstration___vCPE','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vCPE', ACTIVE_YN='Y', PRIORITY=5;
+INSERT INTO `fn_role` VALUES (20,'Demonstration___vIMS','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vIMS', ACTIVE_YN='Y', PRIORITY=5;
+INSERT INTO `fn_role` VALUES (21,'Demonstration___vLB','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vLB', ACTIVE_YN='Y', PRIORITY=5;
+INSERT INTO `fn_role` VALUES (22,'Demonstration___gNB','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___gNB', ACTIVE_YN='Y', PRIORITY=5;
--
-- Dumping data for table `fn_role_composite`
@@ -735,3 +741,10 @@ INSERT IGNORE `fn_user_role` VALUES (2,1,NULL,1);
INSERT IGNORE `fn_user_role` VALUES (3,1,NULL,1);
INSERT IGNORE `fn_user_role` VALUES (4,1,NULL,1);
INSERT IGNORE `fn_user_role` VALUES (5,1,NULL,1);
+INSERT IGNORE `fn_user_role` VALUES (1,17,NULL,1);
+INSERT IGNORE `fn_user_role` VALUES (1,18,NULL,1);
+INSERT IGNORE `fn_user_role` VALUES (1,19,NULL,1);
+INSERT IGNORE `fn_user_role` VALUES (1,20,NULL,1);
+INSERT IGNORE `fn_user_role` VALUES (1,21,NULL,1);
+INSERT IGNORE `fn_user_role` VALUES (1,22,NULL,1);
+
diff --git a/epsdk-app-onap/src/main/resources/vid-schema.sql b/epsdk-app-onap/src/main/resources/vid-schema.sql
index 3f15c88aa..2833cbd7b 100755
--- a/epsdk-app-onap/src/main/resources/vid-schema.sql
+++ b/epsdk-app-onap/src/main/resources/vid-schema.sql
@@ -33,6 +33,22 @@ SET FOREIGN_KEY_CHECKS = 0;
CREATE SCHEMA IF NOT EXISTS `vid_openecomp_epsdk` ;
USE vid_openecomp_epsdk;
+
+
+CREATE TABLE IF NOT EXISTS `vid_openecomp_epsdk`.`schema_info` (
+ `SCHEMA_ID` VARCHAR(25) NOT NULL,
+ `SCHEMA_DESC` VARCHAR(75) NOT NULL,
+ `DATASOURCE_TYPE` VARCHAR(100) NULL DEFAULT NULL,
+ `CONNECTION_URL` VARCHAR(200) NOT NULL,
+ `USER_NAME` VARCHAR(45) NOT NULL,
+ `PASSWORD` VARCHAR(45) NULL DEFAULT NULL,
+ `DRIVER_CLASS` VARCHAR(100) NOT NULL,
+ `MIN_POOL_SIZE` INT(11) NOT NULL,
+ `MAX_POOL_SIZE` INT(11) NOT NULL,
+ `IDLE_CONNECTION_TEST_PERIOD` INT(11) NOT NULL)
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = utf8;
+
-- ----------------------------------------------------------------------------
-- Table vid_openecomp_epsdk.cr_favorite_reports
-- ----------------------------------------------------------------------------
diff --git a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties
index dc9eb43a2..049ebf0dd 100755
--- a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties
+++ b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties
@@ -161,12 +161,13 @@ mso.user.name=infraportal
mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz
#E2E is v3
mso.restapi.svc.e2einstance=/e2eServiceInstances/v3
-mso.restapi.svc.instance=/serviceInstances/v6
+mso.restapi.svc.instance=/serviceInstantiation/v7/serviceInstances
mso.restapi.svc.instance.deleteAndUnassign=/serviceInstantiation/v7/serviceInstances
mso.restapi.vnf.instance=/serviceInstances/v6/<service_instance_id>/vnfs
mso.restapi.vnf.changemanagement.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>
mso.restapi.network.instance=/serviceInstances/v6/<service_instance_id>/networks
mso.restapi.vf.module.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules
+mso.restapi.vf.module.scaleout=/serviceInstantiation/v7/serviceInstances/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut
mso.restapi.volume.group.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups
mso.restapi.get.orc.req=/orchestrationRequests/v6
mso.restapi.get.orc.reqs=/orchestrationRequests/v6?
diff --git a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties
index 5596de03a..06a2e6b53 100755
--- a/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties
+++ b/epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties
@@ -103,16 +103,17 @@ mso.max.polls=10
mso.user.name=${VID_MSO_USER}
mso.password.x=${VID_MSO_PASS}
#E2E is v3
-mso.restapi.svc.e2einstance=/onap/so/infra/e2eServiceInstances/v3
-mso.restapi.svc.instance=/onap/so/infra/serviceInstances/v6
+mso.restapi.svc.e2einstance=/e2eServiceInstances/v3
+mso.restapi.svc.instance=/serviceInstantiation/v7/serviceInstances
mso.restapi.svc.instance.deleteAndUnassign=/serviceInstantiation/v7/serviceInstances
-mso.restapi.vnf.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs
-mso.restapi.vnf.changemanagement.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>
-mso.restapi.network.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/networks
-mso.restapi.vf.module.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules
-mso.restapi.volume.group.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups
-mso.restapi.get.orc.req=/onap/so/infra/orchestrationRequests/v6
-mso.restapi.get.orc.reqs=/onap/so/infra/orchestrationRequests/v6?
+mso.restapi.vnf.instance=/serviceInstances/v6/<service_instance_id>/vnfs
+mso.restapi.vnf.changemanagement.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>
+mso.restapi.network.instance=/serviceInstances/v6/<service_instance_id>/networks
+mso.restapi.vf.module.scaleout=/serviceInstantiation/v7/serviceInstances/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut
+mso.restapi.vf.module.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules
+mso.restapi.volume.group.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups
+mso.restapi.get.orc.req=/orchestrationRequests/v6
+mso.restapi.get.orc.reqs=/orchestrationRequests/v6?
mso.restapi.get.man.tasks=/tasks/v1
mso.restapi.configurations=/serviceInstances/v6/<service_instance_id>/configurations
mso.restapi.configuration.instance=${mso.restapi.configurations}/<configuration_id>
@@ -143,4 +144,4 @@ mso.dme2.client.timeout=${MSO_DME2_CLIENT_TIMEOUT}
mso.dme2.client.read.timeout=${MSO_DME2_CLIENT_READ_TIMEOUT}
mso.dme2.server.url=${MSO_DME2_SERVER_URL}
mso.dme2.enabled=${MSO_DME2_ENABLED}
-
+scheduler.basic.auth=
diff --git a/epsdk-app-onap/version.properties b/epsdk-app-onap/version.properties
index 02144f0fe..9723960f3 100644
--- a/epsdk-app-onap/version.properties
+++ b/epsdk-app-onap/version.properties
@@ -2,7 +2,7 @@
# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
# because they are used in Jenkins, whose plug-in doesn't support
-major=3
+major=4
minor=0
patch=0
diff --git a/pom.xml b/pom.xml
index e34fc4d1b..7ec50328c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -80,7 +80,7 @@
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <build.version>3.0.0-SNAPSHOT</build.version>
+ <build.version>4.0.0-SNAPSHOT</build.version>
<nexusproxy>https://nexus.onap.org</nexusproxy>
<snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>
<releaseNexusPath>/content/repositories/releases/</releaseNexusPath>
@@ -268,5 +268,5 @@
<version>4.5.3</version>
</dependency>
</dependencies>
- <version>3.0.0-SNAPSHOT</version>
+ <version>4.0.0-SNAPSHOT</version>
</project>
diff --git a/version.properties b/version.properties
index 02144f0fe..9723960f3 100644
--- a/version.properties
+++ b/version.properties
@@ -2,7 +2,7 @@
# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
# because they are used in Jenkins, whose plug-in doesn't support
-major=3
+major=4
minor=0
patch=0
diff --git a/vid-app-common/pom.xml b/vid-app-common/pom.xml
index 5082129c7..479510368 100755
--- a/vid-app-common/pom.xml
+++ b/vid-app-common/pom.xml
@@ -9,7 +9,7 @@
inherit from a parent maven module. -->
<groupId>org.onap.vid</groupId>
<artifactId>vid-app-common</artifactId>
- <version>3.0.0-SNAPSHOT</version>
+ <version>4.0.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>VID Common</name>
<description>VID Common code for opensource version</description>
diff --git a/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java b/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java
index c1964c161..06e0f0174 100644
--- a/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java
+++ b/vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java
@@ -413,9 +413,7 @@ public class AaiClient implements AaiClientInterface {
} else {
logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "getSubscribers() resp=" + resp.getStatusInfo().toString());
if (resp.getStatus() != HttpStatus.SC_OK) {
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "Invalid response from AAI");
- String rawData = resp.readEntity(String.class);
- subscriberDataResponse = new AaiResponse<>(null, rawData, resp.getStatus());
+ subscriberDataResponse = processFailureResponse(resp,responseBody);
} else {
subscriberDataResponse = processOkResponse(resp, classType, responseBody, omType, propagateExceptions);
}
@@ -423,6 +421,17 @@ public class AaiClient implements AaiClientInterface {
return subscriberDataResponse;
}
+ private AaiResponse processFailureResponse(Response resp, String responseBody) {
+ logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "Invalid response from AAI");
+ String rawData;
+ if (responseBody != null) {
+ rawData = responseBody;
+ } else {
+ rawData = resp.readEntity(String.class);
+ }
+ return new AaiResponse<>(null, rawData, resp.getStatus());
+ }
+
private AaiResponse processOkResponse(Response resp, Class classType, String responseBody, VidObjectMapperType omType, boolean propagateExceptions) {
AaiResponse subscriberDataResponse;
String finalResponse = null;
diff --git a/vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java
new file mode 100644
index 000000000..73bef7636
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java
@@ -0,0 +1,72 @@
+package org.onap.vid.asdc.beans;
+
+import java.util.Collection;
+
+public class ServiceBuilder {
+ private String uuid;
+ private String invariantUUID;
+ private String name;
+ private String version;
+ private String toscaModelURL;
+ private String category;
+ private Service.LifecycleState lifecycleState;
+ private String distributionStatus;
+ private Collection<Artifact> artifacts;
+ private Collection<SubResource> resources;
+
+ public ServiceBuilder setUuid(String uuid) {
+ this.uuid = uuid;
+ return this;
+ }
+
+ public ServiceBuilder setInvariantUUID(String invariantUUID) {
+ this.invariantUUID = invariantUUID;
+ return this;
+ }
+
+ public ServiceBuilder setName(String name) {
+ this.name = name;
+ return this;
+ }
+
+ public ServiceBuilder setVersion(String version) {
+ this.version = version;
+ return this;
+ }
+
+ public ServiceBuilder setToscaModelURL(String toscaModelURL) {
+ this.toscaModelURL = toscaModelURL;
+ return this;
+ }
+
+ public ServiceBuilder setCategory(String category) {
+ this.category = category;
+ return this;
+ }
+
+ public ServiceBuilder setLifecycleState(Service.LifecycleState lifecycleState) {
+ this.lifecycleState = lifecycleState;
+ return this;
+ }
+
+ public ServiceBuilder setDistributionStatus(String distributionStatus) {
+ this.distributionStatus = distributionStatus;
+ return this;
+ }
+
+ public ServiceBuilder setArtifacts(Collection<Artifact> artifacts) {
+ this.artifacts = artifacts;
+ return this;
+ }
+
+ public ServiceBuilder setResources(Collection<SubResource> resources) {
+ this.resources = resources;
+ return this;
+ }
+
+ public Service build() {
+ return new Service(uuid, invariantUUID, category, version, name, distributionStatus, toscaModelURL, lifecycleState, artifacts, resources);
+ }
+}
+
+
diff --git a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java
index 89d3963ac..b19ea57e1 100644
--- a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java
+++ b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java
@@ -1,5 +1,27 @@
package org.onap.vid.category;
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright © 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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=========================================================
+ */
+
import org.onap.vid.model.ListOfErrorsResponse;
import java.util.List;
@@ -9,6 +31,10 @@ public class AddCategoryOptionResponse extends ListOfErrorsResponse {
public AddCategoryOptionResponse() {
}
+ public AddCategoryOptionResponse(String error) {
+ errors.add(error);
+ }
+
public AddCategoryOptionResponse(List<String> errors) {
super(errors);
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java
index 5db474627..8e9b14422 100644
--- a/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java
+++ b/vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java
@@ -1,7 +1,30 @@
package org.onap.vid.category;
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright © 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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=========================================================
+ */
+
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
public class AddCategoryOptionsRequest {
@@ -10,4 +33,17 @@ public class AddCategoryOptionsRequest {
public AddCategoryOptionsRequest() {
options = new ArrayList<>();
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || this.getClass() != o.getClass()) return false;
+ AddCategoryOptionsRequest that = (AddCategoryOptionsRequest) o;
+ return Objects.equals(this.options, that.options);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.options);
+ }
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java b/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java
index 355e54838..dc0ecba17 100644
--- a/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java
+++ b/vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java
@@ -1,5 +1,29 @@
package org.onap.vid.category;
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright © 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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=========================================================
+ */
+
+import java.util.Objects;
+
public class CategoryParameterOptionRep {
private String id;
@@ -28,4 +52,18 @@ public class CategoryParameterOptionRep {
public void setName(String name) {
this.name = name;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || this.getClass() != o.getClass()) return false;
+ CategoryParameterOptionRep that = (CategoryParameterOptionRep) o;
+ return Objects.equals(this.id, that.id) &&
+ Objects.equals(this.name, that.name);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.id, this.name);
+ }
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java
index 84e83e8b2..a3ff5f923 100644
--- a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java
+++ b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java
@@ -23,6 +23,7 @@ package org.onap.vid.client;
import io.joshworks.restclient.http.HttpResponse;
import io.joshworks.restclient.http.JsonNode;
import io.joshworks.restclient.http.RestClient;
+import io.joshworks.restclient.http.exceptions.RestClientException;
import io.joshworks.restclient.http.mapper.ObjectMapper;
import org.apache.http.impl.client.CloseableHttpClient;
import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
@@ -39,7 +40,7 @@ import java.security.UnrecoverableKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.KeyManagementException;
import java.security.cert.CertificateException;
-import javax.net.ssl.SSLHandshakeException;
+import javax.net.ssl.SSLException;
import java.security.KeyStoreException;
import java.text.SimpleDateFormat;
import javax.net.ssl.SSLContext;
@@ -134,6 +135,11 @@ public class SyncRestClient implements SyncRestClientInterface {
}
@Override
+ public <T> HttpResponse<T> delete(String url, Map<String, String> headers, Object body, Class<T> responseClass) {
+ return callWithRetryOverHttp(url, url2 -> restClient.delete(url2).headers(headers).body(body).asObject(responseClass));
+ }
+
+ @Override
public <T> HttpResponse<T> delete(String url, Map<String, String> headers, Class<T> responseClass) {
return callWithRetryOverHttp(url, url2 -> restClient.delete(url2).headers(headers).asObject(responseClass));
}
@@ -150,13 +156,13 @@ public class SyncRestClient implements SyncRestClientInterface {
@SneakyThrows
private <T> HttpResponse<T> callWithRetryOverHttp(String url,
- CheckedFunction1<String, HttpResponse<T>> httpRequest) {
+ CheckedFunction1<String, HttpResponse<T>> httpRequest) {
try {
return httpRequest.apply(url);
- } catch (Exception e) {
- if (e.getCause() instanceof SSLHandshakeException) {
+ } catch (RestClientException e) {
+ if (e.getCause() instanceof SSLException) {
logger.warn(EELFLoggerDelegate.debugLogger,
- DATE_FORMAT.format(new Date()) + TRY_TO_CALL_OVER_HTTP, e);
+ DATE_FORMAT.format(new Date()) + TRY_TO_CALL_OVER_HTTP, e);
return httpRequest.apply(url.replaceFirst(HTTPS_SCHEMA, HTTP_SCHEMA));
}
throw e;
diff --git a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java
index 142adde15..ae2f83862 100644
--- a/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java
+++ b/vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java
@@ -27,6 +27,8 @@ public interface SyncRestClientInterface {
<T> HttpResponse<T> put(String url, Map<String, String> headers, Object body, Class<T> aClass);
+ <T> HttpResponse<T> delete(String url, Map<String, String> headers, Object body, Class<T> aClass);
+
<T> HttpResponse<T> delete(String url, Map<String, String> headers, Class<T> aClass);
HttpResponse<JsonNode> delete(String url, Map<String, String> headers);
diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java
index 03dc8083e..86e832ba7 100644
--- a/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java
+++ b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java
@@ -25,6 +25,7 @@ import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
import org.onap.portalsdk.core.util.SystemProperties;
import org.onap.vid.dao.FnAppDoaImpl;
import org.onap.vid.model.GitRepositoryState;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -37,6 +38,9 @@ import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;
+import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
+import static org.springframework.http.HttpStatus.OK;
+
/**
* Controller for user profile view. The view is restricted to authenticated
* users. The view name resolves to page user_profile.jsp which uses Angular.
@@ -46,158 +50,86 @@ import java.util.Properties;
@RequestMapping("/")
public class HealthCheckController extends UnRestrictedBaseController {
-
- /**
- * The logger.
- */
private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(HealthCheckController.class);
+ private static final DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
+ private static final String GIT_PROPERTIES_FILENAME = "git.properties";
+ private FnAppDoaImpl fnAppDoaImpl;
- /**
- * The Constant dateFormat.
- */
- final static DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss:SSSS");
-
- private static final String HEALTH_CHECK_PATH = "/healthCheck";
-
- /**
- * Model for JSON response with health-check results.
- */
- public class HealthStatus {
- // Either 200 or 500
- public int statusCode;
-
- // Additional detail in case of error, empty in case of success.
- public String message;
-
- public String date;
-
- public HealthStatus(int code, String msg) {
- this.statusCode = code;
- this.message = msg;
- }
-
- public HealthStatus(int code, String date, String msg) {
- this.statusCode = code;
- this.message = msg;
- this.date = date;
- }
-
- public int getStatusCode() {
- return statusCode;
- }
-
- public void setStatusCode(int code) {
- this.statusCode = code;
- }
-
- public String getMessage() {
- return message;
- }
-
- public void setMessage(String msg) {
- this.message = msg;
- }
-
- public String getDate() {
- return date;
- }
-
- public void setDate(String date) {
- this.date = date;
- }
-
- }
-
- @SuppressWarnings("unchecked")
- public int getProfileCount(String driver, String URL, String username, String password) {
- FnAppDoaImpl doa = new FnAppDoaImpl();
- int count = doa.getProfileCount(driver, URL, username, password);
- return count;
+ @Autowired
+ public HealthCheckController(FnAppDoaImpl fnAppDoaImpl) {
+ this.fnAppDoaImpl = fnAppDoaImpl;
}
-
/**
* Obtain the HealthCheck Status from the System.Properties file.
* Used by IDNS for redundancy
*
* @return ResponseEntity The response entity
- * @throws IOException Signals that an I/O exception has occurred.
*/
@RequestMapping(value = "/healthCheck", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
- public HealthStatus gethealthCheckStatusforIDNS() {
-
- String driver = SystemProperties.getProperty("db.driver");
- String URL = SystemProperties.getProperty("db.connectionURL");
- String username = SystemProperties.getProperty("db.userName");
- String password = SystemProperties.getProperty("db.password");
-
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "driver ::" + driver);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::" + URL);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::" + username);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "password::" + password);
-
-
- HealthStatus healthStatus = null;
- try {
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check");
- int count = getProfileCount(driver, URL, username, password);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::" + count);
- healthStatus = new HealthStatus(200, "health check succeeded");
- } catch (Exception ex) {
-
- LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex);
- healthStatus = new HealthStatus(500, "health check failed: " + ex.toString());
- }
- return healthStatus;
+ public HealthStatus getHealthCheckStatusForIDNS() {
+ return createCorrespondingStatus();
}
/**
* Obtain the HealthCheck Status from the System.Properties file.
*
* @return ResponseEntity The response entity
- * @throws IOException Signals that an I/O exception has occurred.
- * Project :
*/
@RequestMapping(value = "rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public HealthStatus getHealthCheck(
@PathVariable("User-Agent") String UserAgent,
@PathVariable("X-ECOMP-RequestID") String ECOMPRequestID) {
+ LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent ", UserAgent);
+ LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID ", ECOMPRequestID);
+ return createCorrespondingStatus();
+ }
- String driver = SystemProperties.getProperty("db.driver");
- String URL = SystemProperties.getProperty("db.connectionURL");
- String username = SystemProperties.getProperty("db.userName");
- String password = SystemProperties.getProperty("db.password");
-
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "driver ::" + driver);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::" + URL);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::" + username);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "password::" + password);
-
+ @RequestMapping(value = "/commitInfo", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
+ public GitRepositoryState getCommitInfo() throws IOException {
+ Properties properties = new Properties();
+ properties.load(getClass().getClassLoader().getResourceAsStream(GIT_PROPERTIES_FILENAME));
+ return new GitRepositoryState(properties);
+ }
- HealthStatus healthStatus = null;
+ private HealthStatus createCorrespondingStatus() {
+ logData();
try {
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check");
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "User-Agent" + UserAgent);
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "X-ECOMP-RequestID" + ECOMPRequestID);
+ int count = fnAppDoaImpl.getProfileCount(getUrl(), getUsername(), getPassword());
+ LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::", count);
+ return okStatus();
+ } catch (Exception ex) {
+ String errorMsg = ex.getMessage();
+ LOGGER.error(EELFLoggerDelegate.errorLogger, errorMsg);
+ return errorStatus(errorMsg);
+ }
+ }
+ private void logData() {
+ LOGGER.debug(EELFLoggerDelegate.debugLogger, "Performing health check");
+ LOGGER.debug(EELFLoggerDelegate.debugLogger, "URL::", getUrl());
+ LOGGER.debug(EELFLoggerDelegate.debugLogger, "username::", getUsername());
+ }
- int count = getProfileCount(driver, URL, username, password);
+ private HealthStatus okStatus() {
+ return new HealthStatus(OK, dateFormat.format(new Date()), "health check succeeded");
+ }
- LOGGER.debug(EELFLoggerDelegate.debugLogger, "count:::" + count);
- healthStatus = new HealthStatus(200, dateFormat.format(new Date()), "health check succeeded");
- } catch (Exception ex) {
+ private HealthStatus errorStatus(String msg) {
+ return new HealthStatus(INTERNAL_SERVER_ERROR, dateFormat.format(
+ new Date()), "health check failed: " + msg);
+ }
- LOGGER.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex);
- healthStatus = new HealthStatus(500, dateFormat.format(new Date()), "health check failed: " + ex.toString());
- }
- return healthStatus;
+ private String getUrl() {
+ return SystemProperties.getProperty("db.connectionURL");
}
- @RequestMapping(value = "/version", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
- public GitRepositoryState getCommitInfo() throws IOException {
- Properties properties = new Properties();
- properties.load(getClass().getClassLoader().getResourceAsStream("git.properties"));
- return new GitRepositoryState(properties);
+ private String getUsername() {
+ return SystemProperties.getProperty("db.userName");
+ }
+
+ private String getPassword() {
+ return SystemProperties.getProperty("db.password");
}
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java
new file mode 100644
index 000000000..6056c2898
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java
@@ -0,0 +1,31 @@
+package org.onap.vid.controllers;
+
+import org.springframework.http.HttpStatus;
+
+/**
+ * Model for JSON response with health-check results.
+ */
+public final class HealthStatus {
+
+ private final int statusCode;
+ private final String detailedMsg;
+ private final String date;
+
+ public HealthStatus(HttpStatus code, String date, String detailedMsg) {
+ this.statusCode = code.value();
+ this.detailedMsg = detailedMsg;
+ this.date = date;
+ }
+
+ public int getStatusCode() {
+ return statusCode;
+ }
+
+ public String getDetailedMsg() {
+ return detailedMsg;
+ }
+
+ public String getDate() {
+ return date;
+ }
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java b/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java
index 0976f4039..1a3eb42fa 100644
--- a/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java
+++ b/vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java
@@ -1,6 +1,30 @@
package org.onap.vid.controllers;
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright © 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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=========================================================
+ */
+
+import static org.onap.vid.utils.Logging.getMethodCallerName;
+import javax.ws.rs.ForbiddenException;
import org.onap.portalsdk.core.controller.UnRestrictedBaseController;
import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
import org.onap.vid.category.AddCategoryOptionResponse;
@@ -14,124 +38,114 @@ import org.onap.vid.services.CategoryParameterServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.ForbiddenException;
-import java.util.Arrays;
-import java.util.Collections;
-
-import static org.onap.vid.utils.Logging.getMethodCallerName;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
/**
* Controler for APIs that are used only by vid operators
*/
@RestController
-@RequestMapping(MaintenanceController.MAINTENANCE)
+@RequestMapping("maintenance")
public class MaintenanceController extends UnRestrictedBaseController {
- public static final String MAINTENANCE = "maintenance";
+ private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class);
+ private CategoryParameterService categoryParameterService;
@Autowired
- protected CategoryParameterService categoryParameterService;
- private static final EELFLoggerDelegate LOGGER = EELFLoggerDelegate.getLogger(MaintenanceController.class);
+ public MaintenanceController(CategoryParameterService categoryParameterService) {
+ this.categoryParameterService = categoryParameterService;
+ }
/**
* Add list of options to one category parameter
- * @param request the request
- * @return the new option
- * @throws Exception the exception
*/
@RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.POST)
- public ResponseEntity addCategoryOptions (
- HttpServletRequest request, @PathVariable String categoryName, @RequestBody AddCategoryOptionsRequest option) {
+ public ResponseEntity addCategoryOptions(@PathVariable String categoryName,
+ @RequestBody AddCategoryOptionsRequest option) {
debugStartLog();
try {
- AddCategoryOptionResponse response = categoryParameterService.createCategoryParameterOptions(categoryName, option);
- HttpStatus httpStatus = response.getErrors().size()>0 ? HttpStatus.MULTI_STATUS : HttpStatus.OK;
+ AddCategoryOptionResponse response = categoryParameterService
+ .createCategoryParameterOptions(categoryName, option);
+ HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS;
debugEndLog(response);
- return new ResponseEntity<>(response, httpStatus);
- }
- catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) {
- return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.NOT_FOUND);
- }
- catch (Exception exception) {
+ return createResponseWithBody(httpStatus, response);
+ } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) {
+ return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage()));
+ } catch (RuntimeException exception) {
LOGGER.error("failed to add option to parameter category " + categoryName, exception);
- return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
@RequestMapping(value = "/category_parameter/{categoryName}", method = RequestMethod.PUT)
- public ResponseEntity updateNameForOption (
- HttpServletRequest request, @PathVariable String categoryName, @RequestBody CategoryParameterOptionRep option) {
+ public ResponseEntity updateNameForOption(@PathVariable String categoryName,
+ @RequestBody CategoryParameterOptionRep option) {
debugStartLog();
try {
- AddCategoryOptionResponse response = categoryParameterService.updateCategoryParameterOption(categoryName, option);
- HttpStatus httpStatus = response.getErrors().size()>0 ? HttpStatus.MULTI_STATUS : HttpStatus.OK;
+ AddCategoryOptionResponse response = categoryParameterService
+ .updateCategoryParameterOption(categoryName, option);
+ HttpStatus httpStatus = response.getErrors().isEmpty() ? HttpStatus.OK : HttpStatus.MULTI_STATUS;
debugEndLog(response);
- return new ResponseEntity<>(response, httpStatus);
- }
- catch (ForbiddenException exception) {
- return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.FORBIDDEN);
- }
- catch (CategoryParameterServiceImpl.UnfoundedCategoryException|CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) {
- return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.NOT_FOUND);
- }
- catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) {
- return new ResponseEntity<>(new AddCategoryOptionResponse(Collections.singletonList(exception.getMessage())), HttpStatus.CONFLICT);
- }
- catch (Exception exception) {
+ return createResponseWithBody(httpStatus, response);
+ } catch (ForbiddenException exception) {
+ return createResponseWithBody(HttpStatus.FORBIDDEN, new AddCategoryOptionResponse(exception.getMessage()));
+ } catch (CategoryParameterServiceImpl.UnfoundedCategoryException | CategoryParameterServiceImpl.UnfoundedCategoryOptionException exception) {
+ return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage()));
+
+ } catch (CategoryParameterServiceImpl.AlreadyExistOptionNameException exception) {
+ return createResponseWithBody(HttpStatus.CONFLICT, new AddCategoryOptionResponse(exception.getMessage()));
+
+ } catch (RuntimeException exception) {
LOGGER.error("failed to update option to parameter category " + categoryName, exception);
- return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
/**
* Gets the owning entity properties.
- * @param request the request
- * @return the property
- * @throws Exception the exception
*/
@RequestMapping(value = "/category_parameter", method = RequestMethod.GET)
- public ResponseEntity getCategoryParameter(HttpServletRequest request, @RequestParam(value="familyName", required = true) Family familyName) {
+ public ResponseEntity getCategoryParameter(@RequestParam(value = "familyName", required = true) Family familyName) {
debugStartLog();
try {
CategoryParametersResponse response = categoryParameterService.getCategoryParameters(familyName);
debugEndLog(response);
- return new ResponseEntity<>(response, HttpStatus.OK);
- }
- catch (Exception exception) {
+ return ResponseEntity.ok().body(response);
+ } catch (RuntimeException exception) {
LOGGER.error("failed to retrieve category parameter list from DB.", exception);
- return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
-
/**
* Delete option of the category.
- * @param request the request
- * @throws Exception the exception
*/
- @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.POST)
- public ResponseEntity deleteCategoryOption (
- HttpServletRequest request, @PathVariable String categoryName, @RequestBody CategoryParameterOption option) {
+ @RequestMapping(value = "/delete_category_parameter/{categoryName}", method = RequestMethod.DELETE)
+ public ResponseEntity deleteCategoryOption(@PathVariable String categoryName,
+ @RequestBody CategoryParameterOption option) {
debugStartLog();
try {
categoryParameterService.deleteCategoryOption(categoryName, option);
debugEndLog(HttpStatus.OK);
- return new ResponseEntity<>(HttpStatus.OK);
- }
- catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) {
- return new ResponseEntity<>(new AddCategoryOptionResponse(Arrays.asList(exception.getMessage())), HttpStatus.NOT_FOUND);
- }
- catch (Exception exception) {
+ return ResponseEntity.status(HttpStatus.OK).build();
+ } catch (CategoryParameterServiceImpl.UnfoundedCategoryException exception) {
+ return createResponseWithBody(HttpStatus.NOT_FOUND, new AddCategoryOptionResponse(exception.getMessage()));
+ } catch (RuntimeException exception) {
LOGGER.error("failed to add/update owning entity option", exception);
- return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}
+ private ResponseEntity createResponseWithBody(HttpStatus status, AddCategoryOptionResponse response) {
+ return ResponseEntity.status(status).body(response);
+ }
+
private void debugStartLog() {
LOGGER.debug(EELFLoggerDelegate.debugLogger, "start {}({})", getMethodCallerName());
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java b/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java
index 6d6ffb31b..b9d67b6df 100644
--- a/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java
+++ b/vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java
@@ -4,12 +4,14 @@
* ================================================================================
* Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
* ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
* 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.
@@ -40,122 +42,73 @@ import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
-//import org.onap.vid.model.Service;
-
@RestController
public class VidController extends RestrictedBaseController {
- private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VidController.class);
-
- private final VidService service;
+ private static final EELFLoggerDelegate LOG = EELFLoggerDelegate.getLogger(VidController.class);
- @Autowired
- public VidController(VidService vidService) {
- service = vidService;
- }
-
- @Autowired
- private AaiService aaiService;
-
- @Autowired
- RoleProvider roleProvider;
+ private final VidService vidService;
+ private final AaiService aaiService;
+ private final RoleProvider roleProvider;
+ private final PombaService pombaService;
@Autowired
- private PombaService pombaService;
-
-// /**
-// * Gets the services.
-// *
-// * @param request the request
-// * @return the services
-// * @throws VidServiceUnavailableException the vid service unavailable exception
-// */
-// @RequestMapping(value={"/rest/models/services"}, method = RequestMethod.GET)
-// public SecureServices getServices(HttpServletRequest request) throws VidServiceUnavailableException {
-// try {
-// AaiService aaiService = new AaiServiceImpl();
-// LOG.info("Start API for browse ASDC was called");
-// SecureServices secureServices = new SecureServices();
-// Map<String, String[]> requestParams = request.getParameterMap();
-// List<Role> roles = roleProvider.getUserRoles(request);
-// secureServices.setServices(aaiService.getServicesByDistributionStatus());
-// secureServices.setServices(service.getServices(requestParams));
-// secureServices.setReadOnly(roleProvider.userPermissionIsReadOnly(roles));
-// return secureServices;
-// } catch (AsdcCatalogException e) {
-// LOG.error("Failed to retrieve service definitions from SDC", e);
-// throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e);
-// } catch (Throwable t) {
-// LOG.debug("Unexpected error while retrieving service definitions from SDC: " + t.getMessage() + ":", t);
-// t.printStackTrace();
-// throw new VidServiceUnavailableException("Unexpected error while retrieving service definitions from SDC: " + t.getMessage(), t);
-// }
-// }
-
- /**
- * Gets the services.
- *
- * @param request the request
- * @return the services
- * @throws VidServiceUnavailableException the vid service unavailable exception
- */
- @RequestMapping(value={"/rest/models/services"}, method = RequestMethod.GET)
- public SecureServices getServices(HttpServletRequest request) throws VidServiceUnavailableException {
- try {
- LOG.info("Start API for browse ASDC was called");
- SecureServices secureServices = new SecureServices();
- List<Role> roles = roleProvider.getUserRoles(request);
- secureServices.setServices(aaiService.getServicesByDistributionStatus());
- //Disable roles until AAF integration finishes
- //secureServices.setReadOnly(roleProvider.userPermissionIsReadOnly(roles));
- secureServices.setReadOnly(false);
- return secureServices;
- }
- catch (Exception t) {
- LOG.debug("Unexpected error while retrieving service definitions from A&AI: " + t.getMessage() + ":", t);
- throw new VidServiceUnavailableException("Unexpected error while retrieving service definitions from A&AI: " + t.getMessage(), t);
- }
- }
+ public VidController(VidService vidService, AaiService aaiService, RoleProvider roleProvider,
+ PombaService pombaService) {
+ this.vidService = vidService;
+ this.aaiService = aaiService;
+ this.roleProvider = roleProvider;
+ this.pombaService = pombaService;
+ }
+ /**
+ * @param request the request
+ * @return the services
+ */
+ @RequestMapping(value = {"/rest/models/services"}, method = RequestMethod.GET)
+ public SecureServices getServices(HttpServletRequest request) {
+ LOG.info("Start API for browse ASDC was called");
+ SecureServices secureServices = new SecureServices();
+ List<Role> roles = roleProvider.getUserRoles(request);
+ secureServices.setServices(aaiService.getServicesByDistributionStatus());
+ secureServices.setReadOnly(roleProvider.userPermissionIsReadOnly(roles));
+ return secureServices;
+ }
- /**
- * Gets the services.
- *
- * @param uuid the uuid
- * @return the services
- * @throws VidServiceUnavailableException the vid service unavailable exception
- */
- @RequestMapping(value={"/rest/models/services/{uuid}"}, method = RequestMethod.GET)
- public ServiceModel getServices(@PathVariable("uuid") String uuid, HttpServletRequest request) throws VidServiceUnavailableException {
- try {
- return service.getService(uuid);
- } catch (AsdcCatalogException e) {
- LOG.error("Failed to retrieve service definitions from SDC. Error: "+e.getMessage() , e);
- throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e);
- }
- }
+ /**
+ * @param uuid the uuid
+ * @return the services
+ * @throws VidServiceUnavailableException the vid service unavailable exception
+ */
+ @RequestMapping(value = {"/rest/models/services/{uuid}"}, method = RequestMethod.GET)
+ public ServiceModel getService(@PathVariable("uuid") String uuid) throws VidServiceUnavailableException {
+ try {
+ return vidService.getService(uuid);
+ } catch (AsdcCatalogException e) {
+ LOG.error("Failed to retrieve service definitions from SDC. Error: " + e.getMessage(), e);
+ throw new VidServiceUnavailableException("Failed to retrieve service definitions from SDC", e);
+ }
+ }
- @RequestMapping(value = "/rest/models/reset", method = RequestMethod.POST)
- @ResponseStatus(HttpStatus.ACCEPTED)
- public void invalidateServiceModelCache(HttpServletRequest request) {
- service.invalidateServiceCache();
- }
+ @RequestMapping(value = "/rest/models/reset", method = RequestMethod.POST)
+ @ResponseStatus(HttpStatus.ACCEPTED)
+ public void invalidateServiceModelCache() {
+ vidService.invalidateServiceCache();
+ }
- /**
- * Gets the services view.
- *
- * @param request the request
- * @return the services view
- * @throws VidServiceUnavailableException the vid service unavailable exception
- */
- @RequestMapping(value={"/serviceModels"}, method=RequestMethod.GET)
- public ModelAndView getServicesView(HttpServletRequest request) {
+ /**
+ * @return the services view
+ * @throws VidServiceUnavailableException the vid service unavailable exception
+ */
+ // FIX ME: Circular view path [serviceModels]: would dispatch back to the current handler URL [/serviceModels] again.
+ @RequestMapping(value = {"/serviceModels"}, method = RequestMethod.GET)
+ public ModelAndView getServicesView() {
return new ModelAndView("serviceModels");
}
@RequestMapping(value = {"/rest/models/services/verifyService"}, method = RequestMethod.POST)
- public void verifyServiceInstance(HttpServletRequest request, @RequestBody PombaRequest pombaRequest) {
- pombaService.verify(pombaRequest);
+ public void verifyServiceInstance(@RequestBody PombaRequest pombaRequest) {
+ pombaService.verify(pombaRequest);
}
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java b/vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java
new file mode 100644
index 000000000..bd7a67b5a
--- /dev/null
+++ b/vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java
@@ -0,0 +1,20 @@
+package org.onap.vid.dao;
+
+import org.springframework.stereotype.Component;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.SQLException;
+
+import static com.google.common.base.Preconditions.checkNotNull;
+
+@Component
+public class ConnectionFactory {
+
+ public Connection getConnection(String url, String username, String password) throws SQLException {
+ checkNotNull(url);
+ checkNotNull(username);
+ checkNotNull(password);
+ return DriverManager.getConnection(url, username, password);
+ }
+}
diff --git a/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java b/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java
index 65fc5217f..e3fdc95f2 100644
--- a/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java
@@ -7,9 +7,9 @@
* 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.
@@ -21,94 +21,38 @@
package org.onap.vid.dao;
import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Repository;
import java.sql.*;
-
+@Repository
public class FnAppDoaImpl {
- /** The logger. */
- static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FnAppDoaImpl.class);
-
- public int getProfileCount(String driver, String URL, String username, String password) {
- Connection dbc = null;
- PreparedStatement pst = null;
- ResultSet rs = null;
- String q = null;
- int count = 0;
- try {
- dbc = getConnection(URL,username,password);
- logger.debug(EELFLoggerDelegate.debugLogger, "getConnection:::"+ dbc);
- q = "select count(*) from fn_app";
- pst = dbc.prepareStatement(q);
- rs = pst.executeQuery();
-
- if (rs.next())
- count = rs.getInt(1);
- } catch(Exception ex) {
- logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex);
- } finally {
- cleanup(rs,pst,dbc);
- }
- logger.debug(EELFLoggerDelegate.debugLogger, "count:::"+ count);
- return count;
- }
-
- public static Connection getConnection(String url, String username, String password) throws SQLException {
- java.sql.Connection con=null;
-
- if( url!=null && username!=null && password!=null ){
- con = DriverManager.getConnection(url, username, password);
- }
-
- logger.info("Connection Successful");
-
- return con;
-
- }
-
- public static void cleanup(ResultSet rs, PreparedStatement st, Connection c) {
- if (rs != null) {
- closeResultSet(rs);
- }
- if (st != null) {
- closePreparedStatement(st);
- }
- if (c != null) {
- rollbackAndCloseConnection(c);
- }
- }
-
- private static void rollbackAndCloseConnection(Connection c) {
- try {
- c.rollback();
- } catch (Exception e) {
- if (logger != null)
- logger.error("Error when trying to rollback connection", e);
+ static EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(FnAppDoaImpl.class);
+
+ private ConnectionFactory connectionFactory;
+
+ @Autowired
+ public FnAppDoaImpl(ConnectionFactory connectionFactory) {
+ this.connectionFactory = connectionFactory;
+ }
+
+ public int getProfileCount(String URL, String username, String password) throws SQLException {
+ String q = "select count(*) from fn_app";
+ int count = 0;
+ try (Connection dbc = connectionFactory.getConnection(URL, username, password);
+ PreparedStatement pst = dbc.prepareStatement(q); ResultSet rs = pst.executeQuery()) {
+ logger.debug(EELFLoggerDelegate.debugLogger, "getConnection:::", dbc);
+ if (rs.next()) {
+ count = rs.getInt(1);
+ }
+ } catch (SQLException ex) {
+ logger.error(EELFLoggerDelegate.errorLogger, "Failed to perform health check", ex);
+ throw ex;
}
- try {
- c.close();
- } catch (Exception e) {
- if (logger != null)
- logger.error("Error when trying to close connection", e);
- }
- }
-
- private static void closePreparedStatement(PreparedStatement st) {
- try {
- st.close();
- } catch (Exception e) {
- if (logger != null)
- logger.error("Error when trying to close statement", e);
- }
- }
- private static void closeResultSet(ResultSet rs) {
- try {
- rs.close();
- } catch (Exception e) {
- if (logger != null)
- logger.error("Error when trying to close result set", e);
- }
- }
+ logger.debug(EELFLoggerDelegate.debugLogger, "count:::", count);
+ return count;
+ }
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java
index cee5af697..6685a63d6 100644
--- a/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java
@@ -23,6 +23,7 @@ package org.onap.vid.job.command;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.ImmutableMap;
import io.joshworks.restclient.http.HttpResponse;
+import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
import org.onap.vid.job.Job.JobStatus;
import org.onap.vid.job.JobCommand;
import org.onap.vid.job.NextCommand;
@@ -30,13 +31,13 @@ import org.onap.vid.mso.MsoInterface;
import org.onap.vid.mso.rest.AsyncRequestStatus;
import org.onap.vid.services.AsyncInstantiationBusinessLogic;
import org.onap.vid.services.AuditService;
-import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.Map;
+import java.util.Objects;
import java.util.UUID;
@@ -68,33 +69,38 @@ public class InProgressStatusCommand implements JobCommand {
init(jobUuid, requestId);
}
+ InProgressStatusCommand(AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic, MsoInterface msoInterface, AuditService auditService, UUID jobUuid, String requestId) {
+ this(jobUuid, requestId);
+ this.asyncInstantiationBL = asyncInstantiationBusinessLogic;
+ this.restMso = msoInterface;
+ this.auditService = auditService;
+ }
+
@Override
public NextCommand call() {
try {
- String path = asyncInstantiationBL.getOrchestrationRequestsPath()+"/"+requestId;
+ String path = asyncInstantiationBL.getOrchestrationRequestsPath() + "/" + requestId;
HttpResponse<AsyncRequestStatus> msoResponse = restMso.get(path, AsyncRequestStatus.class);
JobStatus jobStatus;
if (msoResponse.getStatus() >= 400 || msoResponse.getBody() == null) {
- auditService.setFailedAuditStatusFromMso(jobUuid, requestId, msoResponse.getStatus(), msoResponse.getBody().toString());
+ auditService.setFailedAuditStatusFromMso(jobUuid, requestId, msoResponse.getStatus(), Objects.toString(msoResponse.getBody()));
LOGGER.error(EELFLoggerDelegate.errorLogger,
"Failed to get orchestration status for {}. Status code: {}, Body: {}",
- requestId, msoResponse.getStatus(), msoResponse.getRawBody().toString());
+ requestId, msoResponse.getStatus(), Objects.toString(msoResponse.getRawBody()));
return new NextCommand(JobStatus.IN_PROGRESS, this);
- }
- else {
+ } else {
jobStatus = asyncInstantiationBL.calcStatus(msoResponse.getBody());
}
- asyncInstantiationBL.auditMsoStatus(jobUuid,msoResponse.getBody().request);
+ asyncInstantiationBL.auditMsoStatus(jobUuid, msoResponse.getBody().request);
if (jobStatus == JobStatus.FAILED) {
asyncInstantiationBL.handleFailedInstantiation(jobUuid);
- }
- else {
+ } else {
asyncInstantiationBL.updateServiceInfoAndAuditStatus(jobUuid, jobStatus);
}
//in case of JobStatus.PAUSE we leave the job itself as IN_PROGRESS, for keep tracking job progress
@@ -128,5 +134,4 @@ public class InProgressStatusCommand implements JobCommand {
return ImmutableMap.of("requestId", requestId);
}
-
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java b/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java
index 9d22b8bfa..958fc115e 100644
--- a/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java
+++ b/vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java
@@ -42,6 +42,7 @@ import org.springframework.stereotype.Component;
import javax.inject.Inject;
import java.util.Map;
+import java.util.Objects;
import java.util.UUID;
@@ -73,6 +74,14 @@ public class ServiceInstantiationCommand implements JobCommand {
init(uuid, serviceInstantiationRequest, userId);
}
+ ServiceInstantiationCommand(AsyncInstantiationBusinessLogic asyncInstantiationBL, AuditService auditService, MsoInterface msoInterface,
+ UUID uuid, ServiceInstantiation serviceInstantiation, String userId) {
+ this(uuid, serviceInstantiation, userId);
+ this.asyncInstantiationBL = asyncInstantiationBL;
+ this.auditService = auditService;
+ this.restMso = msoInterface;
+ }
+
@Override
public NextCommand call() {
RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper ;
@@ -81,7 +90,6 @@ public class ServiceInstantiationCommand implements JobCommand {
uuid, serviceInstantiationRequest, userId
);
}
-
//Aai return bad response while checking names uniqueness
catch (InvalidAAIResponseException exception) {
LOGGER.error("Failed to check name uniqueness in AAI. VID will try again later", exception);
@@ -116,7 +124,7 @@ public class ServiceInstantiationCommand implements JobCommand {
return new NextCommand(jobStatus, new InProgressStatusCommand(uuid, requestId));
} else {
auditService.setFailedAuditStatusFromMso(uuid,null, msoResponse.getStatus(),
- msoResponse.getBody().toString());
+ Objects.toString(msoResponse.getBody()));
return handleCommandFailed();
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java b/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java
index 77e1dd2cf..59f12f4c5 100644
--- a/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java
@@ -33,14 +33,10 @@ public class JobAdapterImpl implements JobAdapter {
}
@Override
- public Job createJob(JobType jobType, AsyncJobRequest request, UUID templateId, String userId, Integer indexInBulk){
- JobDaoImpl job = new JobDaoImpl();
- job.setStatus(Job.JobStatus.PENDING);
- job.setTypeAndData(jobType, ImmutableMap.of(
+ public Job createJob(JobType jobType, AsyncJobRequest request, UUID templateId, String userId, Integer indexInBulk) {
+ JobDaoImpl job = createJob(jobType, templateId, indexInBulk, ImmutableMap.of(
"request", request,
"userId", userId));
- job.setTemplateId(templateId);
- job.setIndexInBulk(indexInBulk);
job.setUserId(userId);
return job;
}
@@ -59,14 +55,17 @@ public class JobAdapterImpl implements JobAdapter {
List<Job> jobList = new ArrayList<>(count + 1);
UUID templateId = UUID.randomUUID();
for (int i = 0; i < count; i++) {
- Job child = new JobDaoImpl();
- child.setTypeAndData(jobType, bulkRequest);
- child.setStatus(Job.JobStatus.PENDING);
- child.setTemplateId(templateId);
- child.setIndexInBulk(i);
- jobList.add(child);
+ jobList.add(createJob(jobType, templateId, i, bulkRequest));
}
return jobList;
}
+ private JobDaoImpl createJob(JobType jobType, UUID templateId, Integer indexInBulk, Map<String, Object> data) {
+ JobDaoImpl job = new JobDaoImpl();
+ job.setStatus(Job.JobStatus.PENDING);
+ job.setTypeAndData(jobType, data);
+ job.setTemplateId(templateId);
+ job.setIndexInBulk(indexInBulk);
+ return job;
+ }
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java b/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java
index 99824e72b..91617ff42 100644
--- a/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java
+++ b/vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java
@@ -1,12 +1,41 @@
package org.onap.vid.model;
-//import org.hibernate.annotations.Table;
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright © 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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=========================================================
+ */
-import javax.persistence.*;
import java.util.HashSet;
+import java.util.Objects;
import java.util.Set;
-
-//import javax.persistence.*;
+import javax.persistence.Column;
+import javax.persistence.Entity;
+import javax.persistence.EnumType;
+import javax.persistence.Enumerated;
+import javax.persistence.FetchType;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+import javax.persistence.OneToMany;
+import javax.persistence.Table;
+import javax.persistence.UniqueConstraint;
@Entity
@Table(name = "vid_category_parameter", uniqueConstraints = @UniqueConstraint(columnNames = "name"))
@@ -72,4 +101,20 @@ public class CategoryParameter extends VidBaseEntity {
public void setIdSupported(boolean idSupported) {
this.idSupported = idSupported;
}
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || this.getClass() != o.getClass()) return false;
+ CategoryParameter that = (CategoryParameter) o;
+ return this.idSupported == that.idSupported &&
+ Objects.equals(this.name, that.name) &&
+ Objects.equals(this.family, that.family) &&
+ Objects.equals(this.options, that.options);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(this.name, this.idSupported, this.family, this.options);
+ }
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java
index 79befe176..0ecb9257e 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java
@@ -28,6 +28,8 @@ public interface MsoBusinessLogic {
MsoResponseWrapper createVfModuleInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId);
+ MsoResponseWrapper scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId);
+
MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId);
MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus);
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java
index 00db464ab..a6226e00e 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java
@@ -46,7 +46,11 @@ import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import static java.util.stream.Collectors.collectingAndThen;
+import static java.util.stream.Collectors.toList;
import static org.apache.commons.lang.StringUtils.upperCase;
import static org.onap.vid.changeManagement.ChangeManagementRequest.MsoChangeManagementRequest;
import static org.onap.vid.controllers.MsoController.*;
@@ -56,10 +60,14 @@ import static org.onap.vid.utils.Logging.debugRequestDetails;
public class MsoBusinessLogicImpl implements MsoBusinessLogic {
- public static final String START = " start";
- public static final String RESOURCE_TYPE = "resourceType";
- FeatureManager featureManager;
-
+ static final List<String> DASHBOARD_ALLOWED_TYPES = Stream.of(RequestType.REPLACE_INSTANCE,
+ RequestType.UPDATE_INSTANCE,
+ RequestType.APPLY_UPDATED_CONFIG,
+ RequestType.IN_PLACE_SOFTWARE_UPDATE,
+ RequestType.SCALE_OUT)
+ .map(requestType -> requestType.toString().toUpperCase())
+ .collect(collectingAndThen(toList(), Collections::unmodifiableList));
+ private static final String RESOURCE_TYPE = "resourceType";
/**
* The Constant dateFormat.
*/
@@ -74,16 +82,16 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
private static final String SOURCE_OPERATIONAL_ENVIRONMENT = "VID";
private static final ObjectMapper objectMapper = new ObjectMapper();
/**
+ * The logger.
+ */
+ private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoBusinessLogicImpl.class);
+ /**
* The Mso REST client
* This should be replaced with mso client factory.
*/
private final MsoInterface msoClientInterface;
+ FeatureManager featureManager;
- /**
- * The logger.
- */
- private static final EELFLoggerDelegate logger = EELFLoggerDelegate.getLogger(MsoBusinessLogicImpl.class);
-
@Autowired
public MsoBusinessLogicImpl(MsoInterface msoClientInterface, FeatureManager featureManager) {
this.msoClientInterface = msoClientInterface;
@@ -101,34 +109,26 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
// this function should get params from tosca and send them to instance at mso, then return success response.
@Override
public MsoResponseWrapper createSvcInstance(RequestDetails msoRequest) {
- String methodName = "createSvcInstance ";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("createSvcInstance");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
return msoClientInterface.createSvcInstance(msoRequest, endpoint);
}
@Override
- public MsoResponseWrapper createE2eSvcInstance(Object msoRequest){
- String methodName = "createE2eSvcInstance ";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
-
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE);
-
+ public MsoResponseWrapper createE2eSvcInstance(Object msoRequest) {
+ logInvocationInDebug("createE2eSvcInstance");
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE);
return msoClientInterface.createE2eSvcInstance(msoRequest, endpoint);
- }
+ }
@Override
public MsoResponseWrapper createVnf(RequestDetails requestDetails, String serviceInstanceId) {
- String methodName = "createVnf";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("createVnf");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
return msoClientInterface.createVnf(requestDetails, vnf_endpoint);
@@ -136,11 +136,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper createNwInstance(RequestDetails requestDetails, String serviceInstanceId) {
- String methodName = "createNwInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("createNwInstance");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
String nw_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
return msoClientInterface.createNwInstance(requestDetails, nw_endpoint);
@@ -148,11 +146,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper createVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
- String methodName = "createVolumeGroupInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("createVolumeGroupInstance");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
vnf_endpoint = vnf_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
@@ -162,11 +158,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper createVfModuleInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
- String methodName = "createVfModuleInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("createVfModuleInstance");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
@@ -175,9 +169,24 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
}
@Override
+ public MsoResponseWrapper scaleOutVfModuleInstance(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
+ logInvocationInDebug("scaleOutVfModuleInstance");
+
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT);
+
+ String partial_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
+ String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
+ RequestDetailsWrapper wrapper = new RequestDetailsWrapper();
+ requestDetails.setVnfName(null);
+ requestDetails.setVnfInstanceId(null);
+ wrapper.requestDetails = requestDetails;
+
+ return msoClientInterface.scaleOutVFModuleInstance(wrapper, vf_module_endpoint);
+ }
+
+ @Override
public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String serviceInstanceId) {
- String methodName = "createConfigurationInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("createConfigurationInstance");
String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATIONS);
endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
@@ -187,24 +196,21 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper deleteE2eSvcInstance(Object requestDetails, String serviceInstanceId) {
- String methodName = "deleteE2eSvcInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("deleteE2eSvcInstance");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId;
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_E2E_SVC_INSTANCE) + "/" + serviceInstanceId;
return msoClientInterface.deleteE2eSvcInstance(requestDetails, endpoint);
}
@Override
public MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String serviceInstanceId, String serviceStatus) {
- String methodName = "deleteSvcInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("deleteSvcInstance");
String endpoint;
- if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)){
+ if (featureManager.isActive(FLAG_UNASSIGN_SERVICE)) {
endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE);
- if (shouldUnassignService(serviceStatus)){
+ if (shouldUnassignService(serviceStatus)) {
logger.debug(EELFLoggerDelegate.debugLogger, "unassign service");
String svc_endpoint = endpoint + "/" + serviceInstanceId + "/unassign";
return msoClientInterface.unassignSvcInstance(requestDetails, svc_endpoint);
@@ -218,16 +224,14 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
}
private boolean shouldUnassignService(String serviceStatus) {
- return ImmutableList.of("created","pendingdelete","pending-delete", "assigned").contains(serviceStatus.toLowerCase());
+ return ImmutableList.of("created", "pendingdelete", "pending-delete", "assigned").contains(serviceStatus.toLowerCase());
}
@Override
public MsoResponseWrapper deleteVnf(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
- String methodName = "deleteVnf";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("deleteVnf");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
vnf_endpoint = vnf_endpoint + '/' + vnfInstanceId;
@@ -236,14 +240,10 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper deleteVfModule(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String vfModuleId) {
- String methodName = "deleteVfModule";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
-
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
+ logInvocationInDebug("deleteVfModule");
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId).replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
-
String delete_vf_endpoint = vf__modules_endpoint + '/' + vfModuleId;
return msoClientInterface.deleteVfModule(requestDetails, delete_vf_endpoint);
@@ -251,12 +251,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper deleteVolumeGroupInstance(RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId, String volumeGroupId) {
- String methodName = "deleteVolumeGroupInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
-
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
+ logInvocationInDebug("deleteVolumeGroupInstance");
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
String vnf_endpoint = svc_endpoint.replaceFirst(VNF_INSTANCE_ID, vnfInstanceId);
String delete_volume_group_endpoint = vnf_endpoint + "/" + volumeGroupId;
@@ -266,12 +263,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper deleteNwInstance(RequestDetails requestDetails, String serviceInstanceId, String networkInstanceId) {
- String methodName = "deleteNwInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
-
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
+ logInvocationInDebug("deleteNwInstance");
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
String svc_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
String delete_nw_endpoint = svc_endpoint + "/" + networkInstanceId;
@@ -281,7 +275,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper getOrchestrationRequest(String requestId) {
String methodName = "getOrchestrationRequest";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug(methodName);
try {
String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQ);
String path = p + "/" + requestId;
@@ -289,8 +283,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
return msoClientInterface.getOrchestrationRequest(path);
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ logException(methodName, e);
throw e;
}
}
@@ -298,7 +291,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper getOrchestrationRequests(String filterString) {
String methodName = "getOrchestrationRequest";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug(methodName);
try {
String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
String path = p + filterString;
@@ -306,8 +299,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
return msoClientInterface.getOrchestrationRequest(path);
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ logException(methodName, e);
throw e;
}
}
@@ -315,48 +307,51 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public List<Request> getOrchestrationRequestsForDashboard() {
String methodName = "getOrchestrationRequestsForDashboard";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
- List<Request> filteredOrchestrationRequests = new ArrayList<>();
- try {
- String path = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS);
- path += "filter=modelType:EQUALS:vnf";
- RestObject<String> restObjStr = new RestObject<>();
- String str = new String();
- restObjStr.set(str);
+ logInvocationInDebug(methodName);
- MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequestsForDashboard(str, "", path, restObjStr);
- List<RequestWrapper> allOrchestrationRequests = deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity());
-
- final ImmutableList<String> suppoertedRequestTypes = ImmutableList.of(
- RequestType.REPLACE_INSTANCE.toString().toUpperCase(),
- RequestType.UPDATE_INSTANCE.toString().toUpperCase(),
- RequestType.APPLY_UPDATED_CONFIG.toString().toUpperCase(),
- RequestType.IN_PLACE_SOFTWARE_UPDATE.toString().toUpperCase()
- );
-
- for (RequestWrapper currentRequest : allOrchestrationRequests) {
- if (currentRequest.getRequest() != null
- && "vnf".equalsIgnoreCase(currentRequest.getRequest().getRequestScope())
- && suppoertedRequestTypes.contains(upperCase(currentRequest.getRequest().getRequestType()))
- ) {
- filteredOrchestrationRequests.add(currentRequest.getRequest());
- }
- }
+ List<Request> dashboardOrchestrationReqs = new ArrayList<>();
+ try {
+ List<RequestWrapper> vnfOrchestrationReqsWrappers = getOrchestrationRequestsByFilter("modelType", "vnf");
+ dashboardOrchestrationReqs = vnfOrchestrationReqsWrappers.stream()
+ .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest())
+ && DASHBOARD_ALLOWED_TYPES.contains(upperCase(reqWrapper.getRequest().getRequestType())))
+ .map(RequestWrapper::getRequest)
+ .collect(Collectors.toList());
+
+ List<RequestWrapper> scaleOutOrchestrationReqWrappers = getOrchestrationRequestsByFilter("action", "scaleOut");
+ List<Request> scaleoutRequests = scaleOutOrchestrationReqWrappers.stream()
+ .filter(reqWrapper -> Objects.nonNull(reqWrapper.getRequest()))
+ .map(RequestWrapper::getRequest)
+ .collect(Collectors.toList());
+
+ dashboardOrchestrationReqs.addAll(scaleoutRequests);
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ logException(methodName, e);
}
- return filteredOrchestrationRequests;
+ return dashboardOrchestrationReqs;
+ }
+
+ private String constructOrchestrationRequestFilter(String filterName, String filterValue) {
+ return String.format("%sfilter=%s:EQUALS:%s",
+ SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_ORC_REQS), filterName, filterValue);
+ }
+
+ private List<RequestWrapper> getOrchestrationRequestsByFilter(String filterName, String filterValue) {
+ String orchestrationReqPath = constructOrchestrationRequestFilter(filterName, filterValue);
+ RestObject<String> restObjStr = new RestObject<>();
+ String str = new String();
+ restObjStr.set(str);
+ MsoResponseWrapper msoResponseWrapper = msoClientInterface.getOrchestrationRequestsForDashboard(str, "", orchestrationReqPath, restObjStr);
+ return deserializeOrchestrationRequestsJson(msoResponseWrapper.getEntity());
}
private List<RequestWrapper> deserializeOrchestrationRequestsJson(String orchestrationRequestsJson) {
- String methodName = "deserializeOrchestrationRequestsJson";
- logger.debug(dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("deserializeOrchestrationRequestsJson");
ObjectMapper mapper = new ObjectMapper();
mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
mapper.configure(DeserializationFeature.READ_ENUMS_USING_TO_STRING, true);
- RequestList requestList = null;
+ RequestList requestList;
try {
requestList = mapper.readValue(orchestrationRequestsJson, RequestList.class);
} catch (IOException e) {
@@ -369,7 +364,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public List<Task> getManualTasksByRequestId(String originalRequestId) {
String methodName = "getManualTasksByRequestId";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug(methodName);
try {
String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
@@ -383,15 +378,13 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
return deserializeManualTasksJson(msoResponseWrapper.getEntity());
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ logException(methodName, e);
throw e;
}
}
private List<Task> deserializeManualTasksJson(String manualTasksJson) {
- String methodName = "deserializeManualTasksJson";
- logger.debug(dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("deserializeManualTasksJson");
ObjectMapper mapper = new ObjectMapper();
try {
@@ -406,7 +399,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper completeManualTask(RequestDetails requestDetails, String taskId) {
String methodName = "completeManualTask";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug(methodName);
try {
String p = SystemProperties.getProperty(MsoProperties.MSO_REST_API_GET_MAN_TASKS);
String path = p + "/" + taskId + "/complete";
@@ -420,8 +413,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
return MsoUtil.wrapResponse(restObjStr);
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ logException(methodName, e);
throw e;
}
}
@@ -429,7 +421,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper activateServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
String methodName = "activateServiceInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug(methodName);
try {
String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
String activateServicePath = serviceEndpoint + "/" + serviceInstanceId + ACTIVATE;
@@ -443,8 +435,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
return MsoUtil.wrapResponse(restObjStr);
} catch (Exception e) {
- logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ logException(methodName, e);
throw e;
}
}
@@ -452,8 +443,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapperInterface updateVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
- String methodName = "updateVnf";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("updateVnf");
String endpoint;
endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
@@ -464,11 +454,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapperInterface replaceVnf(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
- String methodName = "replaceVnf";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("replaceVnf");
- String endpoint;
- endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, MsoChangeManagementRequest.REPLACE);
@@ -489,22 +477,17 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public RequestDetailsWrapper generateConfigMsoRequest(org.onap.vid.changeManagement.RequestDetails requestDetails) {
validateUpdateVnfConfig(requestDetails);
- RequestDetails ConfigUpdateRequest = new RequestDetails();
- ConfigUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
- ConfigUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
+ RequestDetails configUpdateRequest = new RequestDetails();
+ configUpdateRequest.setRequestParameters(requestDetails.getRequestParameters());
+ configUpdateRequest.setRequestInfo(requestDetails.getRequestInfo());
RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
- requestDetailsWrapper.requestDetails = ConfigUpdateRequest;
+ requestDetailsWrapper.requestDetails = configUpdateRequest;
return requestDetailsWrapper;
}
-
-
-
-
@Override
public MsoResponseWrapperInterface updateVnfSoftware(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
- String methodName = "updateVnfSoftware";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("updateVnfSoftware");
String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.SOFTWARE_UPDATE); //workflow name in mso is different than workflow name in vid UI
RequestDetailsWrapper finalRequestDetails = generateInPlaceMsoRequest(requestDetails);
return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint);
@@ -512,30 +495,28 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapperInterface updateVnfConfig(org.onap.vid.changeManagement.RequestDetails requestDetails, String serviceInstanceId, String vnfInstanceId) {
- String methodName = "updateVnfConfig";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("updateVnfConfig");
RequestDetailsWrapper finalRequestDetails = generateConfigMsoRequest(requestDetails);
String vnf_endpoint = getChangeManagementEndpoint(serviceInstanceId, vnfInstanceId, MsoChangeManagementRequest.CONFIG_UPDATE);
return msoClientInterface.changeManagementUpdate(finalRequestDetails, vnf_endpoint);
}
private String getChangeManagementEndpoint(String serviceInstanceId, String vnfInstanceId, String vnfRequestType) {
- String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
+ String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_CHANGE_MANAGEMENT_INSTANCE);
String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, serviceInstanceId);
vnf_endpoint = vnf_endpoint.replace(VNF_INSTANCE_ID, vnfInstanceId);
vnf_endpoint = vnf_endpoint.replace(REQUEST_TYPE, vnfRequestType);
return vnf_endpoint;
}
- private Map getChangeManagementPayload(RequestDetails requestDetails, String message){
- if(requestDetails.getRequestParameters()==null||requestDetails.getRequestParameters().getAdditionalProperties()==null){
+ private Map getChangeManagementPayload(RequestDetails requestDetails, String message) {
+ if (requestDetails.getRequestParameters() == null || requestDetails.getRequestParameters().getAdditionalProperties() == null) {
throw new BadRequestException(message);
}
- Object payloadRaw=requestDetails.getRequestParameters().getAdditionalProperties().get("payload");
- try{
- return objectMapper.readValue((String)payloadRaw,Map.class);
- }
- catch(Exception exception){
+ Object payloadRaw = requestDetails.getRequestParameters().getAdditionalProperties().get("payload");
+ try {
+ return objectMapper.readValue((String) payloadRaw, Map.class);
+ } catch (Exception exception) {
throw new BadRequestException(message);
}
}
@@ -564,30 +545,12 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
}
}
- private void validateUpdateVnfConfig(RequestDetails requestDetails) {
- final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request";
-
- Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
- validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters");
- validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters");
- }
-
- private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) {
- final String noValidPayloadPropertyMsg = noValidPayloadMsg+ ", "+ propertyName + " property is not valid";
- if(!payload.containsKey(propertyName)) {
- throw new BadRequestException( noValidPayloadPropertyMsg);
- }
- }
-
@Override
- public MsoResponseWrapper deleteConfiguration(
- org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper,
- String serviceInstanceId,
- String configurationId) {
-
- String methodName = "deleteConfiguration";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ public MsoResponseWrapper deleteConfiguration(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper,
+ String serviceInstanceId,
+ String configurationId) {
+ logInvocationInDebug("deleteConfiguration");
String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
endpoint = endpoint.replace(CONFIGURATION_ID, configurationId);
@@ -602,8 +565,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
String configurationId,
boolean isActivate) {
- String methodName = "setConfigurationActiveStatus";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("setConfigurationActiveStatus");
String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
@@ -616,9 +578,9 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
}
@Override
- public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails , String serviceInstanceId, boolean isActivate) {
+ public MsoResponseWrapper setServiceInstanceStatus(RequestDetails requestDetails, String serviceInstanceId, boolean isActivate) {
+ logInvocationInDebug("setServiceInstanceStatus");
String methodName = "setServiceInstanceStatus";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
try {
String serviceEndpoint = validateEndpointPath(MsoProperties.MSO_REST_API_SVC_INSTANCE);
String endpoint = serviceEndpoint + "/" + serviceInstanceId;
@@ -631,7 +593,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
String str = "";
restObjStr.set(str);
- msoClientInterface.setServiceInstanceStatus(requestDetails , str, "", endpoint, restObjStr);
+ msoClientInterface.setServiceInstanceStatus(requestDetails, str, "", endpoint, restObjStr);
return MsoUtil.wrapResponse(restObjStr);
@@ -648,8 +610,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
String serviceInstanceId,
String configurationId,
boolean isEnable) {
- String methodName = "setPortOnConfigurationStatus";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("setPortOnConfigurationStatus");
String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_CONFIGURATION_INSTANCE);
endpoint = endpoint.replace(SVC_INSTANCE_ID, serviceInstanceId);
@@ -663,7 +624,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
- public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) {
+ public RequestDetailsWrapper<RequestDetails> createOperationalEnvironmentActivationRequestDetails(OperationalEnvironmentActivateInfo details) {
RequestDetails requestDetails = new RequestDetails();
RequestInfo requestInfo = new RequestInfo();
requestInfo.setAdditionalProperty(RESOURCE_TYPE, RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT);
@@ -737,7 +698,6 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
}
-
@Override
public RequestDetailsWrapper<OperationEnvironmentRequestDetails> convertParametersToRequestDetails(OperationalEnvironmentController.OperationalEnvironmentCreateBody input, String userId) {
OperationEnvironmentRequestDetails.RequestInfo requestInfo = new OperationEnvironmentRequestDetails.RequestInfo(
@@ -766,8 +726,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper removeRelationshipFromServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
- String methodName = "removeRelationshipFromServiceInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("removeRelationshipFromServiceInstance");
String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
String removeRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/removeRelationships";
@@ -777,8 +736,7 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
@Override
public MsoResponseWrapper addRelationshipToServiceInstance(RequestDetails requestDetails, String serviceInstanceId) {
- String methodName = "addRelationshipToServiceInstance";
- logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ logInvocationInDebug("addRelationshipToServiceInstance");
String serviceEndpoint = SystemProperties.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
String addRelationshipsPath = serviceEndpoint + "/" + serviceInstanceId + "/addRelationships";
@@ -786,8 +744,31 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
return msoClientInterface.addRelationshipToServiceInstance(requestDetails, addRelationshipsPath);
}
+ private void validateUpdateVnfConfig(RequestDetails requestDetails) {
+ final String noValidPayloadMsg = "No valid payload in " + ChangeManagementRequest.CONFIG_UPDATE + " request";
- public enum RequestType {
+ Map payload = getChangeManagementPayload(requestDetails, noValidPayloadMsg);
+ validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "request-parameters");
+ validateConfigUpdateVnfPayloadProperty(payload, noValidPayloadMsg, "configuration-parameters");
+ }
+
+ private void validateConfigUpdateVnfPayloadProperty(Map payload, String noValidPayloadMsg, String propertyName) {
+ final String noValidPayloadPropertyMsg = noValidPayloadMsg + ", " + propertyName + " property is not valid";
+ if (!payload.containsKey(propertyName)) {
+ throw new BadRequestException(noValidPayloadPropertyMsg);
+ }
+ }
+
+ private void logInvocationInDebug(String methodName) {
+ logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " start");
+ }
+
+ private void logException(String methodName, Exception e) {
+ logger.error(EELFLoggerDelegate.errorLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + "." + methodName + e.toString());
+ }
+
+ enum RequestType {
CREATE_INSTANCE("createInstance"),
DELETE_INSTANCE("deleteInstance"),
@@ -797,27 +778,23 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
DEACTIVATE_INSTANCE("deactivateInstance"),
APPLY_UPDATED_CONFIG("applyUpdatedConfig"),
IN_PLACE_SOFTWARE_UPDATE("inPlaceSoftwareUpdate"),
+ SCALE_OUT("scaleOut"),
UNKNOWN("unknown"),
NOT_PROVIDED("not provided");
- private final String value;
private static final Map<String, RequestType> CONSTANTS = new HashMap<>();
static {
- for (RequestType c: values()) {
+ for (RequestType c : values()) {
CONSTANTS.put(c.value, c);
}
}
+ private final String value;
+
RequestType(String value) {
this.value = value;
}
- @JsonValue
- @Override
- public String toString() {
- return this.value;
- }
-
@JsonCreator
public static RequestType fromValue(String value) {
RequestType constant = CONSTANTS.get(value);
@@ -827,5 +804,11 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
return constant;
}
}
+
+ @JsonValue
+ @Override
+ public String toString() {
+ return this.value;
+ }
}
} \ No newline at end of file
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java
index 3cba12f67..834f80885 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java
@@ -74,6 +74,8 @@ public interface MsoInterface {
MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String endpoint);
+ MsoResponseWrapper scaleOutVFModuleInstance(RequestDetailsWrapper requestDetailsWrapper, String endpoint);
+
MsoResponseWrapper deleteSvcInstance(RequestDetails requestDetails, String endpoint);
MsoResponseWrapper unassignSvcInstance(RequestDetails requestDetails, String endpoint);
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java b/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java
index 773b8a83a..1d71e9c75 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java
@@ -99,6 +99,8 @@ public class MsoProperties extends SystemProperties {
/** The Constant MSO_REST_API_VF_MODULE_INSTANCE. */
public static final String MSO_REST_API_VF_MODULE_INSTANCE = "mso.restapi.vf.module.instance";
+ public static final String MSO_REST_API_VF_MODULE_SCALE_OUT = "mso.restapi.vf.module.scaleout";
+
/** The Constant MSO_REST_API_VOLUME_GROUP_INSTANCE. */
public static final String MSO_REST_API_VOLUME_GROUP_INSTANCE = "mso.restapi.volume.group.instance"; //serviceInstances/v2/{serviceInstanceId}/volumeGroups
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java b/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java
index 9cac3e4e2..37600f7b9 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java
@@ -124,6 +124,14 @@ public class MsoRestClientNew implements MsoInterface {
}
@Override
+ public MsoResponseWrapper scaleOutVFModuleInstance(RequestDetailsWrapper requestDetailsWrapper, String endpoint) {
+ String methodName = "scaleOutVFModuleInstance";
+ logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
+ String path = baseUrl + endpoint;
+ return createInstance(requestDetailsWrapper, path);
+ }
+
+ @Override
public MsoResponseWrapper createConfigurationInstance(org.onap.vid.mso.rest.RequestDetailsWrapper requestDetailsWrapper, String endpoint) {
String methodName = "createConfigurationInstance";
logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + START);
@@ -478,7 +486,7 @@ public class MsoRestClientNew implements MsoInterface {
try {
logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " calling Delete, path =[" + path + "]");
- HttpResponse<String> response = client.delete(path, commonHeaders, String.class);
+ HttpResponse<String> response = client.delete(path, commonHeaders, request, String.class);
MsoResponseWrapper w = MsoUtil.wrapResponse(response);
logger.debug(EELFLoggerDelegate.debugLogger, dateFormat.format(new Date()) + "<== " + methodName + " w=" + w.getResponse());
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java
index df6914843..2b159f812 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java
@@ -20,11 +20,20 @@
package org.onap.vid.mso.rest;
-import com.fasterxml.jackson.annotation.*;
-import org.apache.commons.lang.builder.EqualsBuilder;
-import org.apache.commons.lang.builder.HashCodeBuilder;
-import org.apache.commons.lang.builder.ToStringBuilder;
-import org.onap.vid.domain.mso.*;
+import com.fasterxml.jackson.annotation.JsonAnyGetter;
+import com.fasterxml.jackson.annotation.JsonAnySetter;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import org.apache.commons.lang3.builder.EqualsBuilder;
+import org.apache.commons.lang3.builder.HashCodeBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.onap.vid.domain.mso.CloudConfiguration;
+import org.onap.vid.domain.mso.ModelInfo;
+import org.onap.vid.domain.mso.RequestInfo;
+import org.onap.vid.domain.mso.RequestParameters;
+import org.onap.vid.domain.mso.SubscriberInfo;
import java.util.HashMap;
import java.util.List;
@@ -41,7 +50,8 @@ import java.util.Map;
"relatedModelList",
"requestInfo",
"subscriberInfo",
- "requestParameters"
+ "requestParameters",
+ "configurationParameters"
})
public class RequestDetails{
@@ -71,6 +81,9 @@ public class RequestDetails{
@JsonProperty("requestParameters")
private RequestParameters requestParameters;
+ @JsonProperty("configurationParameters")
+ protected List<Map<String, String>> configurationParameters;
+
/** The additional properties. */
@JsonIgnore
private Map<String, Object> additionalProperties = new HashMap<String, Object>();
@@ -198,12 +211,31 @@ public class RequestDetails{
this.additionalProperties.put(name, value);
}
+ @JsonProperty("configurationParameters")
+ public List<Map<String, String>> getConfigurationParameters() {
+ return configurationParameters;
+ }
+
+ @JsonProperty("configurationParameters")
+ public void setConfigurationParameters(List<Map<String, String>> configurationParameters) {
+ this.configurationParameters = configurationParameters;
+ }
+
/* (non-Javadoc)
* @see org.onap.vid.domain.mso.RequestDetails#hashCode()
*/
@Override
public int hashCode() {
- return new HashCodeBuilder().append(cloudConfiguration).append(modelInfo).append(relatedInstanceList).append(requestInfo).append(getRequestParameters()).append(subscriberInfo).append(additionalProperties).toHashCode();
+ return new HashCodeBuilder()
+ .append(cloudConfiguration)
+ .append(modelInfo)
+ .append(relatedInstanceList)
+ .append(requestInfo)
+ .append(getRequestParameters())
+ .append(subscriberInfo)
+ .append(additionalProperties)
+ .append(configurationParameters)
+ .toHashCode();
}
/* (non-Javadoc)
@@ -214,11 +246,20 @@ public class RequestDetails{
if (other == this) {
return true;
}
- if ((other instanceof RequestDetails) == false) {
+ if (!(other instanceof RequestDetails)) {
return false;
}
RequestDetails rhs = ((RequestDetails) other);
- return new EqualsBuilder().append(cloudConfiguration, rhs.cloudConfiguration).append(modelInfo, rhs.modelInfo).append(relatedInstanceList, rhs.relatedInstanceList).append(requestInfo, rhs.requestInfo).append(getRequestParameters(), rhs.getRequestParameters()).append(subscriberInfo, rhs.subscriberInfo).append(additionalProperties, rhs.additionalProperties).isEquals();
+ return new EqualsBuilder()
+ .append(cloudConfiguration, rhs.cloudConfiguration)
+ .append(modelInfo, rhs.modelInfo)
+ .append(relatedInstanceList, rhs.relatedInstanceList)
+ .append(requestInfo, rhs.requestInfo)
+ .append(getRequestParameters(), rhs.getRequestParameters())
+ .append(subscriberInfo, rhs.subscriberInfo)
+ .append(additionalProperties, rhs.additionalProperties)
+ .append(configurationParameters, rhs.configurationParameters)
+ .isEquals();
}
public RequestParameters getRequestParameters() {
diff --git a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java
index 0e320a35f..20c84422e 100644
--- a/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java
+++ b/vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java
@@ -1,5 +1,34 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Modifications Copyright (C) 2018 Nokia. 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============================================
+ *
+ *
+ */
package org.onap.vid.mso.rest;
-public class RequestDetailsWrapper {
- public RequestDetails requestDetails;
+public final class RequestDetailsWrapper {
+
+ private final RequestDetails requestDetails;
+
+ public RequestDetailsWrapper(RequestDetails requestDetails) {
+ this.requestDetails = requestDetails;
+ }
+
+ public RequestDetails getRequestDetails() {
+ return requestDetails;
+ }
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java b/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java
index 45835d459..5c1ee9e89 100644
--- a/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java
+++ b/vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java
@@ -1,3 +1,23 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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.vid.roles;
import com.fasterxml.jackson.core.JsonProcessingException;
@@ -16,8 +36,6 @@ import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
import java.util.*;
-//import org.codehaus.jackson.map.ObjectMapper;
-
/**
* Created by Oren on 7/1/17.
*/
@@ -45,16 +63,16 @@ public class RoleProvider {
LOG.debug(EELFLoggerDelegate.debugLogger, "Role provider => init method finished");
}
- public List<Role> getUserRoles(HttpServletRequest request) throws JsonProcessingException {
+ public List<Role> getUserRoles(HttpServletRequest request) {
String logPrefix = "Role Provider (" + UserUtils.getUserId(request) + ") ==>";
LOG.debug(EELFLoggerDelegate.debugLogger, logPrefix + "Entering to get user role for user " + UserUtils.getUserId(request));
List<Role> roleList = new ArrayList<>();
- //Disable roles until AAF integration finishes
- /*HashMap roles = UserUtils.getRoles(request);
+
+ Map roles = UserUtils.getRoles(request);
for (Object role : roles.keySet()) {
- org.openecomp.portalsdk.core.domain.Role sdkRol = (org.openecomp.portalsdk.core.domain.Role) roles.get(role);
+ org.onap.portalsdk.core.domain.Role sdkRol = (org.onap.portalsdk.core.domain.Role) roles.get(role);
LOG.debug(EELFLoggerDelegate.debugLogger, logPrefix + "Role " + sdkRol.getName() + " is being proccessed");
try {
@@ -67,11 +85,11 @@ public class RoleProvider {
roleList.add(createRoleFromStringArr(roleParts, logPrefix));
String msg = String.format(logPrefix + " User %s got permissions %s", UserUtils.getUserId(request), Arrays.toString(roleParts));
LOG.debug(EELFLoggerDelegate.debugLogger, msg);
- } catch (RoleParsingException e) {
+ } catch (Exception e) {
LOG.error(logPrefix + " Failed to parse permission");
}
- }*/
+ }
return roleList;
}
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java
index 13db1ae98..b4806f1ce 100644
--- a/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java
@@ -1,3 +1,23 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. 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=========================================================
+ */
package org.onap.vid.services;
import com.fasterxml.jackson.core.JsonParseException;
@@ -16,12 +36,12 @@ public class AuditServiceImpl implements AuditService{
@Inject
private AsyncInstantiationBusinessLogic asyncInstantiationBL;
+ public static final String FAILED_MSO_REQUEST_STATUS = "FAILED";
@Override
public void setFailedAuditStatusFromMso(UUID jobUuid, String requestId, int statusCode, String msoResponse){
- final String failedMsoRequestStatus = "FAILED";
String additionalInfo = formatExceptionAdditionalInfo(statusCode, msoResponse);
- asyncInstantiationBL.auditMsoStatus(jobUuid, failedMsoRequestStatus, requestId, additionalInfo);
+ asyncInstantiationBL.auditMsoStatus(jobUuid, FAILED_MSO_REQUEST_STATUS, requestId, additionalInfo);
}
private String formatExceptionAdditionalInfo(int statusCode, String msoResponse) {
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java
index fa531ffc1..b3d20a622 100644
--- a/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java
@@ -1,3 +1,23 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. 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=========================================================
+ */
package org.onap.vid.services;
import org.onap.vid.category.AddCategoryOptionResponse;
@@ -20,6 +40,7 @@ import java.util.stream.Collectors;
@Service
public class CategoryParameterServiceImpl implements CategoryParameterService {
+ public static final String OPTION_ALREADY_EXIST_FOR_CATEGORY = "Option %s already exist for category %s";
@Autowired
private DataAccessService dataAccessService;
@@ -68,7 +89,7 @@ public class CategoryParameterServiceImpl implements CategoryParameterService {
Set<String> categoryOptions = categoryParameter.getOptions().stream().map(CategoryParameterOption::getName).collect(Collectors.toSet());
for (String optionName : optionsRequest.options) {
if (categoryOptions.contains(optionName)) {
- response.getErrors().add(String.format("Option %s already exist for category %s", optionName, categoryName));
+ response.getErrors().add(String.format(OPTION_ALREADY_EXIST_FOR_CATEGORY, optionName, categoryName));
continue;
}
String appId = categoryParameter.isIdSupported() ? UUID.randomUUID().toString() : optionName;
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java
index 90d1c33e3..e4a6b3990 100644
--- a/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java
@@ -102,7 +102,7 @@ public class ChangeManagementServiceImpl implements ChangeManagementService {
break;
}
case ChangeManagementRequest.SCALE_OUT:{
- msoResponseWrapperObject = msoBusinessLogic.createVfModuleInstance(currentRequestDetails, serviceInstanceId, vnfInstanceId);
+ msoResponseWrapperObject = msoBusinessLogic.scaleOutVfModuleInstance(currentRequestDetails, serviceInstanceId, vnfInstanceId);
break;
}
default:
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java
index 21b1ec1c3..231b35222 100644
--- a/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java
@@ -1,3 +1,23 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. 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=========================================================
+ */
package org.onap.vid.services;
import org.onap.vid.aai.PombaClientInterface;
diff --git a/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java b/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java
index dc2541b3f..1890a5b37 100644
--- a/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java
+++ b/vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java
@@ -1,3 +1,23 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. 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=========================================================
+ */
package org.onap.vid.services;
import com.google.common.cache.CacheBuilder;
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
index 89660fb18..aee4c05fe 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
@@ -190,7 +190,7 @@
DataService.setPnf(!angular.equals(serviceModel.pnfs, {}));
$scope.createType = COMPONENT.A_LA_CARTE;
var broadcastType = COMPONENT.CREATE_COMPONENT;
- if (AsdcService.isMacro(serviceModel)) {
+ if (AsdcService.isMacro(serviceModel) || DataService.getE2EService()) {
DataService.setALaCarte(false);
if(AsdcService.shouldExcludeMacroFromAsyncInstatiationFlow(serviceModel)){
DataService.setShouldExcludeMacroFromAsyncInstatiationFlow(true);
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
index c55092e4c..3a5a1c7e0 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
@@ -10,7 +10,7 @@
vm.hasScheduler = !!VIDCONFIGURATION.SCHEDULER_PORTAL_URL;
vm.configUpdatePatternError = "Invalid file type. Please select a file with a CSV extension.";
vm.configUpdateContentError = "Invalid file structure.";
-
+
vm.wizardStep = 1;
vm.nextStep = function(){
vm.wizardStep++;
@@ -94,14 +94,14 @@
_.forEach(newVNFName.vfModules, function (mdl, key) {
mdl.scale = false; //defaults to not scale unless user changes it
- if(mdl.properties && mdl.properties.max_vf_module_instances) {
+ if(mdl.properties && mdl.properties.maxCountInstances) {
//how many vf modules of the same customizationId belong to that vnf instance
mdl.currentCount = _.filter(vm.vfModules, function(item){
return modulesAaiIds.indexOf(item.id) > -1 && item.properties["model-customization-id"] === mdl.customizationUuid;
}).length;
- mdl.scalable = mdl.properties.max_vf_module_instances.value - mdl.currentCount > 0;
+ mdl.scalable = mdl.properties.maxCountInstances.value - mdl.currentCount > 0;
}else{
mdl.scalable = false;
}
@@ -193,9 +193,10 @@
var result = {};
result.requestType = changeManagement.workflow;
var workflowType = changeManagement.workflow;
+ var configurationParameters = changeManagement.configurationParameters;
result.requestDetails = [];
_.forEach(changeManagement.vnfNames, function (vnf) {
-
+
try{
var requestInfoData ={};
var requestParametersData ={};
@@ -203,13 +204,13 @@
return !item.scale;
});
if (vnf.availableVersions && vnf.availableVersions.length!=0){
-
+
requestInfoData ={
source: vnf.availableVersions[0].requestInfo.source,
suppressRollback: vnf.availableVersions[0].requestInfo.suppressRollback,
requestorId: vnf.availableVersions[0].requestInfo.requestorId
}
-
+
if(workflowType=='Update'){
requestParametersData = {
usePreload: vnf.availableVersions[0].requestParameters.usePreload
@@ -268,17 +269,22 @@
var data;
if(workflowType=="VNF Scale Out") {
data = {
+ vnfName: vnf.name,
+ vnfInstanceId: vnf.id,
modelInfo: {
modelType: 'vfModule',
modelInvariantId: moduleToScale.invariantUuid,
modelName: moduleToScale.modelCustomizationName,
modelVersion: moduleToScale.version,
+ modelCustomizationName: moduleToScale.modelCustomizationName,
+ modelCustomizationId: moduleToScale.customizationUuid,
modelVersionId: moduleToScale.uuid
},
cloudConfiguration: vnf.cloudConfiguration,
requestInfo: requestInfoData,
relatedInstanceList: [],
- requestParameters:requestParametersData
+ requestParameters:requestParametersData,
+ configurationParameters: JSON.parse(configurationParameters)
};
requestInfoData.instanceName = vnf.name + "_" + (moduleToScale.currentCount + 1);
}else{
@@ -333,6 +339,7 @@
var relatedInstance = {
instanceId: vnf.id,
modelInfo: {
+ modelCustomizationId: vnf.availableVersions[0].modelInfo.modelCustomizationId,
modelCustomizationName: vnf.availableVersions[0].modelInfo.modelCustomizationName,
modelInvariantId: vnf.availableVersions[0].modelInfo.modelInvariantId,
modelName: vnf.availableVersions[0].modelInfo.modelName,
@@ -352,7 +359,6 @@
});
return JSON.stringify(result);
}
-
vm.openModal = function () {
if(vm.hasScheduler) { //scheduling supported
$scope.widgetParameter = ""; // needed by the scheduler?
@@ -370,22 +376,14 @@
widgetData: vm.changeManagement,
widgetParameter: $scope.widgetParameter
};
-
+
window.parent.postMessage(data, VIDCONFIGURATION.SCHEDULER_PORTAL_URL);
} else {
//no scheduling support
var dataToSo = extractChangeManagementCallbackDataStr(vm.changeManagement);
if(dataToSo) {
-
- if(vm.changeManagement.workflow==="VNF Scale Out") {
- dataToSo = JSON.parse(dataToSo);
- dataToSo = {requestDetails: dataToSo.requestDetails[0]};
- changeManagementService.postChangeManagementScaleOutNow(dataToSo, vm.changeManagement.vnfNames[0]["service-instance-node"][0].properties["service-instance-id"], vm.changeManagement.vnfNames[0].id);
- }else{
- //TODO: foreach
- var vnfName = vm.changeManagement.vnfNames[0].name;
- changeManagementService.postChangeManagementNow(dataToSo, vnfName);
- }
+ var vnfName = vm.changeManagement.vnfNames[0].name;
+ changeManagementService.postChangeManagementNow(dataToSo, vnfName);
}
}
};
@@ -649,7 +647,7 @@
vm.isConfigUpdate = function () {
return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfConfigUpdate;
}
-
+
vm.isScaleOut = function () {
return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfScaleOut;
}
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
index ec1d4cde6..21f9c5d3f 100644
--- a/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
@@ -58,6 +58,10 @@
<option value="" disabled>Select workflow</option>
</select>
</div>
+ <div class="form-group" ng-if="vm.isScaleOut()">
+ <label class="control-label">Configuration Parameters</label>
+ <input type="text" name="configurationParameters" ng-model="vm.changeManagement.configurationParameters" id="configuration-parameters" required>
+ </div>
<div class="form-group" ng-if="vm.isConfigUpdate()">
<label class="control-label">Attach configuration file</label>
<div class="file-wrapper">
@@ -143,4 +147,4 @@
<button ng-if="vm.isScaleOut() && vm.wizardStep === 1" ng-click="vm.nextStep();" type="button" id="next" name="next" class="btn btn-primary" data-ng-disabled="newChangeManagement.$invalid">Next</button>
</div>
</div>
-</form>
+</form> \ No newline at end of file
diff --git a/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js b/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js
index 753f9fd19..6bdc0ae9c 100755
--- a/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js
+++ b/vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js
@@ -20,7 +20,7 @@
"use strict";
-var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCONFIGURATION, COMPONENT, featureFlags) {
+var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCONFIGURATION, COMPONENT, DataService, featureFlags) {
return {
getModel: function (modelId, successCallbackFunction) {
$log.debug("AsdcService:getModel: modelId: " + modelId);
@@ -37,6 +37,8 @@ var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCON
shouldExcludeMacroFromAsyncInstatiationFlow: function(serviceModel){
if (!featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_ASYNC_INSTANTIATION))
return true;
+ if (DataService.getE2EService())
+ return true;
if (!_.isEmpty(serviceModel.pnfs))
return true;
if (!_.isEmpty(serviceModel.collectionResource))
@@ -72,4 +74,4 @@ var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCON
}
appDS2.factory("AsdcService", ["$http", "$log", "PropertyService",
- "UtilityService", "VIDCONFIGURATION","COMPONENT", "featureFlags", AsdcService]);
+ "UtilityService", "VIDCONFIGURATION","COMPONENT", "DataService", "featureFlags", AsdcService]);
diff --git a/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java b/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java
index 76d1d4aff..43ac2899b 100644
--- a/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java
@@ -33,6 +33,7 @@ import org.onap.portalsdk.core.logging.logic.EELFLoggerDelegate;
import org.onap.portalsdk.core.util.SystemProperties;
import org.onap.vid.aai.model.AaiGetTenatns.GetTenantsResponse;
import org.onap.vid.aai.model.AaiNodeQueryResponse;
+import org.onap.vid.aai.model.PortDetailsTranslator;
import org.onap.vid.aai.model.ResourceType;
import org.onap.vid.aai.util.AAIRestInterface;
import org.onap.vid.aai.util.HttpsAuthClient;
@@ -76,7 +77,9 @@ import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalToIgnoringCase;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.*;
+import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.testng.Assert.*;
@@ -88,19 +91,19 @@ public class AaiClientTest {
private ServletContext servletContext;
@BeforeMethod
- public void initMocks(){
+ public void initMocks() {
aaiClientMock = mock(AaiClient.class);
aaiClientMock.logger = mock(EELFLoggerDelegate.class);
servletContext = mock(ServletContext.class);
when(servletContext.getRealPath(any(String.class))).thenReturn("");
- when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(null);
+ when(aaiClientMock.doAaiGet(any(String.class), any(Boolean.class))).thenReturn(null);
}
@DataProvider
public static Object[][] logicalLinkData() {
- return new Object[][] {
+ return new Object[][]{
{"", "network/logical-links/logical-link/"},
{"link", "network/logical-links/logical-link/link"}
};
@@ -111,21 +114,26 @@ public class AaiClientTest {
when(aaiClientMock.getLogicalLink(any(String.class))).thenCallRealMethod();
aaiClientMock.getLogicalLink(link);
- Mockito.verify(aaiClientMock).doAaiGet(argThat(equalToIgnoringCase(expectedUrl)),any(Boolean.class));
+ Mockito.verify(aaiClientMock).doAaiGet(argThat(equalToIgnoringCase(expectedUrl)), any(Boolean.class));
}
@DataProvider
public static Object[][] subscribersResults() {
- return new Object[][] {
- {new SubscriberList(new ArrayList<Subscriber>() {{ add(new Subscriber()); add(new Subscriber()); }}), true},
- {new SubscriberList(new ArrayList<Subscriber>() {{ add(new Subscriber()); }}), true},
+ return new Object[][]{
+ {new SubscriberList(new ArrayList<Subscriber>() {{
+ add(new Subscriber());
+ add(new Subscriber());
+ }}), true},
+ {new SubscriberList(new ArrayList<Subscriber>() {{
+ add(new Subscriber());
+ }}), true},
{new SubscriberList(new ArrayList<Subscriber>()), false}
};
}
@Test(dataProvider = "subscribersResults")
- public void testProbeAaiGetAllSubscribers_returnsTwoToZeroSubscribers_ResultsAsExpected(SubscriberList subscribers, boolean isAvailable){
- ExternalComponentStatus expectedStatus = new ExternalComponentStatus(ExternalComponentStatus.Component.AAI,isAvailable, new HttpRequestMetadata(
+ public void testProbeAaiGetAllSubscribers_returnsTwoToZeroSubscribers_ResultsAsExpected(SubscriberList subscribers, boolean isAvailable) {
+ ExternalComponentStatus expectedStatus = new ExternalComponentStatus(ExternalComponentStatus.Component.AAI, isAvailable, new HttpRequestMetadata(
HttpMethod.GET,
200,
"url",
@@ -138,9 +146,9 @@ public class AaiClientTest {
HttpMethod.GET, "url", new AaiResponse<>(subscribers, null, 200),
"rawData"));
Mockito.when(aaiClientMock.probeAaiGetAllSubscribers()).thenCallRealMethod();
- ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers();
- assertThat(statusDataReflected(result),is(statusDataReflected(expectedStatus)));
- assertThat(requestMetadataReflected(result.getMetadata()),is(requestMetadataReflected(expectedStatus.getMetadata())));
+ ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers();
+ assertThat(statusDataReflected(result), is(statusDataReflected(expectedStatus)));
+ assertThat(requestMetadataReflected(result.getMetadata()), is(requestMetadataReflected(expectedStatus.getMetadata())));
}
//serialize fields except of fields we cannot know ahead of time
@@ -159,12 +167,12 @@ public class AaiClientTest {
@DataProvider
public static Object[][] rawData() {
return new Object[][]{
- {"errorMessage", }, {""}, {null}
+ {"errorMessage",}, {""}, {null}
};
}
@Test(dataProvider = "rawData")
- public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String rawData){
+ public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String rawData) {
Mockito.when(aaiClientMock.getAllSubscribers(true)).thenReturn(
new AaiResponseWithRequestInfo<>(HttpMethod.GET, "url", null,
rawData));
@@ -175,7 +183,7 @@ public class AaiClientTest {
@DataProvider
public static Object[][] exceptions() {
- return new Object[][] {
+ return new Object[][]{
{"NullPointerException", "errorMessage",
new ExceptionWithRequestInfo(HttpMethod.GET, "url",
"errorMessage", null, new NullPointerException())},
@@ -188,7 +196,7 @@ public class AaiClientTest {
}
@Test(dataProvider = "exceptions")
- public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String description, String expectedRawData, Exception exception){
+ public void testProbeAaiGetFullSubscribersWithNullResponse_returnsNotAvailableWithErrorRawData(String description, String expectedRawData, Exception exception) {
Mockito.when(aaiClientMock.getAllSubscribers(true)).thenThrow(exception);
ExternalComponentStatus result = callProbeAaiGetAllSubscribersAndAssertNotAvailable();
if (exception instanceof ExceptionWithRequestInfo) {
@@ -200,7 +208,7 @@ public class AaiClientTest {
private ExternalComponentStatus callProbeAaiGetAllSubscribersAndAssertNotAvailable() {
Mockito.when(aaiClientMock.probeAaiGetAllSubscribers()).thenCallRealMethod();
- ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers();
+ ExternalComponentStatus result = aaiClientMock.probeAaiGetAllSubscribers();
assertFalse(result.isAvailable());
return result;
}
@@ -227,7 +235,7 @@ public class AaiClientTest {
when(aaiClientMock.getTenants(any(String.class), any(String.class))).thenCallRealMethod();
Response generalEmptyResponse = mock(Response.class);
- when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(generalEmptyResponse);
+ when(aaiClientMock.doAaiGet(any(String.class), any(Boolean.class))).thenReturn(generalEmptyResponse);
AaiResponse response = aaiClientMock.getTenants("subscriberId", "serviceType");
@@ -263,14 +271,14 @@ public class AaiClientTest {
});
- when(aaiClientMock.doAaiGet(any(String.class),any(Boolean.class))).thenReturn(generalEmptyResponse);
+ when(aaiClientMock.doAaiGet(any(String.class), any(Boolean.class))).thenReturn(generalEmptyResponse);
AaiResponse<GetTenantsResponse[]> response = aaiClientMock.getTenants("subscriberId", "serviceType");
- Assert.assertTrue(response.t.length> 0);
+ Assert.assertTrue(response.t.length > 0);
}
- final String tenantResponseRaw ="" +
+ final String tenantResponseRaw = "" +
"{" +
"\"service-type\": \"VIRTUAL USP\"," +
"\"resource-version\": \"1494001841964\"," +
@@ -301,7 +309,7 @@ public class AaiClientTest {
@DataProvider
public static Object[][] resourceTypesProvider() {
- return new Object[][] {
+ return new Object[][]{
{"service-instance", ResourceType.SERVICE_INSTANCE},
{"generic-vnf", ResourceType.GENERIC_VNF},
{"vf-module", ResourceType.VF_MODULE}
@@ -313,9 +321,9 @@ public class AaiClientTest {
String link = "/aai/v12/business/customers/customer/a9a77d5a-123e-4ca2-9eb9-0b015d2ee0fb/service-subscriptions/service-subscription/Nimbus/service-instances/service-instance/7131d483-b450-406f-8e30-0c650645fc67";
String json =
"{\"result-data\": [{" +
- "\"resource-type\": \""+resourceType+"\"," +
- "\"resource-link\": \""+ link+ "\"" +
- "}]}";
+ "\"resource-type\": \"" + resourceType + "\"," +
+ "\"resource-link\": \"" + link + "\"" +
+ "}]}";
AaiNodeQueryResponse nodeQueryResponse = new ObjectMapper().readValue(json, AaiNodeQueryResponse.class);
assertThat(nodeQueryResponse.resultData.get(0).resourceLink, equalTo(link));
@@ -323,7 +331,7 @@ public class AaiClientTest {
}
@Test
- public void aaiNodeQueryEmptyResponseDeserializationTest() throws IOException{
+ public void aaiNodeQueryEmptyResponseDeserializationTest() throws IOException {
String json = "{}";
AaiNodeQueryResponse nodeQueryResponse = new ObjectMapper().readValue(json, AaiNodeQueryResponse.class);
assertNull(nodeQueryResponse.resultData);
@@ -331,7 +339,7 @@ public class AaiClientTest {
@DataProvider
public static Object[][] nameAndResourceTypeProvider() {
- return new Object[][] {
+ return new Object[][]{
{"SRIOV_SVC", ResourceType.SERVICE_INSTANCE, "search/nodes-query?search-node-type=service-instance&filter=service-instance-name:EQUALS:SRIOV_SVC"},
{"b1707vidnf", ResourceType.GENERIC_VNF, "search/nodes-query?search-node-type=generic-vnf&filter=vnf-name:EQUALS:b1707vidnf"},
{"connectivity_test", ResourceType.VF_MODULE, "search/nodes-query?search-node-type=vf-module&filter=vf-module-name:EQUALS:connectivity_test"},
@@ -460,6 +468,25 @@ public class AaiClientTest {
assertFalse(propagateExceptions, "calling doAaiGet when propagateExceptions is 'true' must result with an exception (in this test)");
}
+ @Test
+ public void shouldProperlyReadResponseOnceWhenSubscribersAreNotPresent() {
+ AAIRestInterface restInterface = mock(AAIRestInterface.class);
+ PortDetailsTranslator portDetailsTranslator = mock(PortDetailsTranslator.class);
+ Response response = mock(Response.class);
+ when(response.getStatus()).thenReturn(404);
+ when(response.readEntity(String.class)).thenReturn("sampleEntity");
+ when(response.getStatusInfo()).thenReturn(Response.Status.NOT_FOUND);
+ ResponseWithRequestInfo responseWithRequestInfo = new ResponseWithRequestInfo(response, "test", HttpMethod.GET);
+ when(restInterface.RestGet(eq("VidAaiController"), any(String.class),
+ eq("business/customers?subscriber-type=INFRA&depth=0"), eq(false), eq(true))).thenReturn(responseWithRequestInfo);
+ AaiClient aaiClient = new AaiClient(restInterface, portDetailsTranslator);
+
+
+ aaiClient.getAllSubscribers(true);
+
+ verify(response).readEntity(String.class);
+ }
+
@FunctionalInterface
public interface UncheckedBiConsumer<T, U> extends BiConsumer<T, U> {
@Override
diff --git a/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java
index ca7a163a8..da9cdaa6e 100644
--- a/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java
@@ -1,48 +1,101 @@
package org.onap.vid.controllers;
+import org.apache.log4j.BasicConfigurator;
+import org.junit.Before;
import org.junit.Test;
-import org.onap.vid.controllers.HealthCheckController;
-import org.onap.vid.controllers.HealthCheckController.HealthStatus;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.vid.dao.FnAppDoaImpl;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+import java.sql.SQLException;
+
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Matchers.anyString;
+import static org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR;
+import static org.springframework.http.HttpStatus.OK;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+@RunWith(MockitoJUnitRunner.class)
public class HealthCheckControllerTest {
- private HealthCheckController createTestSubject() {
- return new HealthCheckController();
- }
-
- @Test
- public void testGetProfileCount() throws Exception {
- HealthCheckController testSubject;
- String driver = "";
- String URL = "";
- String username = "";
- String password = "";
- int result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.getProfileCount(driver, URL, username, password);
- }
-
- @Test
- public void testGethealthCheckStatusforIDNS() throws Exception {
- HealthCheckController testSubject;
- HealthStatus result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.gethealthCheckStatusforIDNS();
- }
-
- @Test
- public void testGetHealthCheck() throws Exception {
- HealthCheckController testSubject;
- String UserAgent = "";
- String ECOMPRequestID = "";
- HealthStatus result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.getHealthCheck(UserAgent, ECOMPRequestID);
- }
+ private static final String ERROR_MESSAGE = "error message";
+ private HealthCheckController testSubject;
+ private MockMvc mockMvc;
+
+ @Mock
+ private FnAppDoaImpl fnAppDoa;
+
+ @Before
+ public void setUp() {
+ testSubject = new HealthCheckController(fnAppDoa);
+ BasicConfigurator.configure();
+ mockMvc = MockMvcBuilders.standaloneSetup(testSubject).build();
+ }
+
+ @Test
+ public void getHealthCheckStatusForIDNS_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception {
+ databaseConnectionEstablished();
+ mockMvc.perform(get("/healthCheck")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.statusCode").value(OK.value()))
+ .andExpect(jsonPath("$.detailedMsg").value("health check succeeded"));
+ }
+
+ @Test
+ public void getHealthCheckStatusForIDNS_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception {
+ databaseNotAccessible();
+ mockMvc.perform(get("/healthCheck")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value()))
+ .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE));
+ }
+
+ @Test
+ public void getHealthCheck_shouldReturnSuccess_whenNoExceptionIsThrown() throws Exception {
+ databaseConnectionEstablished();
+ mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.statusCode").value(OK.value()))
+ .andExpect(jsonPath("$.detailedMsg").value("health check succeeded"))
+ .andExpect(jsonPath("$.date").isString());
+ }
+
+ @Test
+ public void getHealthCheck_shouldReturnErrorCode_whenExceptionIsThrown() throws Exception {
+ databaseNotAccessible();
+ mockMvc.perform(get("/rest/healthCheck/{User-Agent}/{X-ECOMP-RequestID}", "userAgent", "requestId")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.statusCode").value(INTERNAL_SERVER_ERROR.value()))
+ .andExpect(jsonPath("$.detailedMsg").value("health check failed: " + ERROR_MESSAGE));
+ }
+
+ @Test
+ public void getCommitInfo_shouldReturnCommitData_whenCorrectPropertiesFileExists() throws Exception {
+ mockMvc.perform(get("/commitInfo")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(jsonPath("$.commitId").value("123"))
+ .andExpect(jsonPath("$.commitMessageShort").value("Test short commit message"))
+ .andExpect(jsonPath("$.commitTime").value("1999-09-12T13:48:55+0200"));
+ }
+
+ private void databaseConnectionEstablished() throws SQLException {
+ given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString()))
+ .willReturn(0);
+ }
+
+ private void databaseNotAccessible() throws SQLException {
+ given(fnAppDoa.getProfileCount(anyString(), anyString(), anyString()))
+ .willThrow(new SQLException(ERROR_MESSAGE));
+ }
} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java
index 80c65935e..7bdd6b863 100644
--- a/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java
@@ -1,66 +1,340 @@
package org.onap.vid.controllers;
-import javax.servlet.http.HttpServletRequest;
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright © 2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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=========================================================
+ */
+import static org.mockito.BDDMockito.given;
+import static org.mockito.BDDMockito.then;
+import static org.mockito.BDDMockito.willThrow;
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.times;
+import static org.onap.vid.model.CategoryParameter.Family.PARAMETER_STANDARDIZATION;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import java.util.Collections;
+import java.util.function.BiFunction;
+import javax.ws.rs.ForbiddenException;
+import org.apache.log4j.BasicConfigurator;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.vid.category.AddCategoryOptionResponse;
import org.onap.vid.category.AddCategoryOptionsRequest;
import org.onap.vid.category.CategoryParameterOptionRep;
+import org.onap.vid.category.CategoryParametersResponse;
+import org.onap.vid.model.CategoryParameter;
import org.onap.vid.model.CategoryParameterOption;
-import org.springframework.http.ResponseEntity;
+import org.onap.vid.services.CategoryParameterService;
+import org.onap.vid.services.CategoryParameterServiceImpl;
+import org.springframework.http.MediaType;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.ResultActions;
+import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
+import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+@RunWith(MockitoJUnitRunner.class)
public class MaintenanceControllerTest {
- private MaintenanceController createTestSubject() {
- return new MaintenanceController();
+ final private String MAINTENANCE_CATEGORY_PATH = "/maintenance/category_parameter";
+ final private String CATEGORY_PARAMETER_PATH = MAINTENANCE_CATEGORY_PATH + "/{name}";
+ final private String DELETE_CATEGORY_PATH = "/maintenance/delete_category_parameter/{name}";
+
+ @Mock
+ private CategoryParameterService service;
+ private MaintenanceController maintenanceController;
+ private MockMvc mockMvc;
+ private ObjectMapper objectMapper;
+
+ @Before
+ public void setUp() {
+ maintenanceController = new MaintenanceController(service);
+ BasicConfigurator.configure();
+ mockMvc = MockMvcBuilders.standaloneSetup(maintenanceController).build();
+ objectMapper = new ObjectMapper();
+ }
+
+ @Test
+ public void addCategoryOptions_shouldReturnMultiStatus_whenErrorsExist() throws Exception {
+ String categoryName = "catName1";
+ AddCategoryOptionsRequest req = new AddCategoryOptionsRequest();
+ req.options = ImmutableList.of("first option", "second option");
+ AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(
+ ImmutableList.of("error one", "error two"));
+
+ given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req))))
+ .willReturn(addCategoryOptionResponse);
+
+ prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(req))
+ .andExpect(status().isMultiStatus())
+ .andExpect(
+ content().json(objectMapper
+ .writeValueAsString(addCategoryOptionResponse)));
+ }
+
+ @Test
+ public void addCategoryOptions_shouldReturnOk_whenNoErrorsExist() throws Exception {
+ String categoryName = "catName2";
+ AddCategoryOptionsRequest req = new AddCategoryOptionsRequest();
+ req.options = ImmutableList.of("first option", "second option", "third option");
+ AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList());
+
+ given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req))))
+ .willReturn(addCategoryOptionResponse);
+ prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(req))
+ .andExpect(status().isOk())
+ .andExpect(content().json(
+ objectMapper.writeValueAsString(addCategoryOptionResponse)));
+ }
+
+ @Test
+ public void addCategoryOptions_shouldReturnNotFound_whenUnfoundedCategoryExceptionIsThrown() throws Exception {
+ String unfoundedMsg = "unfounded category exception message";
+ String categoryName = "catName3";
+ AddCategoryOptionsRequest req = new AddCategoryOptionsRequest();
+ req.options = ImmutableList.of("first option");
+
+ given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req))))
+ .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg));
+
+ prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(req))
+ .andExpect(status().isNotFound())
+ .andExpect(content().json(
+ objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg)))));
+ }
+
+ @Test
+ public void addCategoryOptions_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception {
+ String categoryName = "catName13";
+ AddCategoryOptionsRequest req = new AddCategoryOptionsRequest();
+ req.options = ImmutableList.of("option second", "first option");
+
+ given(service.createCategoryParameterOptions(eq(categoryName), argThat(requestMatcher(req))))
+ .willThrow(new RuntimeException());
+
+ prepareRequestExpectations(MockMvcRequestBuilders::post, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(req))
+ .andExpect(status().isInternalServerError());
+ }
+
+ @Test
+ public void updateNameForOption_shouldReturnMultiStatus_whenErrorsExist() throws Exception {
+ String categoryName = "catName4";
+ CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id1", "name1");
+ AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(
+ ImmutableList.of("error one", "error two"));
+
+ given(service
+ .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep))))
+ .willReturn(addCategoryOptionResponse);
+
+ prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOptionRep))
+ .andExpect(status().isMultiStatus())
+ .andExpect(
+ content().json(objectMapper
+ .writeValueAsString(addCategoryOptionResponse)));
}
@Test
- public void testAddCategoryOptions() throws Exception {
- MaintenanceController testSubject;
- HttpServletRequest request = null;
- String categoryName = "";
- AddCategoryOptionsRequest option = null;
- ResponseEntity result;
+ public void updateNameForOption_shouldReturnOk_whenNoErrorsExist() throws Exception {
+ String categoryName = "catName5";
+ CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id2", "name2");
+ AddCategoryOptionResponse addCategoryOptionResponse = new AddCategoryOptionResponse(Collections.emptyList());
- // default test
- testSubject = createTestSubject();
- result = testSubject.addCategoryOptions(request, categoryName, option);
+ given(service
+ .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep))))
+ .willReturn(addCategoryOptionResponse);
+ prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOptionRep))
+ .andExpect(status().isOk())
+ .andExpect(content().json(
+ objectMapper.writeValueAsString(addCategoryOptionResponse)));
}
@Test
- public void testUpdateNameForOption() throws Exception {
- MaintenanceController testSubject;
- HttpServletRequest request = null;
- String categoryName = "";
- CategoryParameterOptionRep option = null;
- ResponseEntity result;
+ public void updateNameForOption_shouldReturnForbidden_whenForbiddenExceptionIsThrown() throws Exception {
+ String categoryName = "catName6";
+ CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id3", "name3");
- // default test
- testSubject = createTestSubject();
- result = testSubject.updateNameForOption(request, categoryName, option);
+ given(service
+ .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep))))
+ .willThrow(new ForbiddenException());
+ prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOptionRep))
+ .andExpect(status().isForbidden())
+ .andExpect(content().json(
+ objectMapper
+ .writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of("HTTP 403 Forbidden")))));
}
@Test
- public void testGetCategoryParameter() throws Exception {
- MaintenanceController testSubject;
- HttpServletRequest request = null;
- ResponseEntity result;
+ public void updateNameForOption_shouldReturnNotFound_whenUnfoundedIsThrown() throws Exception {
+ String unfoundedOptionMsg = "unfounded category option exception message";
+ String categoryName = "catName7";
+ CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id4", "name4");
+
+ given(service
+ .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep))))
+ .willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryOptionException(unfoundedOptionMsg));
- // default test
- testSubject = createTestSubject();
- result = testSubject.getCategoryParameter(request, null);
+ prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOptionRep))
+ .andExpect(status().isNotFound())
+ .andExpect(content().json(
+ objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedOptionMsg)))));
}
@Test
- public void testDeleteCategoryOption() throws Exception {
- MaintenanceController testSubject;
- HttpServletRequest request = null;
- String categoryName = "";
- CategoryParameterOption option = null;
- ResponseEntity result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.deleteCategoryOption(request, categoryName, option);
+ public void updateNameForOption_shouldReturnConflict_whenAlreadyExistOptionNameIsThrown() throws Exception {
+ String conflictMsg = "already exists option name exception message";
+ String categoryName = "catName8";
+ CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id5", "name5");
+
+ given(service
+ .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep))))
+ .willThrow(new CategoryParameterServiceImpl.AlreadyExistOptionNameException(conflictMsg));
+
+ prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOptionRep))
+ .andExpect(status().isConflict())
+ .andExpect(content().json(
+ objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(conflictMsg)))));
+ }
+
+ @Test
+ public void updateNameForOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception {
+ String categoryName = "catName18";
+ CategoryParameterOptionRep categoryParameterOptionRep = new CategoryParameterOptionRep("id6", "name6");
+
+ given(service
+ .updateCategoryParameterOption(eq(categoryName), argThat(requestMatcher(categoryParameterOptionRep))))
+ .willThrow(new RuntimeException());
+
+ prepareRequestExpectations(MockMvcRequestBuilders::put, CATEGORY_PARAMETER_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOptionRep))
+ .andExpect(status().isInternalServerError());
+ }
+
+ @Test
+ public void getCategoryParameter_shouldReturnExistingMap() throws Exception {
+ CategoryParametersResponse categoryParametersResponse =
+ new CategoryParametersResponse(
+ ImmutableMap.of(
+ "key1", ImmutableList.of(
+ new CategoryParameterOptionRep("testId", "testName"))));
+
+ given(service.getCategoryParameters(PARAMETER_STANDARDIZATION))
+ .willReturn(categoryParametersResponse);
+
+ mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH)
+ .param("familyName", "PARAMETER_STANDARDIZATION")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().json(objectMapper.writeValueAsString(categoryParametersResponse)));
+ }
+
+ @Test
+ public void getCategoryParameter_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception {
+ given(service.getCategoryParameters(PARAMETER_STANDARDIZATION))
+ .willThrow(new RuntimeException());
+
+ mockMvc.perform(get(MAINTENANCE_CATEGORY_PATH)
+ .param("familyName", "PARAMETER_STANDARDIZATION")
+ .accept(MediaType.APPLICATION_JSON))
+ .andExpect(status().isInternalServerError());
+ }
+
+ @Test
+ public void deleteCategoryOption_shouldReturnOk_whenNoExceptionIsThrown() throws Exception {
+ String categoryName = "catName9";
+ CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id1", "name1",
+ new CategoryParameter());
+
+ prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOption))
+ .andExpect(status().isOk());
+
+ then(service).should(times(1))
+ .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption)));
+ }
+
+ @Test
+ public void deleteCategoryOption_shouldReturnNotFound_whenUnfoundedExceptionIsThrown() throws Exception {
+ String unfoundedMsg = "unfounded category exception message";
+ String categoryName = "catName10";
+ CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id2", "name2",
+ new CategoryParameter());
+
+ willThrow(new CategoryParameterServiceImpl.UnfoundedCategoryException(unfoundedMsg))
+ .given(service).deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption)));
+
+ prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOption))
+ .andExpect(status().isNotFound())
+ .andExpect(content().json(
+ objectMapper.writeValueAsString(new AddCategoryOptionResponse(ImmutableList.of(unfoundedMsg)))));
+ }
+
+ @Test
+ public void deleteCategoryOption_shouldReturnInternalServerError_whenExceptionIsThrown() throws Exception {
+ String categoryName = "catName19";
+ CategoryParameterOption categoryParameterOption = new CategoryParameterOption("id3", "name3",
+ new CategoryParameter());
+
+ willThrow(new RuntimeException()).given(service)
+ .deleteCategoryOption(eq(categoryName), argThat(requestMatcher(categoryParameterOption)));
+
+ prepareRequestExpectations(MockMvcRequestBuilders::delete, DELETE_CATEGORY_PATH, categoryName,
+ objectMapper.writeValueAsString(categoryParameterOption))
+ .andExpect(status().isInternalServerError());
+ }
+
+ private <T> ArgumentMatcher<T> requestMatcher(T t) {
+ return new ArgumentMatcher<T>() {
+ @Override
+ public boolean matches(Object o) {
+ return t.equals(o);
+ }
+ };
+ }
+
+ private ResultActions prepareRequestExpectations(
+ BiFunction<String, String, MockHttpServletRequestBuilder> httpMethod,
+ String path, String name, String jsonContent) throws Exception {
+ return mockMvc.perform(httpMethod.apply(path, name)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(jsonContent));
}
} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java b/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java
index 4e2d994e6..168d90090 100644
--- a/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java
@@ -1,189 +1,210 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Modifications Copyright 2018 Nokia
+ * ================================================================================
+ * 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.vid.controllers;
-//import com.fasterxml.jackson.databind.ObjectMapper;
-//import net.javacrumbs.jsonunit.JsonAssert;
-//import org.apache.commons.io.IOUtils;
-//import org.onap.vid.asdc.AsdcCatalogException;
-//import org.onap.vid.asdc.AsdcClient;
-//import org.onap.vid.asdc.parser.ToscaParserImpl2;
-//import org.onap.vid.model.*;
-//import org.onap.portalsdk.core.util.SystemProperties;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.mock.web.MockServletContext;
-//import org.springframework.test.context.ContextConfiguration;
-//import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
-//import org.springframework.test.context.web.WebAppConfiguration;
-//import org.testng.Assert;
-//import org.testng.annotations.Test;
-//
-//import static org.onap.vid.testUtils.TestUtils.assertJsonStringEqualsIgnoreNulls;
-//
-//import java.io.IOException;
-//import java.io.InputStream;
-//import java.nio.file.Path;
-//import java.util.Map;
-//import java.util.UUID;
-//
-////import org.junit.Assert;
-////import org.junit.Ignore;
-////import org.junit.Test;
-////import org.junit.runner.RunWith;
-////import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
-//
-//@ContextConfiguration(classes = {LocalWebConfig.class, SystemProperties.class})
-////@RunWith(SpringJUnit4ClassRunner.class)
-//@WebAppConfiguration
-//
-//public class VidControllerTest extends AbstractTestNGSpringContextTests {
-//
-// @Autowired
-// MockServletContext context;
-// @Autowired
-// private AsdcClient asdcClient;
-// private ToscaParserImpl2 p2 = new ToscaParserImpl2();
-// private ObjectMapper om = new ObjectMapper();
-//
-//
-// @Test
-// public void assertEqualsBetweenServices() throws Exception {
-// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-// Service expectedService = mockHelper.getNewServiceModel().getService();
-// Service actualService = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getService();
-// assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(expectedService), om.writeValueAsString(actualService));
-// }
-// }
-//
-//// @Test
-//// public void assertEqualBetweenObjects() throws Exception {
-//// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-//// final Path csarPath = getCsarPath(mockHelper.getUuid());
-//// System.out.println("Comparing for csar " + csarPath);
-//// ServiceModel actualServiceModel = p2.makeServiceModel(csarPath, getServiceByUuid(mockHelper.getUuid()));
-//// assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(mockHelper.getNewServiceModel()), om.writeValueAsString(actualServiceModel));
-//// }
-//// }
-//
-//// @Test
-//// public void assertEqualsBetweenNetworkNodes() throws Exception {
-//// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-//// Map<String, Network> expectedNetworksMap = mockHelper.getNewServiceModel().getNetworks();
-//// Map<String, Network> actualNetworksMap = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getNetworks();
-//// for (Map.Entry<String, Network> entry : expectedNetworksMap.entrySet()) {
-//// Network expectedNetwork = entry.getValue();
-//// Network actualNetwork = actualNetworksMap.get(entry.getKey());
-//// Assert.assertEquals(expectedNetwork.getModelCustomizationName(), actualNetwork.getModelCustomizationName());
-//// verifyBaseNodeProperties(expectedNetwork, actualNetwork);
-//// compareProperties(expectedNetwork.getProperties(), actualNetwork.getProperties());
-//// }
-//// }
-//// }
-//
-// //Because we are not supporting the old flow, the JSON are different by definition.
-// @Test
-// public void assertEqualsBetweenVnfsOfTosca() throws Exception {
-// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-// Map<String, VNF> expectedVnfsMap = mockHelper.getNewServiceModel().getVnfs();
-// Map<String, VNF> actualVnfsMap = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVnfs();
-// for (Map.Entry<String, VNF> entry : expectedVnfsMap.entrySet()) {
-// VNF expectedVnf = entry.getValue();
-// VNF actualVnf = actualVnfsMap.get(entry.getKey());
-// //need to uncomment these after 1806 merge
-// //verifyBaseNodeProperties(expectedVnf, actualVnf);
-// Assert.assertEquals(expectedVnf.getModelCustomizationName(), actualVnf.getModelCustomizationName());
-// //compareProperties(expectedVnf.getProperties(), actualVnf.getProperties());
-// //assertJsonStringEqualsIgnoreNulls(om.writeValueAsString(expectedVnf), om.writeValueAsString(actualVnf));
-// }
-// }
-// }
-//
-// @Test
-// public void assertEqualsBetweenVolumeGroups() throws Exception {
-// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-// Map<String, VolumeGroup> actualVolumeGroups = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVolumeGroups();
-// Map<String, VolumeGroup> expectedVolumeGroups = mockHelper.getNewServiceModel().getVolumeGroups();
-// JsonAssert.assertJsonEquals(actualVolumeGroups, expectedVolumeGroups);
-// }
-// }
-//
-// @Test
-// public void assertEqualsBetweenVfModules() throws Exception {
-// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-// Map<String, VfModule> actualVfModules = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getVfModules();
-// Map<String, VfModule> expectedVfModules = mockHelper.getNewServiceModel().getVfModules();
-// //need to uncomment after 1906 merge
-// //JsonAssert.assertJsonEquals(actualVfModules, expectedVfModules);
-// }
-// }
-//
-// /*@Test
-// public void assertEqualsBetweenPolicyConfigurationNodes() throws Exception {
-// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-// Map<String, PortMirroringConfig> actualConfigurations = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getConfigurations();
-// Map<String, PortMirroringConfig> expectedConfigurations = mockHelper.getNewServiceModel().getConfigurations();
-// JsonAssert.assertJsonEquals(actualConfigurations, expectedConfigurations);
-// }
-// }*/
-//
-// @Test
-// public void assertEqualsBetweenServiceProxyNodes() throws Exception {
-// for (ToscaParserMockHelper mockHelper : getExpectedServiceModel()) {
-// Map<String, ServiceProxy> actualServiceProxies = p2.makeServiceModel(getCsarPath(mockHelper.getUuid()), getServiceByUuid(mockHelper.getUuid())).getServiceProxies();
-// Map<String, ServiceProxy> expectedServiceProxies = mockHelper.getNewServiceModel().getServiceProxies();
-// JsonAssert.assertJsonEquals(actualServiceProxies, expectedServiceProxies);
-// }
-// }
-//
-// private void verifyBaseNodeProperties(Node expectedNode, Node actualNode) {
-// Assert.assertEquals(expectedNode.getName(), actualNode.getName());
-// Assert.assertEquals(expectedNode.getCustomizationUuid(), actualNode.getCustomizationUuid());
-// Assert.assertEquals(expectedNode.getDescription(), actualNode.getDescription());
-// Assert.assertEquals(expectedNode.getInvariantUuid(), actualNode.getInvariantUuid());
-// Assert.assertEquals(expectedNode.getUuid(), actualNode.getUuid());
-// Assert.assertEquals(expectedNode.getVersion(), actualNode.getVersion());
-// }
-//
-// private void compareProperties(Map<String, String> expectedProperties, Map<String, String> actualProperties) {
-// for (Map.Entry<String, String> property : expectedProperties.entrySet()) {
-// String expectedValue = property.getValue();
-// String key = property.getKey();
-// String actualValue = actualProperties.get(key);
-// Assert.assertEquals(expectedValue, actualValue);
-// }
-// }
-//
-// private ToscaParserMockHelper[] getExpectedServiceModel() throws IOException {
-// ToscaParserMockHelper[] mockHelpers = {
-// new ToscaParserMockHelper(Constants.vlUuid, Constants.vlFilePath),
-// new ToscaParserMockHelper(Constants.vfUuid, Constants.vfFilePath),
-// new ToscaParserMockHelper(Constants.configurationUuid, Constants.configurationFilePath),
-// };
-// for (ToscaParserMockHelper mockHelper : mockHelpers) {
-// InputStream jsonFile = VidControllerTest.class.getClassLoader().getResourceAsStream(mockHelper.getFilePath());
-// String expectedJsonAsString = IOUtils.toString(jsonFile);
-// NewServiceModel newServiceModel1 = om.readValue(expectedJsonAsString, NewServiceModel.class);
-// mockHelper.setNewServiceModel(newServiceModel1);
-// }
-// return mockHelpers;
-// }
-//
-// private Path getCsarPath(String uuid) throws AsdcCatalogException {
-// return asdcClient.getServiceToscaModel(UUID.fromString(uuid));
-// }
-//
-// private org.onap.vid.asdc.beans.Service getServiceByUuid(String uuid) throws AsdcCatalogException {
-// return asdcClient.getService(UUID.fromString(uuid));
-// }
-//
-// public class Constants {
-// public static final String configurationUuid = "ee6d61be-4841-4f98-8f23-5de9da846ca7";
-// public static final String configurationFilePath = "policy-configuration-csar.JSON";
-// static final String vfUuid = "48a52540-8772-4368-9cdb-1f124ea5c931";
-// static final String vlUuid = "cb49608f-5a24-4789-b0f7-2595473cb997";
-// // public static final String PNFUuid = "68101369-6f08-4e99-9a28-fa6327d344f3";
-// static final String vfFilePath = "vf-csar.JSON";
-// static final String vlFilePath = "vl-csar.JSON";
-//// public static final String PNFFilePath = "/Users/Oren/Git/Att/vid_internal/vid-app-common/src/main/resources/pnf.csar";
-//
-// }
-//
-//} \ No newline at end of file
+
+import static java.util.stream.Collectors.toMap;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.Matchers.not;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.BDDMockito.then;
+import static org.mockito.Mockito.times;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
+import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
+import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.IntStream;
+import javax.ws.rs.core.MediaType;
+import org.apache.log4j.BasicConfigurator;
+import org.codehaus.jackson.map.ObjectMapper;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentCaptor;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import org.onap.vid.asdc.AsdcCatalogException;
+import org.onap.vid.asdc.beans.SecureServices;
+import org.onap.vid.asdc.beans.Service;
+import org.onap.vid.asdc.beans.ServiceBuilder;
+import org.onap.vid.model.CR;
+import org.onap.vid.model.Network;
+import org.onap.vid.model.Node;
+import org.onap.vid.model.PombaInstance.PombaRequest;
+import org.onap.vid.model.PombaInstance.ServiceInstance;
+import org.onap.vid.model.ServiceModel;
+import org.onap.vid.model.ServiceProxy;
+import org.onap.vid.model.VNF;
+import org.onap.vid.model.VfModule;
+import org.onap.vid.model.VolumeGroup;
+import org.onap.vid.roles.RoleProvider;
+import org.onap.vid.services.AaiService;
+import org.onap.vid.services.PombaService;
+import org.onap.vid.services.VidService;
+import org.springframework.test.web.servlet.MockMvc;
+import org.springframework.test.web.servlet.setup.MockMvcBuilders;
+
+@RunWith(MockitoJUnitRunner.class)
+public class VidControllerTest {
+
+ public static final String REST_MODELS_SERVICES = "/rest/models/services";
+ public static final String REST_MODELS_SERVICES_UUID = "/rest/models/services/{uuid}";
+ public static final String REST_MODELS_RESET = "/rest/models/reset";
+ public static final String REST_MODELS_SERVICES_VERIFY_SERVICE = "/rest/models/services/verifyService";
+ @Mock
+ private VidService vidService;
+ @Mock
+ private AaiService aaiService;
+ @Mock
+ private RoleProvider roleProvider;
+ @Mock
+ private PombaService pombaService;
+
+ private VidController vidController;
+ private MockMvc mockMvc;
+ private ObjectMapper objectMapper;
+
+ private String uuid1;
+ private String uuid2;
+ private String uuid3;
+
+ @Before
+ public void setUp() {
+ vidController = new VidController(vidService, aaiService, roleProvider, pombaService);
+ BasicConfigurator.configure();
+ mockMvc = MockMvcBuilders.standaloneSetup(vidController).build();
+ objectMapper = new ObjectMapper();
+
+ uuid1 = UUID.randomUUID().toString();
+ uuid2 = UUID.randomUUID().toString();
+ uuid3 = UUID.randomUUID().toString();
+ }
+
+ @Test
+ public void getServices_shouldReturnService_whenServiceExists() throws Exception {
+ List<Service> services = ImmutableList.of(createService(uuid1, 1), createService(uuid2, 2), createService(uuid3, 3));
+
+ given(aaiService.getServicesByDistributionStatus()).willReturn(services);
+
+ SecureServices secureServices = new SecureServices();
+ secureServices.setServices(services);
+ secureServices.setReadOnly(false);
+
+ mockMvc.perform(get(REST_MODELS_SERVICES)
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().json(objectMapper.writeValueAsString(secureServices)));
+ }
+
+ @Test
+ public void getService_shouldReturnService_whenNoExceptionIsThrown() throws Exception {
+ ServiceModel model = expectedServiceModel(uuid1);
+
+ given(vidService.getService(uuid1)).willReturn(model);
+
+ mockMvc.perform(get(REST_MODELS_SERVICES_UUID, uuid1)
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isOk())
+ .andExpect(content().json(objectMapper.writeValueAsString(model)));
+ }
+
+ @Test
+ public void getService_shouldThrow_whenAsdcCatalogExceptionIsThrown() throws Exception {
+ String testUuid = UUID.randomUUID().toString();
+
+ given(vidService.getService(testUuid)).willThrow(new AsdcCatalogException("error msg"));
+
+ mockMvc.perform(get(REST_MODELS_SERVICES_UUID, testUuid)
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isServiceUnavailable());
+ }
+
+ @Test
+ public void invalidateServiceModelCache_shouldReturnAccepted() throws Exception {
+ mockMvc.perform(post(REST_MODELS_RESET)
+ .contentType(MediaType.APPLICATION_JSON))
+ .andExpect(status().isAccepted());
+
+ then(vidService).should(times(1)).invalidateServiceCache();
+ }
+
+ @Test
+ public void verifyServiceInstance_shouldReturnOk() throws Exception {
+ PombaRequest pombaRequest = new PombaRequest();
+ pombaRequest.serviceInstanceList = ImmutableList.of(new ServiceInstance());
+
+ mockMvc.perform(post(REST_MODELS_SERVICES_VERIFY_SERVICE)
+ .contentType(MediaType.APPLICATION_JSON)
+ .content(objectMapper.writeValueAsString(pombaRequest)))
+ .andExpect(status().isOk());
+
+ ArgumentCaptor<PombaRequest> argumentCaptor = ArgumentCaptor.forClass(PombaRequest.class);
+ then(pombaService).should(times(1)).verify(argumentCaptor.capture());
+
+ assertThat(pombaRequest).isEqualToComparingFieldByFieldRecursively(argumentCaptor.getValue());
+ }
+
+ private ServiceModel expectedServiceModel(String uuid) {
+ final ServiceModel serviceModel = getModelsByUuid().get(uuid);
+ Assert.assertThat(serviceModel, is(not(nullValue())));
+ return serviceModel;
+ }
+
+ private Service createService(String uuid, int i) {
+ return new ServiceBuilder().setUuid(uuid).setInvariantUUID("invariantUUID" + i)
+ .setCategory("category" + i).setVersion("version" + i).setName("name" + i)
+ .setDistributionStatus("distStatus" + i).setToscaModelURL("toscaModelUrl" + i).build();
+ }
+
+ private ServiceModel createServiceModel(int i) {
+ ServiceModel model = new ServiceModel();
+
+ model.setCollectionResource(ImmutableMap.of("resKey" + i, new CR()));
+ model.setNetworks(ImmutableMap.of("network" + i, new Network()));
+ model.setPnfs(ImmutableMap.of("pnf" + i, new Node()));
+ model.setServiceProxies(ImmutableMap.of("servProxy" + i, new ServiceProxy()));
+ model.setVfModules(ImmutableMap.of("vfmod" + i, new VfModule()));
+ model.setVnfs(ImmutableMap.of("vnf" + i, new VNF()));
+ model.setVolumeGroups(ImmutableMap.of("volgroup" + i, new VolumeGroup()));
+ model.setService(new org.onap.vid.model.Service());
+ return model;
+ }
+
+ private Map<String, ServiceModel> getModelsByUuid() {
+ ServiceModel serviceModel1 = createServiceModel(1);
+ ServiceModel serviceModel2 = createServiceModel(2);
+ ServiceModel serviceModel3 = createServiceModel(3);
+
+ List<ServiceModel> pseudoServiceModels = ImmutableList.of(serviceModel1, serviceModel2, serviceModel3);
+ List<String> uuids = ImmutableList.of(uuid1, uuid2, uuid3);
+ return IntStream.range(0, pseudoServiceModels.size()).boxed()
+ .collect(toMap(i -> uuids.get(i), i -> pseudoServiceModels.get(i)));
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java b/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java
index e7a7e3a37..2c2aa89a0 100644
--- a/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java
@@ -3,95 +3,67 @@ package org.onap.vid.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
+import java.sql.SQLException;
-import org.junit.Assert;
+import org.junit.Before;
import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.runners.MockitoJUnitRunner;
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.assertj.core.api.Java6Assertions.assertThatThrownBy;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Matchers.anyString;
+
+@RunWith(MockitoJUnitRunner.class)
public class FnAppDoaImplTest {
- private FnAppDoaImpl createTestSubject() {
- return new FnAppDoaImpl();
- }
+ private FnAppDoaImpl fnAppDoa;
- @Test
- public void testGetConnection() throws Exception {
- String driver2 = "";
- String url = "";
- String username = "";
- String password = "";
- Connection result;
-
- // test 1
- url = null;
- username = null;
- password = null;
- result = FnAppDoaImpl.getConnection(driver2, url, username);
- Assert.assertEquals(null, result);
-
- // test 2
- url = "";
- username = null;
- password = null;
- result = FnAppDoaImpl.getConnection(driver2, url, username);
- Assert.assertEquals(null, result);
-
- // test 3
- username = null;
- url = null;
- password = null;
- result = FnAppDoaImpl.getConnection(driver2, url, username);
- Assert.assertEquals(null, result);
-
- // test 4
- username = "";
- url = null;
- password = null;
- result = FnAppDoaImpl.getConnection(driver2, url, username);
- Assert.assertEquals(null, result);
-
- // test 5
- password = null;
- url = null;
- username = null;
- result = FnAppDoaImpl.getConnection(driver2, url, username);
- Assert.assertEquals(null, result);
-
- // test 6
- password = "";
- url = null;
- username = null;
- result = FnAppDoaImpl.getConnection(driver2, url, username);
- Assert.assertEquals(null, result);
+ @Mock
+ private ConnectionFactory connectionFactory;
+
+ @Mock
+ private Connection connection;
+
+ @Mock
+ private PreparedStatement preparedStatement;
+
+ @Mock
+ private ResultSet resultSet;
+
+ private static final String ERROR_MESSAGE = "error message";
+ private static final String QUERY = "select count(*) from fn_app";
+
+ @Before
+ public void setUp() throws SQLException {
+ given(resultSet.next()).willReturn(true);
+ given(resultSet.getInt(1)).willReturn(5);
+ given(preparedStatement.executeQuery()).willReturn(resultSet);
+ given(connectionFactory.getConnection(anyString(), anyString(), anyString())).willReturn(connection);
+ fnAppDoa = new FnAppDoaImpl(connectionFactory);
}
- @Test
- public void testCleanup() throws Exception {
- ResultSet rs = null;
- PreparedStatement st = null;
+ private void okCaseSetUp() throws SQLException {
- // test 1
- rs = null;
- FnAppDoaImpl.cleanup(rs, st, null);
+ given(connection.prepareStatement(QUERY)).willReturn(preparedStatement);
+ }
- // test 2
- st = null;
- FnAppDoaImpl.cleanup(rs, st, null);
+ private void nokCaseSetup() throws SQLException {
+ given(connection.prepareStatement(QUERY)).willThrow(new SQLException(ERROR_MESSAGE));
+ }
- // test 3
- FnAppDoaImpl.cleanup(rs, st, null);
+ @Test
+ public void getProfileCount_shouldReturnNumber_whenNoExceptionIsThrown() throws SQLException {
+ okCaseSetUp();
+ assertThat(fnAppDoa.getProfileCount("anyUrl", "anyUsername", "anyPassword")).isEqualTo(5);
}
@Test
- public void testGetProfileCount() throws Exception {
- FnAppDoaImpl testSubject;
- String driver = "";
- String URL = "";
- String username = "";
- String password = "";
- int result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.getProfileCount(driver, URL, username, password);
+ public void getProfileCount_shouldRethrowSQLException() throws SQLException {
+ nokCaseSetup();
+ assertThatThrownBy(() -> fnAppDoa.getProfileCount("anyUrl", "anyUsername", "anyPassword"))
+ .isInstanceOf(SQLException.class).hasMessage(ERROR_MESSAGE);
}
} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java b/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java
new file mode 100644
index 000000000..bc623928c
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java
@@ -0,0 +1,143 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia 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=========================================================
+ */
+
+package org.onap.vid.job.command;
+
+
+import io.joshworks.restclient.http.HttpResponse;
+import org.mockito.Mock;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.NextCommand;
+import org.onap.vid.mso.MsoInterface;
+import org.onap.vid.mso.rest.AsyncRequestStatus;
+import org.onap.vid.services.AsyncInstantiationBusinessLogic;
+import org.onap.vid.services.AuditService;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import javax.ws.rs.ProcessingException;
+import java.util.UUID;
+
+
+import static org.assertj.core.api.Java6Assertions.assertThat;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+public class InProgressStatusCommandTest {
+
+ @Mock
+ private AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic;
+
+ @Mock
+ private MsoInterface msoInterface;
+
+ @Mock
+ private AuditService auditService;
+
+ @Mock
+ private HttpResponse<AsyncRequestStatus> msoResponse;
+
+ @Mock
+ private AsyncRequestStatus asyncRequestStatus;
+
+ @Mock
+ private AsyncRequestStatus.Request request;
+
+ private UUID uuid = UUID.randomUUID();
+
+ private InProgressStatusCommand inProgressStatusCommand;
+
+ @BeforeMethod
+ public void setUp() {
+ initMocks(this);
+
+ inProgressStatusCommand = new InProgressStatusCommand(asyncInstantiationBusinessLogic, msoInterface, auditService, uuid, "sampleRequestId");
+
+ when(asyncInstantiationBusinessLogic.getOrchestrationRequestsPath()).thenReturn("http://localhost:8080/samplePath");
+ when(msoInterface.get("http://localhost:8080/samplePath/sampleRequestId", AsyncRequestStatus.class)).thenReturn(msoResponse);
+ when(msoResponse.getBody()).thenReturn(asyncRequestStatus);
+ }
+
+
+ @Test
+ public void whenSOReturnsErrorShouldSetProperFailureStateAndReturnRetryCommand() {
+ when(msoResponse.getStatus()).thenReturn(500);
+
+ NextCommand call = inProgressStatusCommand.call();
+
+ assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS);
+ assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand);
+
+ verify(auditService).setFailedAuditStatusFromMso(uuid, "sampleRequestId", 500, asyncRequestStatus.toString());
+ }
+
+ @Test
+ public void shouldProperlyHandleFailedInstantiation() {
+ when(msoResponse.getStatus()).thenReturn(200);
+ when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenReturn(Job.JobStatus.FAILED);
+ asyncRequestStatus.request = request;
+
+ NextCommand call = inProgressStatusCommand.call();
+
+ assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand);
+ assertThat(call.getStatus()).isEqualTo(Job.JobStatus.FAILED);
+
+ verify(asyncInstantiationBusinessLogic).handleFailedInstantiation(uuid);
+ verify(asyncInstantiationBusinessLogic).auditMsoStatus(uuid, request);
+ }
+
+ @Test
+ public void shouldRetryCommandWithPausedState() {
+ when(msoResponse.getStatus()).thenReturn(200);
+ when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenReturn(Job.JobStatus.PAUSE);
+ asyncRequestStatus.request = request;
+
+ NextCommand call = inProgressStatusCommand.call();
+
+ assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand);
+ assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS);
+
+ verify(asyncInstantiationBusinessLogic).auditMsoStatus(uuid, request);
+ verify(asyncInstantiationBusinessLogic).updateServiceInfoAndAuditStatus(uuid, Job.JobStatus.PAUSE);
+ }
+
+ @Test
+ public void shouldRetryCommandExitedWithProcessingException() {
+ when(msoResponse.getStatus()).thenReturn(200);
+ when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenThrow(new ProcessingException(""));
+
+ NextCommand call = inProgressStatusCommand.call();
+
+ assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand);
+ assertThat(call.getStatus()).isEqualTo(Job.JobStatus.IN_PROGRESS);
+ }
+
+ @Test
+ public void shouldSetStoppedStatusWhenRuntimeExceptionOccurs() {
+ when(msoResponse.getStatus()).thenReturn(200);
+ when(asyncInstantiationBusinessLogic.calcStatus(asyncRequestStatus)).thenThrow(new RuntimeException());
+
+ NextCommand call = inProgressStatusCommand.call();
+
+ assertThat(call.getCommand()).isEqualTo(inProgressStatusCommand);
+ assertThat(call.getStatus()).isEqualTo(Job.JobStatus.STOPPED);
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java b/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java
new file mode 100644
index 000000000..e7ab4f098
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java
@@ -0,0 +1,157 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia 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=========================================================
+ */
+
+package org.onap.vid.job.command;
+
+
+import io.joshworks.restclient.http.HttpResponse;
+import org.mockito.Mock;
+import org.onap.vid.aai.AaiResponse;
+import org.onap.vid.aai.exceptions.InvalidAAIResponseException;
+import org.onap.vid.changeManagement.RequestDetailsWrapper;
+import org.onap.vid.domain.mso.RequestReferences;
+import org.onap.vid.exceptions.MaxRetriesException;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.NextCommand;
+import org.onap.vid.model.RequestReferencesContainer;
+import org.onap.vid.model.serviceInstantiation.ServiceInstantiation;
+import org.onap.vid.mso.MsoInterface;
+import org.onap.vid.mso.model.ServiceInstantiationRequestDetails;
+import org.onap.vid.services.AsyncInstantiationBusinessLogic;
+import org.onap.vid.services.AuditService;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.UUID;
+
+import static org.hamcrest.CoreMatchers.instanceOf;
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.CoreMatchers.nullValue;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+public class ServiceInstantiationCommandTest {
+ @Mock
+ private AsyncInstantiationBusinessLogic asyncInstantiationBusinessLogic;
+
+ @Mock
+ private MsoInterface msoInterface;
+
+ @Mock
+ private AuditService auditService;
+
+ @Mock
+ private ServiceInstantiation serviceInstantiation;
+
+ @Mock
+ private HttpResponse<RequestReferencesContainer> msoResponse;
+
+ @Mock
+ private RequestDetailsWrapper<ServiceInstantiationRequestDetails> requestDetailsWrapper;
+
+ @Mock
+ private AaiResponse aaiResponse;
+
+ @Mock
+ private RequestReferencesContainer requestReferencesContainer;
+
+
+ private UUID uuid = UUID.randomUUID();
+
+
+ private ServiceInstantiationCommand serviceInstantiationCommand;
+
+ @BeforeMethod
+ public void setUp() {
+ initMocks(this);
+ serviceInstantiationCommand = new ServiceInstantiationCommand(asyncInstantiationBusinessLogic, auditService, msoInterface, uuid, serviceInstantiation, "sampleUserId");
+ }
+
+
+ @Test
+ public void shouldProperlyHandleMaxRetriesException() {
+ when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenThrow(new MaxRetriesException("", 2));
+
+ NextCommand call = serviceInstantiationCommand.call();
+
+ assertThat(call.getCommand(), is(nullValue()));
+ assertThat(call.getStatus(), is(equalTo(Job.JobStatus.FAILED)));
+
+ verify(asyncInstantiationBusinessLogic).handleFailedInstantiation(uuid);
+ }
+
+ @Test
+ public void shouldProperlyHandleInvalidAAIResponseException() {
+ doThrow(new InvalidAAIResponseException(aaiResponse)).when(asyncInstantiationBusinessLogic).generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId");
+
+ NextCommand call = serviceInstantiationCommand.call();
+
+ assertThat(call.getCommand(), is(serviceInstantiationCommand));
+ assertThat(call.getStatus(), is(equalTo(Job.JobStatus.IN_PROGRESS)));
+ }
+
+
+ @Test
+ public void shouldProperlyHandleInvalidSOResponse() {
+ when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenReturn(requestDetailsWrapper);
+ when(asyncInstantiationBusinessLogic.getServiceInstantiationPath(serviceInstantiation)).thenReturn("samplePath");
+ when(msoInterface.post("samplePath", requestDetailsWrapper, RequestReferencesContainer.class)).thenReturn(msoResponse);
+ when(msoResponse.getStatus()).thenReturn(500);
+ when(msoResponse.getBody()).thenReturn(requestReferencesContainer);
+
+ NextCommand call = serviceInstantiationCommand.call();
+
+ assertThat(call.getCommand(), is(nullValue()));
+ assertThat(call.getStatus(), is(equalTo(Job.JobStatus.FAILED)));
+
+ verify(auditService).setFailedAuditStatusFromMso(uuid, null, 500, requestReferencesContainer.toString());
+ }
+
+
+ @Test
+ public void shouldProperlyUpdateServiceStatusAndReturnInProgressCommand() {
+ RequestReferences requestReferences = createRequestReferences();
+
+ when(asyncInstantiationBusinessLogic.generateServiceInstantiationRequest(uuid, serviceInstantiation, "sampleUserId")).thenReturn(requestDetailsWrapper);
+ when(asyncInstantiationBusinessLogic.getServiceInstantiationPath(serviceInstantiation)).thenReturn("samplePath");
+ when(msoInterface.post("samplePath", requestDetailsWrapper, RequestReferencesContainer.class)).thenReturn(msoResponse);
+ when(msoResponse.getStatus()).thenReturn(200);
+ when(msoResponse.getBody()).thenReturn(requestReferencesContainer);
+ when(requestReferencesContainer.getRequestReferences()).thenReturn(requestReferences);
+
+
+ NextCommand call = serviceInstantiationCommand.call();
+
+ assertThat(call.getCommand(), instanceOf(InProgressStatusCommand.class));
+ assertThat(call.getStatus(), is(equalTo(Job.JobStatus.IN_PROGRESS)));
+
+ }
+
+ private RequestReferences createRequestReferences() {
+ RequestReferences requestReferences = new RequestReferences();
+ requestReferences.setInstanceId("sampleInstanceId");
+ requestReferences.setRequestId("sampleRequestId");
+ return requestReferences;
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java
new file mode 100644
index 000000000..dc2eafc9b
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java
@@ -0,0 +1,110 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia 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=========================================================
+ */
+
+package org.onap.vid.job.impl;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import org.mockito.Mock;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.JobAdapter;
+import org.onap.vid.job.JobType;
+import org.onap.vid.model.JobBulk;
+import org.onap.vid.model.JobModel;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Stream;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+public class JobAdapterImplTest {
+
+
+ private static final int SAMPLE_INDEX = 10;
+ private static final String SAMPLE_USER_ID = "sampleUserId";
+
+ @Mock
+ private Job job;
+
+ @Mock
+ private JobAdapter.AsyncJobRequest asyncJobRequest;
+
+ private UUID sampleUuid=UUID.randomUUID();
+
+ private JobAdapterImpl jobAdapter = new JobAdapterImpl();
+
+ @BeforeMethod
+ public void setUp() {
+ initMocks(this);
+
+ when(job.getUuid()).thenReturn(sampleUuid);
+ when(job.getStatus()).thenReturn(Job.JobStatus.IN_PROGRESS);
+ when(job.getTemplateId()).thenReturn(sampleUuid);
+ }
+
+ @Test
+ public void shouldConvertJobToJobModel() {
+
+
+ JobModel convertedJob = jobAdapter.toModel(job);
+
+ assertThat(convertedJob.getUuid()).isEqualByComparingTo(sampleUuid);
+ assertThat(convertedJob.getStatus()).isEqualByComparingTo(Job.JobStatus.IN_PROGRESS);
+ assertThat(convertedJob.getTemplateId()).isEqualByComparingTo(sampleUuid);
+ }
+
+
+ @Test
+ public void shouldProperlyCreateJob() {
+ UUID uuid = UUID.randomUUID();
+
+ Job createdJob = jobAdapter.createJob(JobType.ServiceInstantiation, asyncJobRequest, uuid, SAMPLE_USER_ID, SAMPLE_INDEX);
+
+ assertThat(createdJob.getStatus()).isEqualByComparingTo(Job.JobStatus.PENDING);
+ assertThat(createdJob.getTemplateId()).isEqualByComparingTo(uuid);
+ assertThat(createdJob.getType()).isEqualByComparingTo(JobType.ServiceInstantiation);
+ assertThat(createdJob.getData()).isEqualTo(ImmutableMap.of("request", asyncJobRequest, "userId", SAMPLE_USER_ID));
+ }
+
+ @Test
+ public void shouldProperlyCreateBulkOfJobs(){
+ List<Job> bulkOfJobs = jobAdapter.createBulkOfJobs(ImmutableMap.of("count", 5, "type", JobType.InProgressStatus.name()));
+
+
+ assertThat(bulkOfJobs).hasSize(5);
+
+ Stream<Job> jobStream = bulkOfJobs.stream().filter(x -> JobType.InProgressStatus.equals(x.getType()) && Job.JobStatus.PENDING.equals(x.getStatus()));
+
+ assertThat(jobStream).hasSize(5);
+ }
+
+
+ @Test
+ public void shouldConvertListToBulkJob(){
+ JobBulk jobBulk = jobAdapter.toModelBulk(ImmutableList.of(job, job));
+
+ assertThat(jobBulk.getJobs()).hasSize(2);
+ }
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java
new file mode 100644
index 000000000..93afd1709
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java
@@ -0,0 +1,121 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia 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=========================================================
+ */
+
+package org.onap.vid.job.impl;
+
+
+import org.mockito.ArgumentCaptor;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.onap.vid.job.JobsBrokerService;
+import org.onap.vid.job.command.JobCommandFactory;
+import org.onap.vid.properties.Features;
+import org.quartz.JobDetail;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.quartz.Trigger;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+import org.togglz.core.manager.FeatureManager;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyZeroInteractions;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+public class JobSchedulerInitializerTest {
+
+ @Mock
+ private JobsBrokerService brokerService;
+
+ @Mock
+ private SchedulerFactoryBean schedulerFactoryBean;
+
+ @Mock
+ private FeatureManager featureManager;
+
+ @Mock
+ private JobCommandFactory commandFactory;
+
+ @Mock
+ private Scheduler scheduler;
+
+ @InjectMocks
+ private JobSchedulerInitializer jobSchedulerInitializer;
+
+ @BeforeMethod
+ public void setUp() {
+ initMocks(this);
+ }
+
+
+ @Test
+ public void shouldNotInitializeSchedulerWhenAsyncJobsAreDisabled() {
+ when(featureManager.isActive(Features.FLAG_ASYNC_JOBS)).thenReturn(false);
+
+ jobSchedulerInitializer.init();
+
+ verifyZeroInteractions(schedulerFactoryBean);
+ }
+
+
+ @Test
+ public void shouldInitializeSchedulerWhenAsyncJobsAreEnabled() throws SchedulerException {
+ ArgumentCaptor<JobDetail> jobDetailArgumentCaptor = ArgumentCaptor.forClass(JobDetail.class);
+ ArgumentCaptor<Trigger> triggerArgumentCaptor = ArgumentCaptor.forClass(Trigger.class);
+ when(featureManager.isActive(Features.FLAG_ASYNC_JOBS)).thenReturn(true);
+ when(schedulerFactoryBean.getScheduler()).thenReturn(scheduler);
+
+ jobSchedulerInitializer.init();
+
+ verify(scheduler, times(2)).scheduleJob(jobDetailArgumentCaptor.capture(), triggerArgumentCaptor.capture());
+
+ List<Object> topics = extractTopics(jobDetailArgumentCaptor);
+
+ List<String> descriptions = extractDescription(triggerArgumentCaptor);
+
+ assertThat(topics, containsInAnyOrder(org.onap.vid.job.Job.JobStatus.IN_PROGRESS, org.onap.vid.job.Job.JobStatus.PENDING));
+ assertThat(descriptions, containsInAnyOrder("Trigger to run async worker for PENDING", "Trigger to run async worker for IN_PROGRESS"));
+ }
+
+ private List<Object> extractTopics(ArgumentCaptor<JobDetail> jobDetailArgumentCaptor) {
+ return jobDetailArgumentCaptor
+ .getAllValues()
+ .stream()
+ .map(JobDetail::getJobDataMap)
+ .map(x -> x.get("topic"))
+ .collect(Collectors.toList());
+ }
+
+ private List<String> extractDescription(ArgumentCaptor<Trigger> triggerArgumentCaptor) {
+ return triggerArgumentCaptor
+ .getAllValues()
+ .stream()
+ .map(Trigger::getDescription)
+ .collect(Collectors.toList());
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java
index 36f4bdd43..461673224 100644
--- a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java
@@ -1,153 +1,306 @@
+/*
+ * ============LICENSE_START==========================================
+ * ===================================================================
+ * Modifications Copyright (C) 2018 Nokia. 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============================================
+ *
+ *
+ */
package org.onap.vid.mso;
-import org.mockito.InjectMocks;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatExceptionOfType;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.BDDMockito.given;
+import static org.mockito.Matchers.any;
+import static org.mockito.Matchers.argThat;
+import static org.mockito.Matchers.eq;
+import static org.mockito.Mockito.mock;
+import static org.onap.vid.mso.MsoBusinessLogicImpl.validateEndpointPath;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.ArgumentMatcher;
import org.mockito.Mock;
-import org.mockito.Mockito;
import org.mockito.MockitoAnnotations;
+import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.exceptions.GenericUncheckedException;
+import org.onap.vid.mso.rest.Request;
import org.onap.vid.mso.rest.RequestDetails;
+import org.onap.vid.mso.rest.RequestDetailsWrapper;
import org.onap.vid.properties.Features;
-import org.onap.portalsdk.core.util.SystemProperties;
+import org.springframework.http.HttpStatus;
import org.springframework.test.context.ContextConfiguration;
-import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
-import org.springframework.test.context.web.WebAppConfiguration;
-import org.testng.Assert;
-import org.testng.annotations.BeforeTest;
-import org.testng.annotations.DataProvider;
-import org.testng.annotations.Test;
+import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.togglz.core.manager.FeatureManager;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.onap.vid.controllers.MsoController.SVC_INSTANCE_ID;
-import static org.onap.vid.controllers.MsoController.VNF_INSTANCE_ID;
-import static org.onap.vid.mso.MsoBusinessLogicImpl.validateEndpointPath;
-
@ContextConfiguration(classes = {SystemProperties.class})
-@WebAppConfiguration
-public class MsoBusinessLogicImplTest extends AbstractTestNGSpringContextTests {
+@RunWith(SpringJUnit4ClassRunner.class)
+public class MsoBusinessLogicImplTest {
- @InjectMocks
- private MsoBusinessLogicImpl msoBusinessLogic;
+ private static final ObjectMapper objectMapper = new ObjectMapper();
@Mock
- private FeatureManager featureManagerMock;
+ private FeatureManager featureManager;
@Mock
- private MsoInterface msoInterfaceMock;
+ private MsoInterface msoInterface;
+ private MsoBusinessLogicImpl msoBusinessLogic;
- @BeforeTest
- public void initMocks(){
+ @Before
+ public void setUp() {
MockitoAnnotations.initMocks(this);
+ msoBusinessLogic = new MsoBusinessLogicImpl(msoInterface, featureManager);
}
@Test
- public void validateEndpointPath_endPointIsNotEmptyAndVaild_returnProperty(){
- System.setProperty("TestEnv","123");
- String foundEndPoint = validateEndpointPath("TestEnv");
- Assert.assertEquals("123",foundEndPoint);
- }
+ public void createConfigurationInstance_shouldCallMsoInterface_withCorrectServiceInstanceId() throws Exception {
+ // given
+ String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
+ String endpointTemplate = String.format("/serviceInstances/v6/%s/configurations", serviceInstanceId);
+ RequestDetailsWrapper requestDetailsWrapper = createRequestDetails("mso_request_create_configuration.json");
+ MsoResponseWrapper expectedResponse = createOkResponse();
+ given(msoInterface.createConfigurationInstance(requestDetailsWrapper, endpointTemplate))
+ .willReturn(expectedResponse);
- @Test(expectedExceptions = RuntimeException.class)
- public void validateEndpointPath_endPointIsNull_throwRuntimeException(){
- validateEndpointPath("NotExists");
- }
+ // when
+ MsoResponseWrapper msoResponseWrapper = msoBusinessLogic
+ .createConfigurationInstance(requestDetailsWrapper, serviceInstanceId);
- @Test(expectedExceptions = RuntimeException.class)
- public void validateEndpointPath_endPointIsNotEmptyButDoesntExists_throwRuntimeException(){
- System.setProperty("EmptyEndPoint","");
- validateEndpointPath("EmptyEndPoint");
+ // then
+ assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse);
}
+ private RequestDetailsWrapper createRequestDetails(String bodyFileName) throws Exception {
+ final URL resource = this.getClass().getResource("/payload_jsons/" + bodyFileName);
+ RequestDetails requestDetails = objectMapper.readValue(resource, RequestDetails.class);
+ return new RequestDetailsWrapper(requestDetails);
+ }
- //@Test(dataProvider = "unAssignOrDeleteParams")
- public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOffOrUnAssignFlagIsFalse(boolean isAssignFlag,String status) {
- Mockito.reset(msoInterfaceMock);
- String endpoint = validateEndpointPath(isAssignFlag ? MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE : MsoProperties.MSO_REST_API_SVC_INSTANCE);
- RequestDetails requestDetails = new RequestDetails();
-
- when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(isAssignFlag);
-
- msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status);
+ @Test
+ public void validateEndpointPath_endPointIsNotEmptyAndVaild_returnProperty() {
+ System.setProperty("TestEnv", "123");
+ String foundEndPoint = validateEndpointPath("TestEnv");
+ assertEquals("123", foundEndPoint);
+ }
- verify(msoInterfaceMock).deleteSvcInstance(requestDetails, endpoint + "/tempId");
+ @Test
+ public void validateEndpointPath_endPointIsNull_throwRuntimeException() {
+ assertThatExceptionOfType(RuntimeException.class)
+ .isThrownBy(() -> validateEndpointPath("NotExists"));
}
- @DataProvider
- public Object[][] unAssignOrDeleteParams() {
- return new Object[][]{
- {Boolean.FALSE, "active"},
- {Boolean.FALSE, "created"},
- {Boolean.TRUE, "Active"},
- {Boolean.TRUE, "unexpected-status"},
- };
+ @Test
+ public void validateEndpointPath_endPointIsNotEmptyButDoesntExists_throwRuntimeException() {
+ String endPoint = "EmptyEndPoint";
+ System.setProperty(endPoint, "");
+ assertThatExceptionOfType(GenericUncheckedException.class)
+ .isThrownBy(() -> validateEndpointPath(endPoint))
+ .withMessage(endPoint + " env variable is not defined");
}
- //@Test(dataProvider = "unAssignStatus")
- public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOnAndUnAssignFlagIsTrue(String status) {
- Mockito.reset(msoInterfaceMock);
- // in the test Features.FLAG_UNASSIGN_SERVICE is active so the endpoint should be MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE
- String endpoint = validateEndpointPath(MsoProperties.MSO_DELETE_OR_UNASSIGN_REST_API_SVC_INSTANCE);
+ @Test
+ public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOffOrUnAssignFlagIsFalse() {
+ // given
+ String endpointTemplate = "/serviceInstances/v5/%s";
+ String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
+ String svcEndpoint = String.format(endpointTemplate, serviceInstanceId);
RequestDetails requestDetails = new RequestDetails();
+ MsoResponseWrapper expectedResponse = createOkResponse();
+ given(msoInterface.deleteSvcInstance(requestDetails, svcEndpoint)).willReturn(expectedResponse);
+ given(featureManager.isActive(Features.FLAG_UNASSIGN_SERVICE)).willReturn(false);
- when(featureManagerMock.isActive(Features.FLAG_UNASSIGN_SERVICE)).thenReturn(true);
+ // when
+ MsoResponseWrapper msoResponseWrapper = msoBusinessLogic
+ .deleteSvcInstance(requestDetails, serviceInstanceId, "unAssignOrDeleteParams");
- msoBusinessLogic.deleteSvcInstance(requestDetails, "tempId", status);
-
- verify(msoInterfaceMock).unassignSvcInstance(requestDetails, endpoint + "/tempId/unassign");
+ // then
+ assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse);
}
- @DataProvider
- public Object[][] unAssignStatus() {
- return new Object[][]{
- {"Created"},
- {"Pendingdelete"},
- {"pending-Delete"},
- {"Assigned"}
- };
+ @Test
+ public void deleteSvcInstance_verifyEndPointPathConstructing_unAssignFeatureOnAndUnAssignFlagIsTrue() {
+ // given
+ String endpointTemplate = "/serviceInstantiation/v5/serviceInstances/%s/unassign";
+ String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
+ String svcEndpoint = String.format(endpointTemplate, serviceInstanceId);
+ RequestDetails requestDetails = new RequestDetails();
+ MsoResponseWrapper expectedResponse = createOkResponse();
+ given(msoInterface.unassignSvcInstance(requestDetails, svcEndpoint)).willReturn(expectedResponse);
+ given(featureManager.isActive(Features.FLAG_UNASSIGN_SERVICE)).willReturn(true);
+
+ // when
+ MsoResponseWrapper msoResponseWrapper = msoBusinessLogic
+ .deleteSvcInstance(requestDetails, serviceInstanceId, "assigned");
+
+ // then
+ assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void deleteVnf_verifyEndPointPathConstructing() {
- String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VNF_INSTANCE);
+ // when
+ String endpointTemplate = "/serviceInstances/v5/%s/vnfs/%s";
+ String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
+ String vnfInstanceId = "testVnfInstanceTempId";
+ String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId);
RequestDetails requestDetails = new RequestDetails();
+ MsoResponseWrapper expectedResponse = createOkResponse();
+ given(msoInterface.deleteVnf(requestDetails, vnfEndpoint)).willReturn(expectedResponse);
- String vnf_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId");
+ // when
+ MsoResponseWrapper msoResponseWrapper = msoBusinessLogic
+ .deleteVnf(requestDetails, serviceInstanceId, vnfInstanceId);
- msoBusinessLogic.deleteVnf(requestDetails, "serviceInstanceTempId","vnfInstanceTempId");
- verify(msoInterfaceMock).deleteVnf(requestDetails, vnf_endpoint + "/vnfInstanceTempId");
+ // then
+ assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse);
}
@Test
public void deleteVfModule_verifyEndPointPathConstructing() {
- String endpoint = validateEndpointPath(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
+ // when
+ String endpointTemplate = "/serviceInstances/v7/%s/vnfs/%s/vfModules/%s";
+ String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
+ String vnfInstanceId = "testVnfInstanceTempId";
+ String vfModuleId = "testVfModuleId";
+ String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId, vfModuleId);
RequestDetails requestDetails = new RequestDetails();
+ MsoResponseWrapper expectedResponse = createOkResponse();
+ given(msoInterface.deleteVfModule(requestDetails, vnfEndpoint)).willReturn(expectedResponse);
+
+ // when
+ MsoResponseWrapper msoResponseWrapper = msoBusinessLogic
+ .deleteVfModule(requestDetails, serviceInstanceId, vnfInstanceId, vfModuleId);
+ // then
+ assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedResponse);
+ }
+
+ @Test
+ public void shouldSendProperScaleOutRequest() throws IOException {
+ // given
+ String serviceInstanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
+ String vnfInstanceId = "testVnfInstanceTempId";
+ String endpointTemplate = "/serviceInstantiation/v7/serviceInstances/%s/vnfs/%s/vfModules/scaleOut";
+ String vnfEndpoint = String.format(endpointTemplate, serviceInstanceId, vnfInstanceId);
+ org.onap.vid.changeManagement.RequestDetails requestDetails = readRequest(
+ "scaleOutVfModulePayload.json");
+ org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest = readExpectedRequest(
+ "scaleOutVfModulePayloadToMso.json");
+ MsoResponseWrapper expectedMsoResponseWrapper = createOkResponse();
+ given(
+ msoInterface
+ .scaleOutVFModuleInstance(argThat(new MsoRequestWrapperMatcher(expectedRequest)),
+ eq(vnfEndpoint)))
+ .willReturn(expectedMsoResponseWrapper);
+
+ // when
+ MsoResponseWrapper msoResponseWrapper = msoBusinessLogic
+ .scaleOutVfModuleInstance(requestDetails, serviceInstanceId, vnfInstanceId);
+
+ // then
+ assertThat(msoResponseWrapper).isEqualToComparingFieldByField(expectedMsoResponseWrapper);
+ }
- String vf__modules_endpoint = endpoint.replaceFirst(SVC_INSTANCE_ID, "serviceInstanceTempId").replaceFirst(VNF_INSTANCE_ID, "vnfInstanceTempId");
+ private org.onap.vid.changeManagement.RequestDetails readRequest(String requestJsonFilename) throws IOException {
+ Path path = Paths.get("payload_jsons", requestJsonFilename);
+ URL url = this.getClass().getClassLoader().getResource(path.toString());
+ return objectMapper.readValue(url, org.onap.vid.changeManagement.RequestDetails.class);
+ }
- msoBusinessLogic.deleteVfModule(requestDetails, "serviceInstanceTempId","vnfInstanceTempId", "vfModuleTempId");
- verify(msoInterfaceMock).deleteVfModule(requestDetails, vf__modules_endpoint + "/vfModuleTempId" );
+ private org.onap.vid.changeManagement.RequestDetailsWrapper readExpectedRequest(String requestJsonFilename)
+ throws IOException {
+ Path path = Paths.get("payload_jsons", requestJsonFilename);
+ URL url = this.getClass().getClassLoader().getResource(path.toString());
+ return objectMapper.readValue(url,
+ new TypeReference<org.onap.vid.changeManagement.RequestDetailsWrapper<org.onap.vid.changeManagement.RequestDetails>>() {
+ });
+ }
+
+ private MsoResponseWrapper createOkResponse() {
+ HttpStatus expectedStatus = HttpStatus.ACCEPTED;
+ String expectedBody = " \"body\": {\n" +
+ " \"requestReferences\": {\n" +
+ " \"instanceId\": \" 123456 \",\n" +
+ " \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"\n" +
+ " }";
+ MsoResponseWrapper responseWrapper = new MsoResponseWrapper();
+ responseWrapper.setEntity(expectedBody);
+ responseWrapper.setStatus(expectedStatus.value());
+ return responseWrapper;
}
@Test
- public void insertServiceInstantiationToDB_StartJob() {
-
-// broker = new JobsBrokerServiceInDatabaseImpl(dataAccessServiceMock, sessionFactory);
-// ((JobsBrokerServiceInDatabaseImpl)broker).deleteAll();
-//
-//// msoBusinessLogic.setDataAccessService(dataAccessServiceMock);
-//// msoBusinessLogic.setJobsBrokerService(broker);
-//// msoBusinessLogic.setJobAdapter(jobAdapter);
-//
-// ServiceInstantiation serviceInstantiation = new ServiceInstantiation();
-// serviceInstantiation.setCount(2);
-// serviceInstantiation.setInstanceName("TestName");
-//
-// msoBusinessLogic.pushBulkJob(serviceInstantiation, "testUserId");
-//
-// List<ServiceInfo> serviceInfoList = dataAccessServiceMock.getList(ServiceInfo.class, null);
-// int k = 9;
-// Assert.assertEquals(serviceInstantiation, containsInAnyOrder(serviceInfoList.toArray()));
+ public void shouldFilterOutOrchestrationRequestsNotAllowedInDashboard() throws IOException {
+ //given
+ String vnfModelTypeOrchestrationRequests = getFileContentAsString("mso_model_info_sample_response.json");
+ String scaleOutActionOrchestrationRequests = getFileContentAsString("mso_action_scaleout_sample_response.json");
+
+ MsoResponseWrapper msoResponseWrapperMock = mock(MsoResponseWrapper.class);
+ given(msoInterface
+ .getOrchestrationRequestsForDashboard(any(String.class), any(String.class), any(String.class),
+ any(RestObject.class)))
+ .willReturn(msoResponseWrapperMock);
+ given(msoResponseWrapperMock.getEntity())
+ .willReturn(vnfModelTypeOrchestrationRequests, scaleOutActionOrchestrationRequests);
+
+ //when
+ List<Request> filteredOrchestrationReqs = msoBusinessLogic.getOrchestrationRequestsForDashboard();
+
+ //then
+ assertThat(filteredOrchestrationReqs).hasSize(3);
+ assertThat(MsoBusinessLogicImpl.DASHBOARD_ALLOWED_TYPES)
+ .containsAll(filteredOrchestrationReqs
+ .stream()
+ .map(el -> el.getRequestType().toUpperCase())
+ .collect(Collectors.toList()));
+ assertThat(filteredOrchestrationReqs)
+ .extracting(org.onap.vid.domain.mso.Request::getRequestScope)
+ .containsOnly("vnf", "vfModule");
+ }
+
+ private String getFileContentAsString(String resourceName) throws IOException {
+ URL url = this.getClass().getClassLoader().getResource(".");
+ Path path = Paths.get(url.getPath(), "payload_jsons", resourceName);
+ return new String(Files.readAllBytes(path));
+ }
+
+ private static class MsoRequestWrapperMatcher extends
+ ArgumentMatcher<org.onap.vid.changeManagement.RequestDetailsWrapper> {
+
+ private final org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest;
+
+ public MsoRequestWrapperMatcher(org.onap.vid.changeManagement.RequestDetailsWrapper expectedRequest) {
+ this.expectedRequest = expectedRequest;
+ }
+
+ @Override
+ public boolean matches(Object argument) {
+ org.onap.vid.changeManagement.RequestDetailsWrapper requestDetailsWrapper = (org.onap.vid.changeManagement.RequestDetailsWrapper) argument;
+ return expectedRequest.requestDetails.equals(requestDetailsWrapper.requestDetails);
+ }
}
}
diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java b/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java
deleted file mode 100644
index af7f74b3d..000000000
--- a/vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package org.onap.vid.mso;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.mockito.runners.MockitoJUnitRunner;
-import org.onap.vid.mso.MsoBusinessLogicImpl;
-import org.onap.vid.mso.MsoInterface;
-import org.onap.vid.mso.MsoResponseWrapper;
-import org.onap.vid.mso.rest.RequestDetails;
-import org.onap.vid.mso.rest.RequestDetailsWrapper;
-import org.testng.annotations.Test;
-
-import java.net.URL;
-
-import static org.testng.Assert.assertEquals;
-import static org.testng.Assert.assertNotNull;
-
-@RunWith(MockitoJUnitRunner.class)
-public class MsoBusinessLogicTest {
-
- @InjectMocks
- private MsoBusinessLogicImpl msoBusinessLogic;
-
- @Mock
- private MsoInterface msoClient;
-
- @Test
- public void testCreateInstance() throws Exception {
- String instanceId = "3f93c7cb-2fd0-4557-9514-e189b7b04f9d";
- final RequestDetailsWrapper requestDetailsWrapper = new RequestDetailsWrapper();
- requestDetailsWrapper.requestDetails = setRequestDetails("mso_request_create_configuration.json");
- Mockito.doReturn(getOkResponse(instanceId)).when(msoClient).createConfigurationInstance(requestDetailsWrapper, "/serviceInstances/v6/3f93c7cb-2fd0-4557-9514-e189b7b04f9d/configurations");
- final MsoResponseWrapper msoResponseWrapper = msoBusinessLogic.createConfigurationInstance(requestDetailsWrapper, instanceId);
-
- assertNotNull(msoResponseWrapper);
- assertEquals(202, msoResponseWrapper.getStatus());
- }
-
- private MsoResponseWrapper getOkResponse(String instanceId){
- MsoResponseWrapper responseWrapper = new MsoResponseWrapper();
- String entity = " \"body\": {\n" +
- " \"requestReferences\": {\n" +
- " \"instanceId\": \""+instanceId+"\",\n" +
- " \"requestId\": \"b6dc9806-b094-42f7-9386-a48de8218ce8\"\n" +
- " }";
- responseWrapper.setEntity(entity);
- responseWrapper.setStatus(202);
- return responseWrapper;
- }
-
- private RequestDetails setRequestDetails(String bodyFileName)throws Exception {
- final URL resource = this.getClass().getResource("/payload_jsons/" + bodyFileName);
- ObjectMapper mapper = new ObjectMapper();
- RequestDetails requestDetails = mapper.readValue(resource, RequestDetails.class);
- return requestDetails;
-
- }
-}
diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java
index 402386a50..bfc82ce2a 100644
--- a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java
@@ -21,17 +21,12 @@
package org.onap.vid.mso.rest;
import com.xebialabs.restito.server.StubServer;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Properties;
-import java.util.UUID;
import org.glassfish.grizzly.http.util.HttpStatus;
import org.junit.AfterClass;
import org.junit.BeforeClass;
+import org.junit.Ignore;
import org.junit.Test;
+import org.onap.portalsdk.core.util.SystemProperties;
import org.onap.vid.client.SyncRestClient;
import org.onap.vid.controllers.MsoController;
import org.onap.vid.mso.MsoInterface;
@@ -39,16 +34,30 @@ import org.onap.vid.mso.MsoProperties;
import org.onap.vid.mso.MsoResponseWrapper;
import org.onap.vid.mso.MsoResponseWrapperInterface;
import org.onap.vid.mso.RestObject;
+import org.springframework.test.context.ContextConfiguration;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Properties;
+import java.util.UUID;
+
+import static org.onap.vid.controllers.MsoController.SVC_INSTANCE_ID;
+import static org.onap.vid.controllers.MsoController.VNF_INSTANCE_ID;
+
+@ContextConfiguration(classes = {SystemProperties.class})
public class MsoRestClientNewTest {
private static StubServer server;
private static StubServer securedServer;
private static Properties props = new Properties();
private static String msoCreateServiceInstanceJson;
+ private static String msoScaleOutVfModule;
private final static String CREATE_INSTANCE_RESPONSE_STR =
- "{\"requestReferences\":{\"instanceId\":\"baa13544-0e95-4644-9565-9a198a29a294\","
- + "\"requestId\":\"a42a1a35-3d63-4629-bbe0-4989fa7414cb\"}}";
+ "{\"requestReferences\":{\"instanceId\":\"baa13544-0e95-4644-9565-9a198a29a294\","
+ + "\"requestId\":\"a42a1a35-3d63-4629-bbe0-4989fa7414cb\"}}";
private final static String SERVICE_INSTANCE_ID = "12345";
private static final String SAMPLE_VNF_INSTANCE_ID = "111";
private static final String SAMPLE_VNF_MODULE_ID = "987";
@@ -63,15 +72,19 @@ public class MsoRestClientNewTest {
securedServer = new StubServer().secured().run();
Path resourceDirectory =
- Paths.get("src", "test", "resources", "WEB-INF", "conf", "system.properties");
- try(InputStream is = Files.newInputStream(resourceDirectory)) {
+ Paths.get("src", "test", "resources", "WEB-INF", "conf", "system.properties");
+ try (InputStream is = Files.newInputStream(resourceDirectory)) {
props.load(is);
}
Path msoServiceInstantiationJsonFilePath =
- Paths.get("src", "test", "resources", "payload_jsons", "mso_service_instantiation.json");
+ Paths.get("src", "test", "resources", "payload_jsons", "mso_service_instantiation.json");
+
+ Path scaleOutJsonFilePath = Paths.get("src", "test", "resources", "payload_jsons", "scaleOutVfModulePayloadToMso.json");
msoCreateServiceInstanceJson =
- String.join("\n", Files.readAllLines(msoServiceInstantiationJsonFilePath));
+ String.join("\n", Files.readAllLines(msoServiceInstantiationJsonFilePath));
+ msoScaleOutVfModule = String.join("\n", Files.readAllLines(scaleOutJsonFilePath));
+
}
@AfterClass
@@ -89,11 +102,11 @@ public class MsoRestClientNewTest {
public void testCreateSvcInstance() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_CONFIGURATIONS);
endpoint = endpoint.replace(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- endpoint,
- HttpStatus.ACCEPTED_202,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ endpoint,
+ HttpStatus.ACCEPTED_202,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createSvcInstance);
}
}
@@ -102,12 +115,12 @@ public class MsoRestClientNewTest {
public void testCreateVnf() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);
endpoint = endpoint.replace(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- endpoint,
- HttpStatus.ACCEPTED_202,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
-
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ endpoint,
+ HttpStatus.ACCEPTED_202,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+
closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVnf);
}
}
@@ -116,11 +129,11 @@ public class MsoRestClientNewTest {
public void testCreateNwInstance() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
String nw_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- nw_endpoint,
- HttpStatus.ACCEPTED_202,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ nw_endpoint,
+ HttpStatus.ACCEPTED_202,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createNwInstance);
}
}
@@ -130,11 +143,11 @@ public class MsoRestClientNewTest {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
String vnf_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
vnf_endpoint = vnf_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- vnf_endpoint,
- HttpStatus.ACCEPTED_202,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ vnf_endpoint,
+ HttpStatus.ACCEPTED_202,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVolumeGroupInstance);
}
}
@@ -144,14 +157,14 @@ public class MsoRestClientNewTest {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
String partial_endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
String vf_module_endpoint =
- partial_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
+ partial_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- vf_module_endpoint,
- HttpStatus.ACCEPTED_202,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ vf_module_endpoint,
+ HttpStatus.ACCEPTED_202,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::createVfModuleInstance);
}
}
@@ -170,36 +183,38 @@ public class MsoRestClientNewTest {
} catch (Exception e) {
}
}
-
+ @Ignore
@Test
public void testDeleteSvcInstance() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- endpoint,
- HttpStatus.NO_CONTENT_204,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ endpoint,
+ HttpStatus.NO_CONTENT_204,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteSvcInstance);
}
}
+ @Ignore
@Test
public void testDeleteVnf() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VNF_INSTANCE);
endpoint = endpoint.replaceFirst(MsoController.SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- endpoint,
- HttpStatus.NO_CONTENT_204,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ endpoint,
+ HttpStatus.NO_CONTENT_204,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVnf);
}
}
+ @Ignore
@Test
public void testDeleteVfModule() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_INSTANCE);
@@ -207,15 +222,16 @@ public class MsoRestClientNewTest {
String vf_modules_endpoint = part_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
String delete_vf_endpoint = vf_modules_endpoint + '/' + SAMPLE_VNF_MODULE_ID;
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- delete_vf_endpoint,
- HttpStatus.NO_CONTENT_204,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ delete_vf_endpoint,
+ HttpStatus.NO_CONTENT_204,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVfModule);
}
}
+ @Ignore
@Test
public void testDeleteVolumeGroupInstance() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_VOLUME_GROUP_INSTANCE);
@@ -223,15 +239,16 @@ public class MsoRestClientNewTest {
String vnf_endpoint = svc_endpoint.replaceFirst(MsoController.VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
String delete_volume_group_endpoint = vnf_endpoint + "/" + SAMPLE_VNF_MODULE_ID;
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- delete_volume_group_endpoint,
- HttpStatus.NO_CONTENT_204,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ delete_volume_group_endpoint,
+ HttpStatus.NO_CONTENT_204,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executeDelete(msoCreateServiceInstanceJson, msoRestClient()::deleteVolumeGroupInstance);
}
}
+ @Ignore
@Test
public void testDeleteNwInstance() throws Exception {
String endpoint = props.getProperty(MsoProperties.MSO_REST_API_NETWORK_INSTANCE);
@@ -410,11 +427,11 @@ public class MsoRestClientNewTest {
String serviceEndpoint = props.getProperty(MsoProperties.MSO_REST_API_SVC_INSTANCE);
String removeRelationshipsPath = serviceEndpoint + "/" + SERVICE_INSTANCE_ID + "/removeRelationships";
- try(MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
- server,
- removeRelationshipsPath,
- HttpStatus.ACCEPTED_202,
- CREATE_INSTANCE_RESPONSE_STR,CREATE_INSTANCE_RESPONSE_STR)) {
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ removeRelationshipsPath,
+ HttpStatus.ACCEPTED_202,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
closure.executePost(msoCreateServiceInstanceJson, msoRestClient()::removeRelationshipFromServiceInstance);
}
}
@@ -433,6 +450,20 @@ public class MsoRestClientNewTest {
} catch (Exception e) {
}
}
+ @Test
+ public void testScaleOutVfModule() throws IOException {
+ String serviceEndpoint = props.getProperty(MsoProperties.MSO_REST_API_VF_MODULE_SCALE_OUT);
+ String partial_endpoint = serviceEndpoint.replaceFirst(SVC_INSTANCE_ID, SERVICE_INSTANCE_ID);
+ String vf_module_endpoint = partial_endpoint.replaceFirst(VNF_INSTANCE_ID, SAMPLE_VNF_INSTANCE_ID);
+ try (MsoRestClientTestUtil closure = new MsoRestClientTestUtil(
+ server,
+ vf_module_endpoint,
+ HttpStatus.ACCEPTED_202,
+ CREATE_INSTANCE_RESPONSE_STR, CREATE_INSTANCE_RESPONSE_STR)) {
+ closure.executePostCall(msoScaleOutVfModule, msoRestClient()::scaleOutVFModuleInstance);
+ }
+
+ }
private MsoRestClientNew msoRestClient() {
return new MsoRestClientNew(new SyncRestClient(MsoInterface.objectMapper()), baseUrl());
diff --git a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java
index e8f556999..c81fa16fd 100644
--- a/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java
+++ b/vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java
@@ -20,11 +20,13 @@ import java.util.function.BiFunction;
import java.util.function.Function;
import javax.ws.rs.core.HttpHeaders;
import javax.ws.rs.core.MediaType;
+
import org.glassfish.grizzly.http.Method;
import org.glassfish.grizzly.http.util.HttpStatus;
import org.json.JSONObject;
import org.junit.Assert;
import org.onap.portalsdk.core.util.SystemProperties;
+import org.onap.vid.changeManagement.RequestDetailsWrapper;
import org.onap.vid.mso.MsoResponseWrapper;
class MsoRestClientTestUtil implements AutoCloseable {
@@ -60,6 +62,21 @@ class MsoRestClientTestUtil implements AutoCloseable {
verifyServer(server, endpoint, Method.POST);
}
+ void executePostCall(String jsonPayload, BiFunction<RequestDetailsWrapper, String, MsoResponseWrapper> func) throws IOException {
+ whenHttp(server)
+ .match(post(endpoint))
+ .then(status(expectedStatus), jsonContent(responsePayload), contentType(MediaType.APPLICATION_JSON));
+
+ RequestDetailsWrapper sampleRequestDetails =
+ new ObjectMapper().readValue(jsonPayload, RequestDetailsWrapper.class);
+
+ MsoResponseWrapper response = func.apply(sampleRequestDetails, endpoint);
+ JSONObject actualJson = new JSONObject(response.getEntity());
+
+ Assert.assertEquals(expectedStatus.getStatusCode(), response.getStatus());
+ Assert.assertEquals(expectedResponseStr, actualJson.toString());
+ verifyServer(server, endpoint, Method.POST);
+ }
void executeDelete(String jsonPayload, BiFunction<RequestDetails, String, MsoResponseWrapper> func)
throws IOException {
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java
new file mode 100644
index 000000000..3d2a20b63
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java
@@ -0,0 +1,63 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. 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=========================================================
+ */
+package org.onap.vid.services;
+
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import java.util.UUID;
+import org.glassfish.grizzly.http.util.HttpStatus;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.Test;
+
+public class AuditServiceImplTest {
+ @Mock
+ private AsyncInstantiationBusinessLogic asyncInstantiationBL;
+
+ @InjectMocks
+ private AuditServiceImpl auditService;
+
+ @BeforeClass
+ public void init() {
+ initMocks(this);
+ }
+
+ @Test
+ public void setFailedAuditStatusFromMsoTest() {
+
+ UUID jobUuid = UUID.randomUUID();
+ String requestId = "1";
+ int statusCode = HttpStatus.OK_200.getStatusCode();
+ String msoResponse = "{}";
+
+ auditService.setFailedAuditStatusFromMso(jobUuid, requestId, statusCode, msoResponse);
+
+ verify(asyncInstantiationBL, times(1))
+ .auditMsoStatus(
+ Mockito.any(UUID.class),
+ Mockito.anyString(),
+ Mockito.anyString(),
+ Mockito.anyString());
+ }
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java
new file mode 100644
index 000000000..6677da357
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java
@@ -0,0 +1,135 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2018 Nokia. 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=========================================================
+ */
+package org.onap.vid.services;
+
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.when;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import javax.ws.rs.NotFoundException;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.onap.vid.job.Job;
+import org.onap.vid.job.JobAdapter;
+import org.onap.vid.job.JobsBrokerService;
+import org.onap.vid.job.impl.JobDaoImpl;
+import org.onap.vid.model.JobBulk;
+import org.onap.vid.model.JobModel;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Test;
+
+public class BulkInstantiationServiceImplTest {
+
+ @Mock
+ private JobsBrokerService jobsBrokerService;
+
+ @Mock
+ private JobAdapter jobAdapter;
+
+ @InjectMocks
+ private BulkInstantiationServiceImpl testSubject;
+
+ @BeforeSuite
+ public void before() {
+ initMocks(this);
+ }
+
+ @BeforeMethod
+ public void resetMocks() {
+ reset(jobsBrokerService);
+ reset(jobAdapter);
+ }
+
+ @Test
+ public void saveBulkTest() {
+ UUID uuid = UUID.randomUUID();
+ Map<String, Object> bulkRequest = new HashMap<>();
+ List<Job> jobList = new ArrayList<>();
+ jobList.add(createJob(uuid));
+ when(jobAdapter.createBulkOfJobs(bulkRequest)).thenReturn(jobList);
+
+ JobBulk jobBulk = createJobBulk(jobList);
+ when(jobAdapter.toModelBulk(jobList)).thenReturn(jobBulk);
+
+ JobBulk result = testSubject.saveBulk(bulkRequest);
+
+ Assert.assertEquals(result.getJobs().size(), jobList.size());
+ Assert.assertEquals(result.getJobs().get(0).getUuid(), uuid);
+ }
+
+ @Test
+ public void getJobTest() {
+ UUID uuid = UUID.randomUUID();
+ Job job = createJob(uuid);
+ doReturn(job).when(jobsBrokerService).peek(uuid);
+ JobModel jobModel = createJobModel(uuid);
+ when(jobAdapter.toModel(job)).thenReturn(jobModel);
+
+ JobModel response = testSubject.getJob(uuid);
+ Assert.assertEquals(response.getUuid(), uuid);
+ }
+
+ @Test(expectedExceptions = {NotFoundException.class})
+ public void getJobTest_throwsExceptionOnEmptyUUID() {
+ UUID uuid = null;
+ Job job = createJob(uuid);
+ doReturn(job).when(jobsBrokerService).peek(uuid);
+ JobModel response = testSubject.getJob(uuid);
+ Assert.fail();
+ }
+
+ @Test(expectedExceptions = {NotFoundException.class})
+ public void getJobTest_throwsExceptionCauseJobDoesNotExists() {
+ UUID uuid = UUID.randomUUID();
+ doReturn(null).when(jobsBrokerService).peek(uuid);
+ JobModel response = testSubject.getJob(uuid);
+ Assert.fail();
+ }
+
+ private Job createJob(UUID uuid) {
+ Job job = new JobDaoImpl();
+ job.setUuid(uuid);
+ return job;
+ }
+
+ private JobModel createJobModel(UUID uuid) {
+ JobModel jobModel = new JobModel();
+ jobModel.setUuid(uuid);
+ return jobModel;
+ }
+
+ private JobBulk createJobBulk(List<Job> jobList) {
+ List<JobModel> jobBulkList = new ArrayList<>();
+ jobList.stream().forEach(job -> {
+ JobModel jm = new JobModel();
+ jm.setUuid(job.getUuid());
+ jobBulkList.add(jm);
+ });
+ return new JobBulk(jobBulkList);
+ }
+}
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java
index 440a2a7bf..6ac7b5447 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java
@@ -1,80 +1,262 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. 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=========================================================
+ */
package org.onap.vid.services;
-import org.junit.Test;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Matchers.anyString;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import javax.ws.rs.ForbiddenException;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.onap.portalsdk.core.service.DataAccessService;
import org.onap.vid.category.AddCategoryOptionResponse;
import org.onap.vid.category.AddCategoryOptionsRequest;
import org.onap.vid.category.CategoryParameterOptionRep;
import org.onap.vid.category.CategoryParametersResponse;
+import org.onap.vid.model.CategoryParameter;
+import org.onap.vid.model.CategoryParameter.Family;
import org.onap.vid.model.CategoryParameterOption;
+import org.onap.vid.services.CategoryParameterServiceImpl.AlreadyExistOptionNameException;
+import org.onap.vid.services.CategoryParameterServiceImpl.UnfoundedCategoryException;
+import org.onap.vid.services.CategoryParameterServiceImpl.UnfoundedCategoryOptionException;
+import org.testng.Assert;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.BeforeSuite;
+import org.testng.annotations.Test;
public class CategoryParameterServiceImplTest {
- private CategoryParameterServiceImpl createTestSubject() {
- return new CategoryParameterServiceImpl();
+ private static final String CATEGORY_NAME = "SAMPLE_CATEGORY_NAME";
+ private static final String OPTION_NAME = "SAMPLE_OPTION_NAME";
+ private static final String UNIQUE_OPTION_NAME = "UNIQUE_OPTION_NAME";
+ private static final String APP_ID_VID = "VID";
+ private static final String APP_ID_SDC = "SDC";
+ private static final String QUERY_STRING_FOR_CATEGORY_NAME = String.format(" where name = '%s' ", CATEGORY_NAME);
+
+
+ @Mock
+ private DataAccessService dataAccessService;
+
+ @InjectMocks
+ private CategoryParameterServiceImpl testSubject;
+
+ @BeforeSuite
+ public void before() {
+ initMocks(this);
+ }
+
+ @BeforeMethod
+ public void resetMocks() {
+ reset(dataAccessService);
}
@Test
- public void testCreateCategoryParameterOptions() throws Exception {
- CategoryParameterServiceImpl testSubject;
- String categoryName = "";
- AddCategoryOptionsRequest optionsRequest = null;
- AddCategoryOptionResponse result;
-
- // default test
- try {
- testSubject = createTestSubject();
- result = testSubject.createCategoryParameterOptions(categoryName, optionsRequest);
- } catch (
-
- Exception e) {
- }
+ public void createCategoryParameterOptions_happyPath() {
+ AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest();
+ optionsRequest.options.add(UNIQUE_OPTION_NAME);
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest);
+
+ Assert.assertTrue(result.getErrors().isEmpty());;
+ verify(dataAccessService, times(1))
+ .saveDomainObject(anyObject(), anyObject());
}
@Test
- public void testDeleteCategoryOption() throws Exception {
- CategoryParameterServiceImpl testSubject;
- String categoryName = "";
+ public void createCategoryParameterOptions_existingOptionsForCategory() {
+ AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest();
+ optionsRequest.options.add(OPTION_NAME);
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ categoryParameter.getOptions().add(new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter));
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ String expectedError = String.format(CategoryParameterServiceImpl.OPTION_ALREADY_EXIST_FOR_CATEGORY
+ , OPTION_NAME, CATEGORY_NAME);
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest);
+
+ Assert.assertFalse(result.getErrors().isEmpty());
+ Assert.assertEquals(result.getErrors().size(), 1);
+ Assert.assertTrue(result.getErrors().stream().allMatch(expectedError::equals));
+ }
+
+ private List<CategoryParameter> createCategoryParametersList(CategoryParameter categoryParameter) {
+ List<CategoryParameter> aList = new ArrayList<>();
+ aList.add(categoryParameter);
+ return aList;
+ }
+
+ @Test
+ public void createCategoryParameterOptions_nonExistingOptionsForCategory() {
+ AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest();
+
+ List<CategoryParameter> aList = createCategoryParametersList(new CategoryParameter());
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest);
+
+ Assert.assertTrue(result.getErrors().isEmpty());
+ }
+
+ @Test(expectedExceptions = { UnfoundedCategoryException.class })
+ public void createCategoryParameterOptions_wrongNumberOfCategoryParameters() {
+ AddCategoryOptionsRequest optionsRequest = new AddCategoryOptionsRequest();
+ List<CategoryParameter> aList = Collections.emptyList();
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.createCategoryParameterOptions(CATEGORY_NAME, optionsRequest);
+
+ Assert.fail();
+ }
+
+ @Test(expectedExceptions = { UnfoundedCategoryException.class })
+ public void deleteCategoryOption_wrongNumberOfParameters() {
CategoryParameterOption option = null;
+ List<CategoryParameter> aList = Collections.emptyList();
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ testSubject.deleteCategoryOption(CATEGORY_NAME, option);
- // default test
- try {
- testSubject = createTestSubject();
- testSubject.deleteCategoryOption(categoryName, option);
- } catch (
+ Assert.fail();
+ }
+
+ @Test
+ public void deleteCategoryOption_happyPath() {
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ CategoryParameterOption categoryParameterOption =
+ new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter);
+ categoryParameter.getOptions().add(categoryParameterOption);
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ doReturn(aList).when(dataAccessService).getList(anyObject(), anyString(), anyString(), anyObject());
- Exception e) {
- }
+ testSubject.deleteCategoryOption(CATEGORY_NAME, categoryParameterOption);
+
+ verify(dataAccessService, times(1))
+ .deleteDomainObject(anyObject(), anyObject());
}
@Test
- public void testGetCategoryParameters() throws Exception {
- CategoryParameterServiceImpl testSubject;
- CategoryParametersResponse result;
-
- // default test
- try {
- testSubject = createTestSubject();
- testSubject.getCategoryParameters(null);
- } catch (
-
- Exception e) {
- }
+ public void getCategoryParametersTest() {
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ CategoryParameterOption categoryParameterOption =
+ new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter);
+ categoryParameter.getOptions().add(categoryParameterOption);
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ doReturn(aList).when(dataAccessService).getList(anyObject(), anyString(), anyString(), anyObject());
+
+ CategoryParametersResponse response = testSubject.getCategoryParameters(Family.PARAMETER_STANDARDIZATION);
+
+ Assert.assertFalse(response.getCategoryParameters().isEmpty());
+ Assert.assertTrue(response.getCategoryParameters().containsKey(CATEGORY_NAME));
+
+ verify(dataAccessService, times(1))
+ .getList(anyObject(), anyString(), anyString(), anyObject());
}
@Test
- public void testUpdateCategoryParameterOption() throws Exception {
- CategoryParameterServiceImpl testSubject;
- String categoryName = "";
- CategoryParameterOptionRep option = null;
- AddCategoryOptionResponse result;
-
- // default test
- try {
- testSubject = createTestSubject();
- result = testSubject.updateCategoryParameterOption(categoryName, option);
- } catch (
-
- Exception e) {
- }
+ public void updateCategoryParameterOption_domainObjectGetsSavedSuccessfully() {
+ CategoryParameterOptionRep optionRepExisting = new CategoryParameterOptionRep(APP_ID_VID, OPTION_NAME);
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ categoryParameter.getOptions().add(
+ new CategoryParameterOption(APP_ID_VID, UNIQUE_OPTION_NAME, categoryParameter));
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRepExisting);
+
+ verify(dataAccessService, times(1))
+ .saveDomainObject(anyObject(), anyObject());
+ }
+
+ @Test(expectedExceptions = { ForbiddenException.class })
+ public void updateCategoryParameterOption_shouldFailUpdateForbidden() {
+ CategoryParameterOptionRep optionRep = new CategoryParameterOptionRep("1", CATEGORY_NAME);
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, false);
+ categoryParameter.getOptions().add(new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter));
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRep);
+
+ Assert.fail();
+ }
+
+ @Test(expectedExceptions = { UnfoundedCategoryOptionException.class })
+ public void updateCategoryParameterOption_CategoryNotFound() {
+ CategoryParameterOptionRep optionRep = new CategoryParameterOptionRep("SOME_UNRELATED_ID", CATEGORY_NAME);
+
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ categoryParameter.getOptions().add(new CategoryParameterOption(APP_ID_VID, OPTION_NAME, categoryParameter));
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRep);
+
+ Assert.fail();
+ }
+
+ @Test(expectedExceptions = { AlreadyExistOptionNameException.class })
+ public void updateCategoryParameterOption_OptionNameExists() {
+ CategoryParameterOptionRep optionRepExisting = new CategoryParameterOptionRep(APP_ID_VID, OPTION_NAME);
+
+ CategoryParameter categoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ CategoryParameter anotherCategoryParameter = createCategoryParameter(CATEGORY_NAME, true);
+ categoryParameter.getOptions().add(
+ new CategoryParameterOption(APP_ID_VID, UNIQUE_OPTION_NAME, anotherCategoryParameter));
+ categoryParameter.getOptions().add(
+ new CategoryParameterOption(APP_ID_SDC, OPTION_NAME, anotherCategoryParameter));
+ List<CategoryParameter> aList = createCategoryParametersList(categoryParameter);
+
+ doReturn(aList).when(dataAccessService).getList(CategoryParameter.class, QUERY_STRING_FOR_CATEGORY_NAME, null, null);
+
+ AddCategoryOptionResponse result = testSubject.updateCategoryParameterOption(CATEGORY_NAME, optionRepExisting);
+
+ Assert.fail();
+ }
+
+ private CategoryParameter createCategoryParameter(String categoryName, boolean idSupported) {
+ CategoryParameter categoryParameter = new CategoryParameter();
+ categoryParameter.setName(categoryName);
+ categoryParameter.setIdSupported(idSupported);
+ return categoryParameter;
}
} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java
new file mode 100644
index 000000000..d0eec2619
--- /dev/null
+++ b/vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java
@@ -0,0 +1,40 @@
+package org.onap.vid.services;
+
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
+import static org.mockito.MockitoAnnotations.initMocks;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.onap.vid.aai.PombaClientInterface;
+import org.onap.vid.model.PombaInstance.PombaRequest;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+public class PombaServiceImplTest {
+
+ @Mock
+ private PombaClientInterface pombaClientInterface;
+
+ @InjectMocks
+ private PombaServiceImpl testSubject;
+
+ @BeforeClass
+ public void beforeClass() {
+ initMocks(this);
+ }
+
+ @BeforeMethod
+ public void resetMocks() {
+ Mockito.reset(pombaClientInterface);
+ }
+
+ @Test
+ public void testVerify() {
+ PombaRequest pombaRequest = new PombaRequest();
+ testSubject.verify(pombaRequest);
+ verify(pombaClientInterface, times(1))
+ .verify(pombaRequest);
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java b/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java
index 544a799a0..d7db4955c 100644
--- a/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java
+++ b/vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java
@@ -1,25 +1,139 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * VID
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modifications Copyright (C) 2018 Nokia. 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=========================================================
+ */
package org.onap.vid.services;
-import static org.junit.Assert.*;
-import java.util.*;
-import org.junit.Assert;
-import org.junit.Test;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.doThrow;
+import static org.mockito.MockitoAnnotations.initMocks;
+
+import java.util.ArrayList;
+import org.apache.commons.lang.StringUtils;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.Mockito;
+import org.onap.vid.aai.AaiClientInterface;
+import org.onap.vid.aai.AaiResponse;
+import org.onap.vid.aai.ServiceSubscription;
+import org.onap.vid.aai.ServiceSubscriptions;
+import org.onap.vid.aai.Services;
+import org.onap.vid.model.Subscriber;
+import org.onap.vid.model.SubscriberList;
+import org.testng.Assert;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
public class RoleGenaratorServiceImplTest {
- private RoleGenaratorServiceImpl createTestSubject() {
- return new RoleGenaratorServiceImpl();
+ private static final String GLOBAL_CUSTOMER_ID = "997";
+ private static final String SUBSCRIBER_NAME = "name";
+ private static final String SUBSCRIBER_TYPE = "subscriber_type";
+ private static final String RESOURCE_VERSION = "1";
+ private static final String SERVICE_TYPE = "service_type";
+
+ @Mock
+ private AaiClientInterface aaiClientInterface;
+
+ @InjectMocks
+ private RoleGenaratorServiceImpl testSubject;
+
+ @BeforeClass
+ public void beforeClass() {
+ initMocks(this);
+ }
+
+ @BeforeMethod
+ public void resetMocks() {
+ Mockito.reset(aaiClientInterface);
+ }
+
+ @Test
+ public void tenerateRoleScript_firstRun() {
+ boolean firstRun = true;
+
+ Subscriber subscriber = createSubscriber();
+ AaiResponse<SubscriberList> subscribers = createSubscriberListAaiResponse(subscriber);
+ doReturn(subscribers).when(aaiClientInterface).getAllSubscribers();
+
+ ServiceSubscription serviceSubscription = createServiceSubscription();
+ AaiResponse<Services> subscriberResponse = createServicesAaiResponse(serviceSubscription);
+ doReturn(subscriberResponse).when(aaiClientInterface).getSubscriberData(subscriber.globalCustomerId);
+
+ String result = testSubject.generateRoleScript(firstRun);
+ Assert.assertTrue(StringUtils.isNotBlank(result));
}
@Test
- public void testGenerateRoleScript() throws Exception {
- RoleGenaratorServiceImpl testSubject;
- Boolean firstRun = null;
- String result;
-
- // default test
- testSubject = createTestSubject();
- result = testSubject.generateRoleScript(firstRun);
+ public void tenerateRoleScript_notAFirstRun() {
+ boolean firstRun = false;
+
+ Subscriber subscriber = createSubscriber();
+ AaiResponse<SubscriberList> subscribers = createSubscriberListAaiResponse(subscriber);
+ doReturn(subscribers).when(aaiClientInterface).getAllSubscribers();
+
+ ServiceSubscription serviceSubscription = createServiceSubscription();
+ AaiResponse<Services> subscriberResponse = createServicesAaiResponse(serviceSubscription);
+ doReturn(subscriberResponse).when(aaiClientInterface).getSubscriberData(subscriber.globalCustomerId);
+
+ String result = testSubject.generateRoleScript(firstRun);
+ Assert.assertTrue(StringUtils.isNotBlank(result));
+ }
+
+ @Test(expectedExceptions = { Exception.class })
+ public void tenerateRoleScript_errorGettingDataFromAAIClient() {
+ boolean firstRun = false;
+
+ doThrow(new Exception("This is expected.")).when(aaiClientInterface).getAllSubscribers();
+
+ String result = testSubject.generateRoleScript(firstRun);
+ Assert.fail();
+ }
+
+ private ServiceSubscription createServiceSubscription() {
+ ServiceSubscription serviceSubscription = new ServiceSubscription();
+ serviceSubscription.serviceType = SERVICE_TYPE;
+ return serviceSubscription;
+ }
+
+ private AaiResponse<SubscriberList> createSubscriberListAaiResponse(Subscriber subscriber) {
+ AaiResponse<SubscriberList> subscribers = new AaiResponse<>(new SubscriberList(new ArrayList<>()), "", 200);
+ subscribers.getT().customer.add(subscriber);
+ return subscribers;
+ }
+
+ private AaiResponse<Services> createServicesAaiResponse(ServiceSubscription serviceSubscription) {
+ AaiResponse<Services> subscriberResponse = new AaiResponse<>(new Services(), "", 200);
+ subscriberResponse.getT().serviceSubscriptions = new ServiceSubscriptions();
+ subscriberResponse.getT().serviceSubscriptions.serviceSubscription = new ArrayList<>();
+ subscriberResponse.getT().serviceSubscriptions.serviceSubscription.add(serviceSubscription);
+ return subscriberResponse;
+ }
+
+ private Subscriber createSubscriber() {
+ Subscriber subscriber = new Subscriber();
+ subscriber.globalCustomerId = GLOBAL_CUSTOMER_ID;
+ subscriber.subscriberName = SUBSCRIBER_NAME;
+ subscriber.subscriberType = SUBSCRIBER_TYPE;
+ subscriber.resourceVersion = RESOURCE_VERSION;
+ return subscriber;
}
diff --git a/vid-app-common/src/test/resources/WEB-INF/conf/system.properties b/vid-app-common/src/test/resources/WEB-INF/conf/system.properties
index 689f55e58..baf56d36c 100644
--- a/vid-app-common/src/test/resources/WEB-INF/conf/system.properties
+++ b/vid-app-common/src/test/resources/WEB-INF/conf/system.properties
@@ -73,18 +73,12 @@ element_map_icon_path = app/fusionapp/icons/
#aai related properties
#dev server
-#aai.server.url.base=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/
-#aai.server.url=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/v10/
-#aai.oldserver.url.base=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/servers/
-#aai.oldserver.url=https://mtanjv9aaas40.aic.cip.att.com:8443/aai/servers/v3/
#ist servers
-aai.server.url.base=https://aai-ext1.test.att.com:8443/aai/
-#aai.server.url=https://aai-ext1.test.att.com:8443/aai/v12/
+aai.server.url.base=http://localhost:8080/vidSimulator/aai/
aai.server.url=http://localhost:8080/vidSimulator/aai/v12/
#aai.server.url=http://localhost:1080/aai
-#aai.server.url=https://aai-int2.test.att.com:8443/aai/v12/
-aai.vid.username=VID
-aai.vid.passwd.x=OBF:1jm91i0v1jl9
+aai.vid.username=vid@vid.onap.org
+aai.vid.passwd.x=OBF:1fia1ju61l871lfe18xp18xr18xt1lc41l531jrk1fek
@@ -93,12 +87,10 @@ aai.vid.passwd.x=OBF:1jm91i0v1jl9
-aai.oldserver.url.base=https://aai-ext1.test.att.com:8443/aai/servers/
-aai.oldserver.url=https://aai-ext1.test.att.com:8443/aai/servers/v3/
aai.truststore.filename=tomcat_keystore
-aai.truststore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o
+aai.truststore.passwd.x=OBF:1ks51l8d1o3i1pcc1r2r1e211r391kls1pyj1z7u1njf1lx51go21hnj1y0k1mli1sop1k8o1j651vu91mxw1vun1mze1vv11j8x1k5i1sp11mjc1y161hlr1gm41m111nkj1z781pw31kku1r4p1e391r571pbm1o741l4x1ksp
aai.keystore.filename=aai-client-cert.p12
-aai.keystore.passwd.x=OBF:1i9a1u2a1unz1lr61wn51wn11lss1unz1u301i6o
+aai.keystore.passwd.x=OBF:1ks51l8d1o3i1pcc1r2r1e211r391kls1pyj1z7u1njf1lx51go21hnj1y0k1mli1sop1k8o1j651vu91mxw1vun1mze1vv11j8x1k5i1sp11mjc1y161hlr1gm41m111nkj1z781pw31kku1r4p1e391r571pbm1o741l4x1ksp
aai.use.client.cert=false
aai.vnf.provstatus=PREPROV,NVTPROV,PROV,CAPPED
@@ -151,10 +143,12 @@ mso.max.polls=10
mso.user.name=infraportal
mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz
mso.restapi.svc.instance=/serviceInstances/v5
+mso.restapi.svc.instance.deleteAndUnassign=/serviceInstantiation/v5/serviceInstances
mso.restapi.vnf.instance=/serviceInstances/v5/<service_instance_id>/vnfs
mso.restapi.vnf.changemanagement.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>
mso.restapi.network.instance=/serviceInstances/v5/<service_instance_id>/networks
-mso.restapi.vf.module.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules
+mso.restapi.vf.module.instance=/serviceInstances/v7/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules
+mso.restapi.vf.module.scaleout=/serviceInstantiation/v7/serviceInstances/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut
mso.restapi.volume.group.instance=/serviceInstances/v5/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups
mso.restapi.get.orc.req=/orchestrationRequests/v5
mso.restapi.get.orc.reqs=/orchestrationRequests/v5?
@@ -166,7 +160,7 @@ vid.truststore.filename=/opt/app/vid/etc/vid_keystore.jks
mso.dme2.client.timeout=30000
mso.dme2.client.read.timeout=120000
-scheduler.server.url=http://mtanjv9sdlg10.aic.cip.att.com:8989/scheduler
+scheduler.server.url=
scheduler.create.new.vnf.change.instance=/v1/ChangeManagement/schedules/
scheduler.get.time.slots=/v1/ChangeManagement/schedules/
scheduler.get.schedules=/v1/ChangeManagement/schedules/scheduleDetails/
diff --git a/vid-app-common/src/test/resources/git.properties b/vid-app-common/src/test/resources/git.properties
new file mode 100644
index 000000000..6db5795a5
--- /dev/null
+++ b/vid-app-common/src/test/resources/git.properties
@@ -0,0 +1,3 @@
+git.commit.id=123
+git.commit.message.short=Test short commit message
+git.commit.time=1999-09-12T13\:48\:55+0200 \ No newline at end of file
diff --git a/vid-app-common/src/test/resources/mso.properties b/vid-app-common/src/test/resources/mso.properties
index fcd20bd7a..d021ffde1 100644
--- a/vid-app-common/src/test/resources/mso.properties
+++ b/vid-app-common/src/test/resources/mso.properties
@@ -6,7 +6,7 @@ mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz
mso.restapi.svc.instance=/serviceInstances/v3
mso.restapi.vnf.instance=/serviceInstances/v3/<service_instance_id>/vnfs
mso.restapi.network.instance=/serviceInstances/v3/<service_instance_id>/networks
-mso.restapi.vf.module.instance=/serviceInstances/v3/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules
+mso.restapi.vf.module.instance=/serviceInstantiation/v7/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut
mso.restapi.volume.group.instance=/serviceInstances/v3/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups
mso.restapi.configurations=/serviceInstances/v6/<service_instance_id>/configurations
mso.restapi.get.orc.req=/orchestrationRequests/v3
diff --git a/vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json b/vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json
new file mode 100644
index 000000000..d37f6af1f
--- /dev/null
+++ b/vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json
@@ -0,0 +1,174 @@
+{
+ "requestList": [
+ {
+ "request": {
+ "requestId": "799d7380-60fe-4b64-9d99-82f6ab09163b",
+ "startTime": "Fri, 12 Oct 2018 08:53:07 GMT",
+ "requestScope": "vfModule",
+ "requestType": "scaleOut",
+ "requestDetails": {
+ "modelInfo": {
+ "modelCustomizationName": "WsSp..base_ws..module-0",
+ "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+ "modelType": "vfModule",
+ "modelName": "WsSp..base_ws..module-0",
+ "modelVersion": "1",
+ "modelCustomizationUuid": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+ "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0",
+ "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+ "modelUuid": "53f52586-236b-4d52-a94c-990883e054f0",
+ "modelInvariantUuid": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+ "modelInstanceName": "WsSp..base_ws..module-0"
+ },
+ "requestInfo": {
+ "source": "VID",
+ "instanceName": "ws-test-0310-8_NaN",
+ "suppressRollback": false,
+ "requestorId": "demo"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "modelInfo": {
+ "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b",
+ "modelType": "service",
+ "modelName": "ws-service",
+ "modelVersion": "1.0",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelInvariantUuid": "c9817f08-07b2-458b-a02f-cd5407ee7a7b"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "modelInfo": {
+ "modelCustomizationName": "ws-sp 0",
+ "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelType": "vnf",
+ "modelName": "ws-sp",
+ "modelVersion": "1.0",
+ "modelCustomizationUuid": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelInvariantUuid": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelInstanceName": "ws-sp 0"
+ }
+ }
+ }
+ ],
+ "cloudConfiguration": {
+ "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+ "lcpCloudRegionId": "RegionOne"
+ },
+ "requestParameters": {},
+ "configurationParameters": [
+ {
+ "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]",
+ "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]"
+ }
+ ]
+ },
+ "instanceReferences": {
+ "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "vfModuleInstanceName": "ws-test-0310-8_NaN",
+ "requestorId": "demo"
+ },
+ "requestStatus": {
+ "requestState": "FAILED",
+ "statusMessage": "No valid vfModuleCustomization is specified",
+ "percentProgress": 100,
+ "finishTime": "Fri, 12 Oct 2018 08:53:07 GMT"
+ }
+ }
+ },
+ {
+ "request": {
+ "requestId": "44b534c7-57b5-42ec-85bb-219167021b34",
+ "startTime": "Fri, 12 Oct 2018 09:08:01 GMT",
+ "requestScope": "vfModule",
+ "requestType": "scaleOut",
+ "requestDetails": {
+ "modelInfo": {
+ "modelCustomizationName": "WsSp..base_ws..module-0",
+ "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+ "modelType": "vfModule",
+ "modelName": "WsSp..base_ws..module-0",
+ "modelVersion": "1",
+ "modelCustomizationUuid": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+ "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0",
+ "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+ "modelUuid": "53f52586-236b-4d52-a94c-990883e054f0",
+ "modelInvariantUuid": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+ "modelInstanceName": "WsSp..base_ws..module-0"
+ },
+ "requestInfo": {
+ "source": "VID",
+ "instanceName": "ws-test-0310-8_NaN",
+ "suppressRollback": false,
+ "requestorId": "demo"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "modelInfo": {
+ "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b",
+ "modelType": "service",
+ "modelName": "ws-service",
+ "modelVersion": "1.0",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelInvariantUuid": "c9817f08-07b2-458b-a02f-cd5407ee7a7b"
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "modelInfo": {
+ "modelCustomizationName": "ws-sp 0",
+ "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelType": "vnf",
+ "modelName": "ws-sp",
+ "modelVersion": "1.0",
+ "modelCustomizationUuid": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelInvariantUuid": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelInstanceName": "ws-sp 0"
+ }
+ }
+ }
+ ],
+ "cloudConfiguration": {
+ "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+ "lcpCloudRegionId": "RegionOne"
+ },
+ "requestParameters": {},
+ "configurationParameters": [
+ {
+ "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]",
+ "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]"
+ }
+ ]
+ },
+ "instanceReferences": {
+ "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "vfModuleInstanceId": "scaleOut",
+ "vfModuleInstanceName": "ws-test-0310-8_NaN",
+ "requestorId": "demo"
+ },
+ "requestStatus": {
+ "requestState": "FAILED"
+ }
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json b/vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json
new file mode 100644
index 000000000..9dbdfb043
--- /dev/null
+++ b/vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json
@@ -0,0 +1,108 @@
+{
+ "requestList": [
+ {
+ "request": {
+ "requestId": "f8c813a2-b22b-4e3d-9be0-8e2d16b1add3",
+ "startTime": "Wed, 03 Oct 2018 13:13:04 GMT",
+ "requestScope": "vnf",
+ "requestType": "createInstance",
+ "requestDetails": {
+ "modelInfo": {
+ "modelCustomizationName": "ws-sp 0",
+ "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelType": "vnf",
+ "modelName": "ws-sp",
+ "modelVersion": "1.0",
+ "modelCustomizationUuid": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "modelUuid": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelInvariantUuid": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelInstanceName": "ws-sp 0"
+ },
+ "requestInfo": {
+ "productFamilyId": "61cc3239-5c2e-4762-a281-7422a2e54d5a",
+ "source": "VID",
+ "instanceName": "ws-test-0310-8",
+ "suppressRollback": false,
+ "requestorId": "demo"
+ },
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "modelInfo": {
+ "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b",
+ "modelType": "service",
+ "modelName": "ws-service",
+ "modelVersion": "1.0",
+ "modelVersionId": "cd3fbd06-6bc8-43a4-b803-933fc2e3cdf7",
+ "modelUuid": "cd3fbd06-6bc8-43a4-b803-933fc2e3cdf7",
+ "modelInvariantUuid": "c9817f08-07b2-458b-a02f-cd5407ee7a7b"
+ }
+ }
+ }
+ ],
+ "cloudConfiguration": {
+ "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+ "lcpCloudRegionId": "RegionOne"
+ },
+ "requestParameters": {
+ "testApi": "VNF_API"
+ },
+ "platform": {
+ "platformName": "Demo"
+ },
+ "lineOfBusiness": {
+ "lineOfBusinessName": "Demo"
+ }
+ },
+ "instanceReferences": {
+ "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "vnfInstanceName": "ws-test-0310-8",
+ "requestorId": "demo"
+ },
+ "requestStatus": {
+ "requestState": "COMPLETE",
+ "statusMessage": "Vnf has been created successfully.",
+ "percentProgress": 100,
+ "finishTime": "Wed, 03 Oct 2018 13:13:09 GMT"
+ }
+ }
+ },
+ {
+ "request": {
+ "requestId": "3447ba35-015d-4d72-9345-d89b1e35b2d6",
+ "startTime": "Thu, 04 Oct 2018 10:35:17 GMT",
+ "requestScope": "vnf",
+ "requestType": "inPlaceSoftwareUpdate",
+ "requestDetails": {
+ "requestInfo": {
+ "source": "VID",
+ "suppressRollback": false,
+ "requestorId": "demo"
+ },
+ "cloudConfiguration": {
+ "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+ "lcpCloudRegionId": "RegionOne"
+ },
+ "requestParameters": {
+ "payload": "{\"existing_software_version\":\"0.7\",\"new_software_version\":\"1.0\",\"operations_timeout\":\"10\"}"
+ }
+ },
+ "instanceReferences": {
+ "serviceInstanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "vnfInstanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "requestorId": "demo"
+ },
+ "requestStatus": {
+ "requestState": "FAILED",
+ "statusMessage": "Cloud Region with cloudRegionId RegionOne does not exist in A&AI",
+ "percentProgress": 100,
+ "finishTime": "Thu, 04 Oct 2018 10:35:21 GMT"
+ }
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json
new file mode 100644
index 000000000..c509c6247
--- /dev/null
+++ b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json
@@ -0,0 +1,67 @@
+{
+ "vnfName":"test",
+ "vnfInstanceId":"123",
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelName": "ws-service",
+ "modelVersion": "1.0",
+ "additionalProperties": {}
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "modelInfo": {
+ "modelType": "vnf",
+ "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelName": "ws-sp",
+ "modelVersion": "1.0",
+ "modelCustomizationName": "ws-sp 0",
+ "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "additionalProperties": {}
+ }
+ }
+ }
+ ],
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "RegionOne",
+ "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+ "additionalProperties": {}
+ },
+ "modelInfo": {
+ "modelCustomizationName": "WsSp..base_ws..module-0",
+ "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+ "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+ "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0",
+ "modelName": "WsSp..base_ws..module-0",
+ "modelNameVersionId": null,
+ "modelType": "vfModule",
+ "modelVersion": "1",
+ "additionalProperties": {}
+ },
+ "requestInfo": {
+ "instanceName": "ws-test-0310-8_NaN",
+ "source": "VID",
+ "suppressRollback": false,
+ "requestorId": "demo",
+ "additionalProperties": {}
+ },
+ "requestParameters": {
+ "additionalProperties": {}
+ },
+ "configurationParameters": [
+ {
+ "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]",
+ "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]"
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json
new file mode 100644
index 000000000..ddbebac95
--- /dev/null
+++ b/vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json
@@ -0,0 +1,66 @@
+{
+ "requestDetails": {
+ "relatedInstanceList": [
+ {
+ "relatedInstance": {
+ "instanceId": "fd84f066-ea75-4b23-acd0-3cf3fce7a99b",
+ "modelInfo": {
+ "modelType": "service",
+ "modelInvariantId": "c9817f08-07b2-458b-a02f-cd5407ee7a7b",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelName": "ws-service",
+ "modelVersion": "1.0",
+ "additionalProperties": {}
+ }
+ }
+ },
+ {
+ "relatedInstance": {
+ "instanceId": "980fe98e-47f8-4164-862d-4ebb026cec75",
+ "modelInfo": {
+ "modelType": "vnf",
+ "modelInvariantId": "734f0952-6678-44e7-8918-f9aa4694b687",
+ "modelVersionId": "0e0bb964-e687-4439-9a9e-de9cd1ff5367",
+ "modelName": "ws-sp",
+ "modelVersion": "1.0",
+ "modelCustomizationName": "ws-sp 0",
+ "modelCustomizationId": "5815868c-35f8-4c5a-b899-e6eb49f52986",
+ "additionalProperties": {}
+ }
+ }
+ }
+ ],
+ "cloudConfiguration": {
+ "lcpCloudRegionId": "RegionOne",
+ "tenantId": "1e097c6713e74fd7ac8e4295e605ee1e",
+ "additionalProperties": {}
+ },
+ "modelInfo": {
+ "modelCustomizationName": "WsSp..base_ws..module-0",
+ "modelCustomizationId": "bfcc8f57-7b56-4be8-a8f1-e44262c83318",
+ "modelInvariantId": "763b1172-b5f5-4062-9d79-2459710fa0bc",
+ "modelVersionId": "53f52586-236b-4d52-a94c-990883e054f0",
+ "modelName": "WsSp..base_ws..module-0",
+ "modelNameVersionId": null,
+ "modelType": "vfModule",
+ "modelVersion": "1",
+ "additionalProperties": {}
+ },
+ "requestInfo": {
+ "instanceName": "ws-test-0310-8_NaN",
+ "source": "VID",
+ "suppressRollback": false,
+ "requestorId": "demo",
+ "additionalProperties": {}
+ },
+ "requestParameters": {
+ "additionalProperties": {}
+ },
+ "configurationParameters": [
+ {
+ "availability-zone": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]",
+ "xtz-123": "$.vnf-topology.vnf-resource-assignments.availability-zones.availability-zone[0]"
+ }
+ ]
+ }
+} \ No newline at end of file
diff --git a/vid-app-common/version.properties b/vid-app-common/version.properties
index 02144f0fe..9723960f3 100755
--- a/vid-app-common/version.properties
+++ b/vid-app-common/version.properties
@@ -2,7 +2,7 @@
# Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )
# because they are used in Jenkins, whose plug-in doesn't support
-major=3
+major=4
minor=0
patch=0
diff --git a/vid-ext-services-simulator/src/main/resources/preset_registration/changeManagement/get_sdc_catalog_services_83d587e1.json b/vid-ext-services-simulator/src/main/resources/preset_registration/changeManagement/get_sdc_catalog_services_83d587e1.json
new file mode 100644
index 000000000..0bc179c64
--- /dev/null
+++ b/vid-ext-services-simulator/src/main/resources/preset_registration/changeManagement/get_sdc_catalog_services_83d587e1.json
@@ -0,0 +1,38 @@
+[
+ {
+ "simulatorRequest": {
+ "method": "GET",
+ "path": "/sdc/v1/catalog/services/83d587e1-742d-4cb0-b087-3963b012dfe3/toscaModel"
+ },
+ "simulatorResponse": {
+ "responseCode": 200,
+ "file": "csar15782222_instantiationTypeMacroWithPnf.zip"
+ }
+ },
+ {
+ "simulatorRequest": {
+ "method": "GET",
+ "path": "/sdc/v1/catalog/services/83d587e1-742d-4cb0-b087-3963b012dfe3/metadata"
+ },
+ "simulatorResponse": {
+ "responseCode": 200,
+ "responseHeaders": {
+ "Content-Type": "application/json"
+ },
+ "body": {
+ "uuid": "83d587e1-742d-4cb0-b087-3963b012dfe3",
+ "invariantUUID": "any-id",
+ "name": "test-pnf",
+ "version": "1.0",
+ "toscaModelURL": "./csar15782222_instantiationTypeMacroWithPnf.zip",
+ "category": "Mobility",
+ "lifecycleState": "CERTIFIED",
+ "lastUpdaterUserId": "rg276b",
+ "lastUpdaterFullName": null,
+ "distributionStatus": "DISTRIBUTED",
+ "artifacts": null,
+ "resources": null
+ }
+ }
+ }
+] \ No newline at end of file
diff --git a/vid-ext-services-simulator/src/main/resources/preset_registration/general/ecompportal_getSessionSlotCheckInterval.json b/vid-ext-services-simulator/src/main/resources/preset_registration/general/ecompportal_getSessionSlotCheckInterval.json
index a43092ef9..cc7f76c5f 100644
--- a/vid-ext-services-simulator/src/main/resources/preset_registration/general/ecompportal_getSessionSlotCheckInterval.json
+++ b/vid-ext-services-simulator/src/main/resources/preset_registration/general/ecompportal_getSessionSlotCheckInterval.json
@@ -2,7 +2,7 @@
{
"simulatorRequest": {
"method": "GET",
- "path": "/ecompportal_att/auxapi//getSessionSlotCheckInterval"
+ "path": "/ONAPPORTAL/auxapi/v[0-9]+/getSessionSlotCheckInterval"
},
"simulatorResponse": {
"responseCode": 200,
@@ -12,7 +12,7 @@
{
"simulatorRequest": {
"method": "POST",
- "path": "/ecompportal_att/auxapi//extendSessionTimeOuts"
+ "path": "/ONAPPORTAL/auxapi//extendSessionTimeOuts"
},
"simulatorResponse": {
"responseCode": 200,
@@ -22,7 +22,7 @@
{
"simulatorRequest": {
"method": "GET",
- "path": "/ecompportal_att/auxapi/context/get_user"
+ "path": "/ONAPPORTAL/auxapi/context/get_user"
},
"simulatorResponse": {
"responseCode": 200,
diff --git a/vid-ext-services-simulator/src/main/resources/preset_registration/service-design-and-creation.json b/vid-ext-services-simulator/src/main/resources/preset_registration/service-design-and-creation.json
index 679c5d771..04b1f995a 100644
--- a/vid-ext-services-simulator/src/main/resources/preset_registration/service-design-and-creation.json
+++ b/vid-ext-services-simulator/src/main/resources/preset_registration/service-design-and-creation.json
@@ -428,6 +428,24 @@
]
}
}
+ },
+ {
+ "model": {
+ "model-invariant-id": "any-id",
+ "model-type": "resource",
+ "resource-version": "10001",
+ "model-vers": {
+ "model-ver": [
+ {
+ "model-version-id": "83d587e1-742d-4cb0-b087-3963b012dfe3",
+ "model-name": "pnf-test",
+ "model-version": "1.0",
+ "model-description": "Should ask about CorrelationId",
+ "resource-version": "200021"
+ }
+ ]
+ }
+ }
}
]
}