Merge "Nodes query rewritten to generic rest client"
authorOfir Sonsino <ofir.sonsino@intl.att.com>
Sun, 11 Nov 2018 13:37:32 +0000 (13:37 +0000)
committerGerrit Code Review <gerrit@onap.org>
Sun, 11 Nov 2018 13:37:32 +0000 (13:37 +0000)
90 files changed:
deliveries/pom.xml
deliveries/src/main/docker/docker-files/Dockerfile
deliveries/src/main/docker/docker-files/conf.d/logback.xml [moved from epsdk-app-onap/src/main/resources/logback.xml with 97% similarity]
deliveries/src/main/docker/docker-files/conf.d/logback_template.xml [moved from epsdk-app-onap/src/main/resources/logback_template.xml with 97% similarity]
deliveries/src/main/scripts/localize.sh
deliveries/src/main/scripts/localize_asdc.sh
deliveries/src/main/scripts/localize_cache.sh
deliveries/src/main/scripts/localize_log4j.sh
deliveries/src/main/scripts/localize_logback.sh
deliveries/src/main/scripts/localize_portal.sh
deliveries/src/main/scripts/localize_quartz.sh
deliveries/src/main/scripts/localize_system.sh
deliveries/src/main/scripts/localize_war.sh
docs/installation.rst
docs/offeredapis.rst
docs/release-notes.rst
epsdk-app-onap/pom.xml
epsdk-app-onap/src/main/resources/portal.properties
epsdk-app-onap/src/main/resources/portal_template.properties
epsdk-app-onap/src/main/resources/vid-data.sql
epsdk-app-onap/src/main/resources/vid-schema.sql
epsdk-app-onap/src/main/webapp/WEB-INF/conf/system.properties
epsdk-app-onap/src/main/webapp/WEB-INF/conf/system_template.properties
epsdk-app-onap/version.properties
pom.xml
version.properties
vid-app-common/pom.xml
vid-app-common/src/main/java/org/onap/vid/aai/AaiClient.java
vid-app-common/src/main/java/org/onap/vid/asdc/beans/ServiceBuilder.java [new file with mode: 0644]
vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionResponse.java
vid-app-common/src/main/java/org/onap/vid/category/AddCategoryOptionsRequest.java
vid-app-common/src/main/java/org/onap/vid/category/CategoryParameterOptionRep.java
vid-app-common/src/main/java/org/onap/vid/client/SyncRestClient.java
vid-app-common/src/main/java/org/onap/vid/client/SyncRestClientInterface.java
vid-app-common/src/main/java/org/onap/vid/controllers/HealthCheckController.java
vid-app-common/src/main/java/org/onap/vid/controllers/HealthStatus.java [new file with mode: 0644]
vid-app-common/src/main/java/org/onap/vid/controllers/MaintenanceController.java
vid-app-common/src/main/java/org/onap/vid/controllers/VidController.java
vid-app-common/src/main/java/org/onap/vid/dao/ConnectionFactory.java [new file with mode: 0644]
vid-app-common/src/main/java/org/onap/vid/dao/FnAppDoaImpl.java
vid-app-common/src/main/java/org/onap/vid/job/command/InProgressStatusCommand.java
vid-app-common/src/main/java/org/onap/vid/job/command/ServiceInstantiationCommand.java
vid-app-common/src/main/java/org/onap/vid/job/impl/JobAdapterImpl.java
vid-app-common/src/main/java/org/onap/vid/model/CategoryParameter.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogic.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoBusinessLogicImpl.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoInterface.java
vid-app-common/src/main/java/org/onap/vid/mso/MsoProperties.java
vid-app-common/src/main/java/org/onap/vid/mso/rest/MsoRestClientNew.java
vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetails.java
vid-app-common/src/main/java/org/onap/vid/mso/rest/RequestDetailsWrapper.java
vid-app-common/src/main/java/org/onap/vid/roles/RoleProvider.java
vid-app-common/src/main/java/org/onap/vid/services/AuditServiceImpl.java
vid-app-common/src/main/java/org/onap/vid/services/CategoryParameterServiceImpl.java
vid-app-common/src/main/java/org/onap/vid/services/ChangeManagementServiceImpl.java
vid-app-common/src/main/java/org/onap/vid/services/PombaServiceImpl.java
vid-app-common/src/main/java/org/onap/vid/services/VidServiceImpl.java
vid-app-common/src/main/webapp/app/vid/scripts/controller/ServiceModelController.js
vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.controller.js
vid-app-common/src/main/webapp/app/vid/scripts/modals/new-change-management/new-change-management.html
vid-app-common/src/main/webapp/app/vid/scripts/services/asdcService.js
vid-app-common/src/test/java/org/onap/vid/aai/AaiClientTest.java
vid-app-common/src/test/java/org/onap/vid/controllers/HealthCheckControllerTest.java
vid-app-common/src/test/java/org/onap/vid/controllers/MaintenanceControllerTest.java
vid-app-common/src/test/java/org/onap/vid/controllers/VidControllerTest.java
vid-app-common/src/test/java/org/onap/vid/dao/FnAppDoaImplTest.java
vid-app-common/src/test/java/org/onap/vid/job/command/InProgressStatusCommandTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/job/command/ServiceInstantiationCommandTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/job/impl/JobAdapterImplTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/job/impl/JobSchedulerInitializerTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicImplTest.java
vid-app-common/src/test/java/org/onap/vid/mso/MsoBusinessLogicTest.java [deleted file]
vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientNewTest.java
vid-app-common/src/test/java/org/onap/vid/mso/rest/MsoRestClientTestUtil.java
vid-app-common/src/test/java/org/onap/vid/services/AuditServiceImplTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/services/BulkInstantiationServiceImplTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/services/CategoryParameterServiceImplTest.java
vid-app-common/src/test/java/org/onap/vid/services/PombaServiceImplTest.java [new file with mode: 0644]
vid-app-common/src/test/java/org/onap/vid/services/RoleGenaratorServiceImplTest.java
vid-app-common/src/test/resources/WEB-INF/conf/system.properties
vid-app-common/src/test/resources/git.properties [new file with mode: 0644]
vid-app-common/src/test/resources/mso.properties
vid-app-common/src/test/resources/payload_jsons/mso_action_scaleout_sample_response.json [new file with mode: 0644]
vid-app-common/src/test/resources/payload_jsons/mso_model_info_sample_response.json [new file with mode: 0644]
vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayload.json [new file with mode: 0644]
vid-app-common/src/test/resources/payload_jsons/scaleOutVfModulePayloadToMso.json [new file with mode: 0644]
vid-app-common/version.properties
vid-ext-services-simulator/src/main/resources/preset_registration/changeManagement/get_sdc_catalog_services_83d587e1.json [new file with mode: 0644]
vid-ext-services-simulator/src/main/resources/preset_registration/general/ecompportal_getSessionSlotCheckInterval.json
vid-ext-services-simulator/src/main/resources/preset_registration/service-design-and-creation.json

index 2dad0d4..e366974 100755 (executable)
@@ -62,7 +62,7 @@
                                                                        <descriptor>assembly/assembly-for-plugin.xml</descriptor>\r
                                                                </assembly>\r
                                                                <tags>\r
-                                                                 <tag>3.0-STAGING-latest</tag>\r
+                                                                 <tag>4.0-STAGING-latest</tag>\r
                                                                  <tag>latest</tag>\r
                                                                </tags>\r
                                                                    \r
index ddaa861..4b04e22 100755 (executable)
@@ -1,13 +1,14 @@
 FROM tomcat:8.0-jre8\r
+\r
 # add vim and uncomment alias to speedup troubleshooting purpose\r
 RUN apt-get update && apt-get install -y \\r
        openjdk-8-jdk vim net-tools\r
 \r
-RUN sed -i 's/# alias/alias/g' /root/.bashrc\r
+COPY conf.d/ /etc/onap/vid/conf.d/\r
 \r
-RUN mkdir -p ${ROOT_DIR}/etc\r
+RUN sed -i 's/# alias/alias/g' /root/.bashrc\r
 \r
-ENV JAVA_OPTS="-Xmx1536m -Xms1536m"\r
+ENV JAVA_OPTS="-Xmx1536m -Xms1536m -Dlogback.configurationFile=/etc/onap/vid/conf.d/logback.xml"\r
 \r
 ENV ROOT_DIR /opt/app/vid\r
 \r
@@ -29,7 +30,7 @@ ENV VID_AAI_HOST aai.api.simpledemo.onap.org
 ENV VID_AAI_PORT 8443\r
 ENV VID_APP_DISPLAY_NAME VID\r
 ENV VID_ECOMP_SHARED_CONTEXT_REST_URL https://portal.api.simpledemo.onap.org:8080/onapportal/context\r
-ENV VID_MSO_SERVER_URL http://vm1.mso.simpledemo.onap.org:8080\r
+ENV VID_MSO_SERVER_URL http://vm1.mso.simpledemo.onap.org:8080/onap/so/infra\r
 ENV VID_MYLOGIN_FEED_DIRECTORY /tmp/MyLogins\r
 ENV VID_MSO_USER InfraPortalClient\r
 ENV VID_MSO_PASS OBF:1ih71i271vny1yf41ymf1ylz1yf21vn41hzj1icz\r
@@ -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\r
 ENV VID_ECOMP_REST_URL http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/auxapi\r
 ENV VID_ECOMP_SHARED_CONTEXT_REST_URL http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/context\r
+ENV VID_ROLE_ACCESS_CENTRALIZED local\r
 ENV VID_CONTACT_US_LINK https://todo_contact_us_link.com\r
 \r
 ENV VID_DECRYPTION_KEY AGLDdG4D04BKm2IxIWEr8o=\r
@@ -86,4 +88,4 @@ ADD maven/artifacts/vid.war /tmp/vid/stage/
 \r
 RUN chmod +x /tmp/vid/localize.sh\r
 \r
-CMD ["/tmp/vid/localize.sh"]\r
+CMD ["/tmp/vid/localize.sh"]
\ No newline at end of file
-<?xml version="1.0" encoding="UTF-8"?>\r
-<!--\r
-  ============LICENSE_START==========================================\r
-  ONAP Portal SDK\r
-  ===================================================================\r
-  Copyright © 2017 AT&T Intellectual Property. All rights reserved.\r
-  ===================================================================\r
\r
-  Unless otherwise specified, all software contained herein is licensed\r
-  under the Apache License, Version 2.0 (the “License”);\r
-  you may not use this software except in compliance with the License.\r
-  You may obtain a copy of the License at\r
\r
-              http://www.apache.org/licenses/LICENSE-2.0\r
\r
-  Unless required by applicable law or agreed to in writing, software\r
-  distributed under the License is distributed on an "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-  See the License for the specific language governing permissions and\r
-  limitations under the License.\r
\r
-  Unless otherwise specified, all documentation contained herein is licensed\r
-  under the Creative Commons License, Attribution 4.0 Intl. (the “License”);\r
-  you may not use this documentation except in compliance with the License.\r
-  You may obtain a copy of the License at\r
\r
-              https://creativecommons.org/licenses/by/4.0/\r
\r
-  Unless required by applicable law or agreed to in writing, documentation\r
-  distributed under the License is distributed on an "AS IS" BASIS,\r
-  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
-  See the License for the specific language governing permissions and\r
-  limitations under the License.\r
\r
-  ============LICENSE_END============================================\r
\r
-  ECOMP is a trademark and service mark of AT&T Intellectual Property.\r
-  -->\r
-<configuration scan="true" scanPeriod="3 seconds" debug="true">\r
-  <!-- \r
-  Logback files for the ONAP Portal SDK Application "epsdk-app-os"\r
-  are created in directory ${catalina.base}/logs/epsdk_app_os;\r
-  e.g., apache-tomcat-8.0.35/logs/epsdk_app_os/application.log  \r
-  -->\r
-  <!--<jmxConfigurator /> -->\r
-\r
-  <!--  specify the component name -->\r
-  <property name="componentName" value="ep_sdk_app"></property>\r
-  \r
-  <!--  specify the base path of the log directory -->\r
-  <property name="logDirPrefix" value="${catalina.base}/logs"></property>\r
-  \r
-  <!-- The directories where logs are written -->\r
-  <property name="logDirectory" value="${logDirPrefix}/${componentName}" />\r
-  <!-- Can easily relocate debug logs by modifying this path. -->\r
-  <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />\r
-  \r
-  <!--  log file names -->\r
-  <property name="generalLogName" value="application" />\r
-  <property name="errorLogName" value="error" />\r
-  <property name="metricsLogName" value="metrics" />\r
-  <property name="auditLogName" value="audit" />\r
-  <property name="debugLogName" value="debug" />\r
-  <!--\r
-  These loggers are not used in code (yet). \r
-  <property name="securityLogName" value="security" />\r
-  <property name="policyLogName" value="policy" />\r
-  <property name="performanceLogName" value="performance" />\r
-  <property name="serverLogName" value="server" />\r
-   -->\r
-  \r
-  <!-- 1610 Logging Fields Format Revisions --> \r
-  <property name="auditLoggerPattern"\r
-       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" />\r
-\r
-  <property name="metricsLoggerPattern"\r
-       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" />\r
-\r
-  <property name="errorLoggerPattern"\r
-       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" />\r
-\r
-  <property name="defaultLoggerPattern"\r
-       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%X{ClassName}| %msg%n" />\r
-\r
-  <!-- use %class so library logging calls yield their class name -->\r
-  <property name="applicationLoggerPattern"\r
-       value="%date{yyyy-MM-dd'T'HH:mm:ss.SSSXXX}|%X{RequestId}|%thread|%class{36}| %msg%n" />\r
-\r
-  <!-- Example evaluator filter applied against console appender -->\r
-  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">\r
-    <encoder>\r
-      <pattern>${defaultLoggerPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-\r
-  <!-- ============================================================================ -->\r
-  <!-- EELF Appenders -->\r
-  <!-- ============================================================================ -->\r
-\r
-  <!-- The EELFAppender is used to record events to the general application \r
-    log -->\r
-    \r
-    \r
-  <appender name="EELF"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${generalLogName}.log</file>\r
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> \r
-      <!-- daily rollover --> \r
-      <fileNamePattern>${logDirectory}/${generalLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> \r
\r
-      <!-- keep 30 days' worth of history capped at 3GB total size --> \r
-      <maxHistory>30</maxHistory> \r
-      <totalSizeCap>3GB</totalSizeCap> \r
\r
-    </rollingPolicy>\r
-    <encoder>\r
-      <pattern>${applicationLoggerPattern}</pattern>\r
-    </encoder>\r
-    <filter class="org.onap.portalapp.util.CustomLoggingFilter" />\r
-  </appender>\r
-  \r
-  <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <!-- Class name is part of caller data -->\r
-    <includeCallerData>true</includeCallerData>\r
-    <appender-ref ref="EELF" />\r
-  </appender>\r
-\r
-  <!-- EELF Security Appender. This appender is used to record security events \r
-    to the security log file. Security events are separate from other loggers \r
-    in EELF so that security log records can be captured and managed in a secure \r
-    way separate from the other logs. This appender is set to never discard any \r
-    events. -->\r
-  <!--     \r
-  <appender name="EELFSecurity"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${securityLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <discardingThreshold>0</discardingThreshold>\r
-    <appender-ref ref="EELFSecurity" />\r
-  </appender>\r
-   -->\r
-   \r
-  <!-- EELF Performance Appender. This appender is used to record performance \r
-    records. -->\r
-  <!--\r
-  <appender name="EELFPerformance"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${performanceLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <outputPatternAsHeader>true</outputPatternAsHeader>\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFPerformance" />\r
-  </appender>\r
-  -->\r
-\r
-  <!-- EELF Server Appender. This appender is used to record Server related \r
-    logging events. The Server logger and appender are specializations of the \r
-    EELF application root logger and appender. This can be used to segregate Server \r
-    events from other components, or it can be eliminated to record these events \r
-    as part of the application root log. -->\r
-  <!--\r
-  <appender name="EELFServer"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${serverLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-        <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFServer" />\r
-  </appender>\r
-   -->\r
-  \r
-  <!-- EELF Policy Appender. This appender is used to record Policy engine \r
-    related logging events. The Policy logger and appender are specializations \r
-    of the EELF application root logger and appender. This can be used to segregate \r
-    Policy engine events from other components, or it can be eliminated to record \r
-    these events as part of the application root log. -->\r
-  <!--\r
-  <appender name="EELFPolicy"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${policyLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-        <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFPolicy" />\r
-  </appender>\r
-  -->\r
-  \r
-  <!-- EELF Audit Appender. This appender is used to record audit engine \r
-    related logging events. The audit logger and appender are specializations \r
-    of the EELF application root logger and appender. This can be used to segregate \r
-    Policy engine events from other components, or it can be eliminated to record \r
-    these events as part of the application root log. -->\r
-    \r
-  <appender name="EELFAudit"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${auditLogName}.log</file>\r
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> \r
-      <!-- daily rollover --> \r
-      <fileNamePattern>${logDirectory}/${auditLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> \r
\r
-      <!-- keep 30 days' worth of history capped at 3GB total size --> \r
-      <maxHistory>30</maxHistory> \r
-      <totalSizeCap>3GB</totalSizeCap> \r
\r
-    </rollingPolicy>\r
-    <encoder>\r
-         <pattern>${auditLoggerPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFAudit" />\r
-  </appender>\r
-\r
-  <appender name="EELFMetrics"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${metricsLogName}.log</file>\r
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> \r
-      <!-- daily rollover --> \r
-      <fileNamePattern>${logDirectory}/${metricsLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> \r
\r
-      <!-- keep 30 days' worth of history capped at 3GB total size --> \r
-      <maxHistory>30</maxHistory> \r
-      <totalSizeCap>3GB</totalSizeCap> \r
\r
-    </rollingPolicy>\r
-    <encoder>\r
-      <pattern>${metricsLoggerPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  \r
-  <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFMetrics"/>\r
-  </appender>\r
-   \r
-  <appender name="EELFError"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${errorLogName}.log</file>\r
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> \r
-      <!-- daily rollover --> \r
-      <fileNamePattern>${logDirectory}/${errorLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> \r
\r
-      <!-- keep 30 days' worth of history capped at 3GB total size --> \r
-      <maxHistory>30</maxHistory> \r
-      <totalSizeCap>3GB</totalSizeCap> \r
\r
-    </rollingPolicy>\r
-    <encoder>\r
-      <pattern>${errorLoggerPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFError"/>\r
-  </appender>\r
-  \r
-   <appender name="EELFDebug"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${debugLogDirectory}/${debugLogName}.log</file>\r
-    <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> \r
-      <!-- daily rollover --> \r
-      <fileNamePattern>${logDirectory}/${debugLogName}.%d{yyyy-MM-dd}.log.zip</fileNamePattern> \r
\r
-      <!-- keep 30 days' worth of history capped at 3GB total size --> \r
-      <maxHistory>30</maxHistory> \r
-      <totalSizeCap>3GB</totalSizeCap> \r
\r
-    </rollingPolicy>\r
-    <encoder>\r
-      <pattern>${defaultLoggerPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFDebug" />\r
-  </appender>\r
\r
-  \r
\r
-\r
-  <logger name="org.onap.eelf" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELF" />\r
-  </logger>\r
-\r
-  <logger name="org.onap.eelf.audit" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFAudit" />\r
-  </logger>\r
-  \r
-  <logger name="org.onap.eelf.debug" level="debug" additivity="false">\r
-    <appender-ref ref="asyncEELFDebug" />\r
-  </logger>\r
-       \r
-  <logger name="org.onap.eelf.error" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFError" />\r
-  </logger>\r
-\r
-  <logger name="org.onap.eelf.metrics" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFMetrics" />\r
-  </logger>      \r
-    \r
-  \r
-  <root level="DEBUG">\r
-    <appender-ref ref="asyncEELF" />\r
-  </root>\r
-\r
-</configuration>\r
+<?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"?>\r
-<configuration scan="true" scanPeriod="3 seconds" debug="true">\r
-  <!--  specify the component name -->\r
-  <property name="componentName" value="vid"></property>\r
-  \r
-  <!--  specify the base path of the log directory -->\r
-  <property name="logDirPrefix" value="${VID_LOG_DIR}"></property>\r
-  \r
-  <!-- The directories where logs are written -->\r
-  <property name="logDirectory" value="${logDirPrefix}/${componentName}" />\r
-  <!-- Can easily relocate debug logs by modifying this path. -->\r
-  <property name="debugLogDirectory" value="${logDirPrefix}/${componentName}" />\r
-  \r
-  <!--  log file names -->\r
-  <property name="generalLogName" value="application" />\r
-  <property name="errorLogName" value="error" />\r
-  <property name="metricsLogName" value="metrics" />\r
-  <property name="auditLogName" value="audit" />\r
-  <property name="debugLogName" value="debug" />\r
-  <!--\r
-  These loggers are not used in code (yet). \r
-  <property name="securityLogName" value="security" />\r
-  <property name="policyLogName" value="policy" />\r
-  <property name="performanceLogName" value="performance" />\r
-  <property name="serverLogName" value="server" />\r
-   -->\r
-   \r
-  <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" />\r
-  <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" />\r
-  <!-- <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" />-->\r
-  \r
-  <!-- Example evaluator filter applied against console appender -->\r
-  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">\r
-    <encoder>\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-\r
-  <!-- ============================================================================ -->\r
-  <!-- EELF Appenders -->\r
-  <!-- ============================================================================ -->\r
-\r
-  <!-- The EELFAppender is used to record events to the general application \r
-    log -->\r
-    \r
-    \r
-  <appender name="EELF"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${generalLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${generalLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-    <filter class="org.onap.portalapp.util.CustomLoggingFilter" />\r
-  </appender>\r
-  \r
-  <appender name="asyncEELF" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELF" />\r
-  </appender>\r
-\r
-  <!-- EELF Security Appender. This appender is used to record security events \r
-    to the security log file. Security events are separate from other loggers \r
-    in EELF so that security log records can be captured and managed in a secure \r
-    way separate from the other logs. This appender is set to never discard any \r
-    events. -->\r
-  <!--     \r
-  <appender name="EELFSecurity"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${securityLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${securityLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  <appender name="asyncEELFSecurity" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <discardingThreshold>0</discardingThreshold>\r
-    <appender-ref ref="EELFSecurity" />\r
-  </appender>\r
-   -->\r
-   \r
-  <!-- EELF Performance Appender. This appender is used to record performance \r
-    records. -->\r
-  <!--\r
-  <appender name="EELFPerformance"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${performanceLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${performanceLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <outputPatternAsHeader>true</outputPatternAsHeader>\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFPerformance" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFPerformance" />\r
-  </appender>\r
-  -->\r
-\r
-  <!-- EELF Server Appender. This appender is used to record Server related \r
-    logging events. The Server logger and appender are specializations of the \r
-    EELF application root logger and appender. This can be used to segregate Server \r
-    events from other components, or it can be eliminated to record these events \r
-    as part of the application root log. -->\r
-  <!--\r
-  <appender name="EELFServer"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${serverLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${serverLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-        <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFServer" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFServer" />\r
-  </appender>\r
-   -->\r
-  \r
-  <!-- EELF Policy Appender. This appender is used to record Policy engine \r
-    related logging events. The Policy logger and appender are specializations \r
-    of the EELF application root logger and appender. This can be used to segregate \r
-    Policy engine events from other components, or it can be eliminated to record \r
-    these events as part of the application root log. -->\r
-  <!--\r
-  <appender name="EELFPolicy"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${policyLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${policyLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-        <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFPolicy" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFPolicy" />\r
-  </appender>\r
-  -->\r
-  \r
-  <!-- EELF Audit Appender. This appender is used to record audit engine \r
-    related logging events. The audit logger and appender are specializations \r
-    of the EELF application root logger and appender. This can be used to segregate \r
-    Policy engine events from other components, or it can be eliminated to record \r
-    these events as part of the application root log. -->\r
-    \r
-  <appender name="EELFAudit"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${auditLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${auditLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-         <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  <appender name="asyncEELFAudit" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFAudit" />\r
-  </appender>\r
-\r
-  <appender name="EELFMetrics"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${metricsLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${metricsLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <!-- <pattern>"%d{HH:mm:ss.SSS} [%thread] %-5level %logger{1024} - \r
-        %msg%n"</pattern> -->\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  \r
-  <appender name="asyncEELFMetrics" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFMetrics"/>\r
-  </appender>\r
-   \r
-  <appender name="EELFError"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${logDirectory}/${errorLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${logDirectory}/${errorLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <pattern>${defaultPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  <appender name="asyncEELFError" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFError"/>\r
-  </appender>\r
-  \r
-   <appender name="EELFDebug"\r
-    class="ch.qos.logback.core.rolling.RollingFileAppender">\r
-    <file>${debugLogDirectory}/${debugLogName}.log</file>\r
-    <rollingPolicy\r
-      class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">\r
-      <fileNamePattern>${debugLogDirectory}/${debugLogName}.%i.log.zip\r
-      </fileNamePattern>\r
-      <minIndex>1</minIndex>\r
-      <maxIndex>9</maxIndex>\r
-    </rollingPolicy>\r
-    <triggeringPolicy\r
-      class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">\r
-      <maxFileSize>5MB</maxFileSize>\r
-    </triggeringPolicy>\r
-    <encoder>\r
-      <pattern>${debugLoggerPattern}</pattern>\r
-    </encoder>\r
-  </appender>\r
-  \r
-  <appender name="asyncEELFDebug" class="ch.qos.logback.classic.AsyncAppender">\r
-    <queueSize>256</queueSize>\r
-    <appender-ref ref="EELFDebug" />\r
-    <includeCallerData>true</includeCallerData>\r
-  </appender>\r
\r
-  \r
-  <!-- ============================================================================ -->\r
-  <!--  EELF loggers -->\r
-  <!-- ============================================================================ -->\r
-  <logger name="com.att.eelf" level="debug" additivity="false">\r
-    <appender-ref ref="asyncEELF" />\r
-  </logger>\r
-  \r
-  <!--\r
-  <logger name="com.att.eelf.security" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFSecurity" />\r
-  </logger>\r
-  <logger name="com.att.eelf.perf" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFPerformance" />\r
-  </logger>\r
-  <logger name="com.att.eelf.server" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFServer" />\r
-  </logger>\r
-  <logger name="com.att.eelf.policy" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFPolicy" />\r
-  </logger>\r
-  -->\r
-  \r
-  <logger name="com.att.eelf.audit" level="info" additivity="false">\r
-    <appender-ref ref="asyncEELFAudit" />\r
-  </logger>\r
-  \r
-  <logger name="com.att.eelf.metrics" level="info" additivity="false">\r
-        <appender-ref ref="asyncEELFMetrics" />\r
-  </logger>\r
-    \r
-  <logger name="com.att.eelf.error" level="info" additivity="false">\r
-       <appender-ref ref="asyncEELFError" />\r
-  </logger>\r
-  \r
-   <logger name="com.att.eelf.debug" level="debug" additivity="false">\r
-        <appender-ref ref="asyncEELFDebug" />\r
-  </logger>\r
-  \r
-    \r
-  <root level="${VID_LOG_LEVEL}">\r
-    <appender-ref ref="asyncEELF" />\r
-  </root>\r
-\r
-</configuration>\r
+<?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>
index 3966f70..aca557f 100755 (executable)
@@ -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
index 549c17a..af48318 100755 (executable)
@@ -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"
 
index d25949c..2d676c3 100755 (executable)
@@ -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"
 
index d2ab2bb..121f567 100755 (executable)
@@ -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"
 
index 43798eb..90ce883 100755 (executable)
@@ -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"
 
index f29d485..947e0e1 100755 (executable)
@@ -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"
 
index c284e6c..c22d879 100755 (executable)
@@ -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"
 
index a739335..0947d49 100755 (executable)
@@ -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"
 
index f0669e0..53a928e 100755 (executable)
@@ -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
 }
index e7a1585..040baf2 100644 (file)
@@ -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:
 
index 4408bf6..c39e2c2 100644 (file)
@@ -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
index 89e1919..d1e39eb 100644 (file)
@@ -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
 --------------
 
index 025b63a..9b0136f 100755 (executable)
@@ -8,7 +8,7 @@
                the Portal team. -->\r
        <groupId>org.onap.vid</groupId>\r
        <artifactId>epsdk-app-onap</artifactId>\r
-       <version>3.0.0-SNAPSHOT</version>\r
+       <version>4.0.0-SNAPSHOT</version>\r
        <packaging>war</packaging>\r
        <name>ECOMP SDK Webapp for OpenSource</name>\r
        <description>ECOMP SDK Web Application for public release</description>\r
index 104e85d..edb3580 100755 (executable)
@@ -61,6 +61,9 @@ ecomp_redirect_url = http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/login
 # URL of the ECOMP Portal REST API\r
 ecomp_rest_url = http://portal.api.simpledemo.onap.org:8989/ONAPPORTAL/auxapi\r
 \r
+# Non AAF Mode\r
+role_access_centralized = local\r
+\r
 # Applications do not need to run a UEB listener after 1607.\r
 ueb_listeners_enable = false\r
 \r
index d01413a..51f3949 100755 (executable)
@@ -13,6 +13,9 @@ ecomp_redirect_url    = ${VID_ECOMP_REDIRECT_URL}
 # URL of the ECOMP Portal REST API\r
 ecomp_rest_url = ${VID_ECOMP_REST_URL}\r
 \r
+# AAF Mode\r
+role_access_centralized = ${VID_ROLE_ACCESS_CENTRALIZED}\r
+\r
 # UEB servers\r
 ueb_url_list = ${VID_UEB_URL_LIST}\r
 \r
index e2af216..9c48f85 100755 (executable)
@@ -625,6 +625,12 @@ REPLACE INTO `fn_restricted_url` VALUES ('serviceModels.htm','menu_servicemodels
 --\r
 INSERT INTO `fn_role` VALUES (1,'System Administrator','Y',1) ON DUPLICATE KEY UPDATE ROLE_NAME='System Administrator', ACTIVE_YN='Y', PRIORITY=1;\r
 INSERT INTO `fn_role` VALUES (16,'Standard User','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Standard User', ACTIVE_YN='Y', PRIORITY=5;\r
+INSERT INTO `fn_role` VALUES (17,'Demonstration___vFWCL','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vFWCL', ACTIVE_YN='Y', PRIORITY=5;\r
+INSERT INTO `fn_role` VALUES (18,'Demonstration___vFW','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vFW', ACTIVE_YN='Y', PRIORITY=5;\r
+INSERT INTO `fn_role` VALUES (19,'Demonstration___vCPE','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vCPE', ACTIVE_YN='Y', PRIORITY=5;\r
+INSERT INTO `fn_role` VALUES (20,'Demonstration___vIMS','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vIMS', ACTIVE_YN='Y', PRIORITY=5;\r
+INSERT INTO `fn_role` VALUES (21,'Demonstration___vLB','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___vLB', ACTIVE_YN='Y', PRIORITY=5;\r
+INSERT INTO `fn_role` VALUES (22,'Demonstration___gNB','Y',5) ON DUPLICATE KEY UPDATE ROLE_NAME='Demonstration___gNB', ACTIVE_YN='Y', PRIORITY=5;\r
 \r
 --\r
 -- Dumping data for table `fn_role_composite`\r
@@ -735,3 +741,10 @@ INSERT IGNORE `fn_user_role` VALUES (2,1,NULL,1);
 INSERT IGNORE `fn_user_role` VALUES (3,1,NULL,1);\r
 INSERT IGNORE `fn_user_role` VALUES (4,1,NULL,1);\r
 INSERT IGNORE `fn_user_role` VALUES (5,1,NULL,1);\r
+INSERT IGNORE `fn_user_role` VALUES (1,17,NULL,1);\r
+INSERT IGNORE `fn_user_role` VALUES (1,18,NULL,1);\r
+INSERT IGNORE `fn_user_role` VALUES (1,19,NULL,1);\r
+INSERT IGNORE `fn_user_role` VALUES (1,20,NULL,1);\r
+INSERT IGNORE `fn_user_role` VALUES (1,21,NULL,1);\r
+INSERT IGNORE `fn_user_role` VALUES (1,22,NULL,1);\r
+\r
index 3f15c88..2833cbd 100755 (executable)
@@ -33,6 +33,22 @@ SET FOREIGN_KEY_CHECKS = 0;
 CREATE SCHEMA IF NOT EXISTS `vid_openecomp_epsdk` ;\r
 \r
 USE vid_openecomp_epsdk;\r
+\r
+\r
+CREATE TABLE IF NOT EXISTS `vid_openecomp_epsdk`.`schema_info` (\r
+  `SCHEMA_ID` VARCHAR(25) NOT NULL,\r
+  `SCHEMA_DESC` VARCHAR(75) NOT NULL,\r
+  `DATASOURCE_TYPE` VARCHAR(100) NULL DEFAULT NULL,\r
+  `CONNECTION_URL` VARCHAR(200) NOT NULL,\r
+  `USER_NAME` VARCHAR(45) NOT NULL,\r
+  `PASSWORD` VARCHAR(45) NULL DEFAULT NULL,\r
+  `DRIVER_CLASS` VARCHAR(100) NOT NULL,\r
+  `MIN_POOL_SIZE` INT(11) NOT NULL,\r
+  `MAX_POOL_SIZE` INT(11) NOT NULL,\r
+  `IDLE_CONNECTION_TEST_PERIOD` INT(11) NOT NULL)\r
+ENGINE = InnoDB\r
+DEFAULT CHARACTER SET = utf8;\r
+\r
 -- ----------------------------------------------------------------------------\r
 -- Table vid_openecomp_epsdk.cr_favorite_reports\r
 -- ----------------------------------------------------------------------------\r
index dc9eb43..049ebf0 100755 (executable)
@@ -161,12 +161,13 @@ mso.user.name=infraportal
 mso.password.x=OBF:1ghz1kfx1j1w1m7w1i271e8q1eas1hzj1m4i1iyy1kch1gdz\r
 #E2E is v3\r
 mso.restapi.svc.e2einstance=/e2eServiceInstances/v3\r
-mso.restapi.svc.instance=/serviceInstances/v6\r
+mso.restapi.svc.instance=/serviceInstantiation/v7/serviceInstances\r
 mso.restapi.svc.instance.deleteAndUnassign=/serviceInstantiation/v7/serviceInstances\r
 mso.restapi.vnf.instance=/serviceInstances/v6/<service_instance_id>/vnfs\r
 mso.restapi.vnf.changemanagement.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>\r
 mso.restapi.network.instance=/serviceInstances/v6/<service_instance_id>/networks\r
 mso.restapi.vf.module.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules\r
+mso.restapi.vf.module.scaleout=/serviceInstantiation/v7/serviceInstances/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut\r
 mso.restapi.volume.group.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups\r
 mso.restapi.get.orc.req=/orchestrationRequests/v6\r
 mso.restapi.get.orc.reqs=/orchestrationRequests/v6?\r
index 5596de0..06a2e6b 100755 (executable)
@@ -103,16 +103,17 @@ mso.max.polls=10
 mso.user.name=${VID_MSO_USER}\r
 mso.password.x=${VID_MSO_PASS}\r
 #E2E is v3\r
-mso.restapi.svc.e2einstance=/onap/so/infra/e2eServiceInstances/v3\r
-mso.restapi.svc.instance=/onap/so/infra/serviceInstances/v6\r
+mso.restapi.svc.e2einstance=/e2eServiceInstances/v3\r
+mso.restapi.svc.instance=/serviceInstantiation/v7/serviceInstances\r
 mso.restapi.svc.instance.deleteAndUnassign=/serviceInstantiation/v7/serviceInstances\r
-mso.restapi.vnf.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs\r
-mso.restapi.vnf.changemanagement.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>\r
-mso.restapi.network.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/networks\r
-mso.restapi.vf.module.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules\r
-mso.restapi.volume.group.instance=/onap/so/infra/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups\r
-mso.restapi.get.orc.req=/onap/so/infra/orchestrationRequests/v6\r
-mso.restapi.get.orc.reqs=/onap/so/infra/orchestrationRequests/v6?\r
+mso.restapi.vnf.instance=/serviceInstances/v6/<service_instance_id>/vnfs\r
+mso.restapi.vnf.changemanagement.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/<request_type>\r
+mso.restapi.network.instance=/serviceInstances/v6/<service_instance_id>/networks\r
+mso.restapi.vf.module.scaleout=/serviceInstantiation/v7/serviceInstances/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules/scaleOut\r
+mso.restapi.vf.module.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/vfModules\r
+mso.restapi.volume.group.instance=/serviceInstances/v6/<service_instance_id>/vnfs/<vnf_instance_id>/volumeGroups\r
+mso.restapi.get.orc.req=/orchestrationRequests/v6\r
+mso.restapi.get.orc.reqs=/orchestrationRequests/v6?\r
 mso.restapi.get.man.tasks=/tasks/v1\r
 mso.restapi.configurations=/serviceInstances/v6/<service_instance_id>/configurations\r
 mso.restapi.configuration.instance=${mso.restapi.configurations}/<configuration_id>\r
@@ -143,4 +144,4 @@ mso.dme2.client.timeout=${MSO_DME2_CLIENT_TIMEOUT}
 mso.dme2.client.read.timeout=${MSO_DME2_CLIENT_READ_TIMEOUT}\r
 mso.dme2.server.url=${MSO_DME2_SERVER_URL}\r
 mso.dme2.enabled=${MSO_DME2_ENABLED}\r
-\r
+scheduler.basic.auth=\r
index 02144f0..9723960 100644 (file)
@@ -2,7 +2,7 @@
 # Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )\r
 # because they are used in Jenkins, whose plug-in doesn't support\r
 \r
-major=3\r
+major=4\r
 minor=0\r
 patch=0\r
 \r
diff --git a/pom.xml b/pom.xml
index e34fc4d..7ec5032 100644 (file)
--- a/pom.xml
+++ b/pom.xml
@@ -80,7 +80,7 @@
        <properties>\r
                <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>\r
                <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>\r
-               <build.version>3.0.0-SNAPSHOT</build.version>\r
+               <build.version>4.0.0-SNAPSHOT</build.version>\r
                <nexusproxy>https://nexus.onap.org</nexusproxy>\r
                <snapshotNexusPath>/content/repositories/snapshots/</snapshotNexusPath>\r
                <releaseNexusPath>/content/repositories/releases/</releaseNexusPath>\r
                        <version>4.5.3</version>\r
                </dependency>\r
        </dependencies>\r
-       <version>3.0.0-SNAPSHOT</version>\r
+       <version>4.0.0-SNAPSHOT</version>\r
 </project>\r
index 02144f0..9723960 100644 (file)
@@ -2,7 +2,7 @@
 # Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )\r
 # because they are used in Jenkins, whose plug-in doesn't support\r
 \r
-major=3\r
+major=4\r
 minor=0\r
 patch=0\r
 \r
index 5082129..4795103 100755 (executable)
@@ -9,7 +9,7 @@
                inherit from a parent maven module. -->\r
        <groupId>org.onap.vid</groupId>\r
        <artifactId>vid-app-common</artifactId>\r
-       <version>3.0.0-SNAPSHOT</version>\r
+       <version>4.0.0-SNAPSHOT</version>\r
        <packaging>war</packaging>\r
        <name>VID Common</name>\r
        <description>VID Common code for opensource version</description>\r
index c1964c1..06e0f01 100644 (file)
@@ -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 (file)
index 0000000..73bef76
--- /dev/null
@@ -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);
+    }
+}
+
+
index 89d3963..b19ea57 100644 (file)
@@ -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);
     }
index 5db4746..8e9b144 100644 (file)
@@ -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);
+       }
 }
index 355e548..dc0ecba 100644 (file)
@@ -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);
+    }
 }
index 84e83e8..a3ff5f9 100644 (file)
@@ -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;
@@ -133,6 +134,11 @@ public class SyncRestClient implements SyncRestClientInterface {
             url2 -> restClient.put(url2).headers(headers).body(body).asObject(responseClass));
     }
 
+    @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;
index 142adde..ae2f838 100644 (file)
@@ -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);
index 03dc808..86e832b 100644 (file)
@@ -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 (file)
index 0000000..6056c28
--- /dev/null
@@ -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;
+    }
+}
index 0976f40..1a3eb42 100644 (file)
@@ -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());
     }
index 6d6ffb3..b9d67b6 100644 (file)
@@ -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 (file)
index 0000000..bd7a67b
--- /dev/null
@@ -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);
+    }
+}
index 65fc521..e3fdc95 100644 (file)
@@ -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.
 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;
+    }
 }
index cee5af6..6685a63 100644 (file)
@@ -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);
     }
 
-
 }
index 9d22b8b..958fc11 100644 (file)
@@ -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();
         }
 
index 77e1dd2..59f12f4 100644 (file)
@@ -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;
+    }
 }
index 99824e7..91617ff 100644 (file)
@@ -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);
+    }
 }
index 79befe1..0ecb925 100644 (file)
@@ -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);
index 00db464..a6226e0 100644 (file)
@@ -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.
      */
@@ -73,17 +81,17 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
     private static final String RESOURCE_TYPE_OPERATIONAL_ENVIRONMENT = "operationalEnvironment";
     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);
@@ -174,10 +168,25 @@ public class MsoBusinessLogicImpl implements MsoBusinessLogic {
         return msoClientInterface.createVfModuleInstance(requestDetails, vf_module_endpoint);
     }
 
+    @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
index 3cba12f..834f808 100644 (file)
@@ -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);
index 773b8a8..1d71e9c 100644 (file)
@@ -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
 
index 9cac3e4..37600f7 100644 (file)
@@ -123,6 +123,14 @@ public class MsoRestClientNew implements MsoInterface {
         return createInstance(requestDetails, path);
     }
 
+    @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";
@@ -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());
index df69148..2b159f8 100644 (file)
 
 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() {
index 0e320a3..20c8442 100644 (file)
@@ -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;
+    }
 }
index 45835d4..5c1ee9e 100644 (file)
@@ -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;
     }
index 13db1ae..b4806f1 100644 (file)
@@ -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) {
index fa531ff..b3d20a6 100644 (file)
@@ -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;
index 90d1c33..e4a6b39 100644 (file)
@@ -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:
index 21b1ec1..231b352 100644 (file)
@@ -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;
index dc2541b..1890a5b 100644 (file)
@@ -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;
index 89660fb..aee4c05 100755 (executable)
           DataService.setPnf(!angular.equals(serviceModel.pnfs, {}));\r
                                        $scope.createType = COMPONENT.A_LA_CARTE;\r
                                        var broadcastType = COMPONENT.CREATE_COMPONENT;\r
-                    if (AsdcService.isMacro(serviceModel)) {\r
+                    if (AsdcService.isMacro(serviceModel) || DataService.getE2EService()) {\r
                         DataService.setALaCarte(false);\r
                         if(AsdcService.shouldExcludeMacroFromAsyncInstatiationFlow(serviceModel)){\r
                                DataService.setShouldExcludeMacroFromAsyncInstatiationFlow(true);\r
index c55092e..3a5a1c7 100644 (file)
@@ -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++;
 
                                                 _.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;
                                                     }
                        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 ={};
                     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
                                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{
                         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,
                        });
                        return JSON.stringify(result);
                }
-               
         vm.openModal = function () {
             if(vm.hasScheduler) { //scheduling supported
                                $scope.widgetParameter = ""; // needed by the scheduler?
                                        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);
                 }
                        }
         };
         vm.isConfigUpdate = function () {
             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfConfigUpdate;
         }
-               
+
         vm.isScaleOut = function () {
             return vm.changeManagement.workflow === COMPONENT.WORKFLOWS.vnfScaleOut;
         }
index ec1d4cd..21f9c5d 100644 (file)
                 <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">
             <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
index 753f9fd..6bdc0ae 100755 (executable)
@@ -20,7 +20,7 @@
 \r
 "use strict";\r
 \r
-var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCONFIGURATION, COMPONENT, featureFlags) {\r
+var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCONFIGURATION, COMPONENT, DataService, featureFlags) {\r
     return {\r
         getModel: function (modelId, successCallbackFunction) {\r
             $log.debug("AsdcService:getModel: modelId: " + modelId);\r
@@ -37,6 +37,8 @@ var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCON
         shouldExcludeMacroFromAsyncInstatiationFlow: function(serviceModel){\r
             if (!featureFlags.isOn(COMPONENT.FEATURE_FLAGS.FLAG_ASYNC_INSTANTIATION))\r
                 return true;\r
+                       if (DataService.getE2EService())\r
+                               return true;\r
             if (!_.isEmpty(serviceModel.pnfs))\r
                 return true;\r
             if (!_.isEmpty(serviceModel.collectionResource))\r
@@ -72,4 +74,4 @@ var AsdcService = function ($http, $log, PropertyService, UtilityService, VIDCON
 }\r
 \r
 appDS2.factory("AsdcService", ["$http", "$log", "PropertyService",\r
-    "UtilityService", "VIDCONFIGURATION","COMPONENT", "featureFlags", AsdcService]);\r
+    "UtilityService", "VIDCONFIGURATION","COMPONENT", "DataService", "featureFlags", AsdcService]);\r
index 76d1d4a..43ac289 100644 (file)
@@ -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
index ca7a163..da9cdaa 100644 (file)
 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
index 80c6593..7bdd6b8 100644 (file)
 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
index 4e2d994..168d900 100644 (file)
+/*-
+ * ============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
index e7a7e3a..2c2aa89 100644 (file)
@@ -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 (file)
index 0000000..bc62392
--- /dev/null
@@ -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 (file)
index 0000000..e7ab4f0
--- /dev/null
@@ -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 (file)
index 0000000..dc2eafc
--- /dev/null
@@ -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 (file)
index 0000000..93afd17
--- /dev/null
@@ -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
index 36f4bdd..4616732 100644 (file)
+/*
+ * ============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 (file)
index af7f74b..0000000
+++ /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;
-
-    }
-}
index 402386a..bfc82ce 100644 (file)
 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());
index e8f5569..c81fa16 100644 (file)
@@ -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 (file)
index 0000000..3d2a20b
--- /dev/null
@@ -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 (file)
index 0000000..6677da3
--- /dev/null
@@ -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);
+  }
+}
index 440a2a7..6ac7b54 100644 (file)
+/*-
+ * ============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 (file)
index 0000000..d0eec26
--- /dev/null
@@ -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
index 544a799..d7db495 100644 (file)
+/*-
+ * ============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;
     }
 
 
index 689f55e..baf56d3 100644 (file)
@@ -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 (file)
index 0000000..6db5795
--- /dev/null
@@ -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
index fcd20bd..d021ffd 100644 (file)
@@ -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 (file)
index 0000000..d37f6af
--- /dev/null
@@ -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 (file)
index 0000000..9dbdfb0
--- /dev/null
@@ -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 (file)
index 0000000..c509c62
--- /dev/null
@@ -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 (file)
index 0000000..ddbebac
--- /dev/null
@@ -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
index 02144f0..9723960 100755 (executable)
@@ -2,7 +2,7 @@
 # Note that these variables cannot be structured (e.g. : version.release or version.snapshot etc... )\r
 # because they are used in Jenkins, whose plug-in doesn't support\r
 \r
-major=3\r
+major=4\r
 minor=0\r
 patch=0\r
 \r
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 (file)
index 0000000..0bc179c
--- /dev/null
@@ -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
index a43092e..cc7f76c 100644 (file)
@@ -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,
index 679c5d7..04b1f99 100644 (file)
               ]
             }
           }
+        },
+        {
+          "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"
+                }
+              ]
+            }
+          }
         }
       ]
     }