Add SO APIs to Nokia VNFM adapter 85/55485/9
authorDenes Nemeth <denes.nemeth@nokia.com>
Wed, 27 Jun 2018 14:08:38 +0000 (16:08 +0200)
committerDenes Nemeth <denes.nemeth@nokia.com>
Mon, 2 Jul 2018 19:33:52 +0000 (21:33 +0200)
Change-Id: I7dfc5677144be3df553edb4141e89e543e1b977d
Signed-off-by: Denes Nemeth <denes.nemeth@nokia.com>
Issue-ID: VFC-950

42 files changed:
.gitignore
nokiav2/deployment/Dockerfile
nokiav2/deployment/Dockerfile.verify [new file with mode: 0755]
nokiav2/deployment/pom.xml
nokiav2/docs/development.rst
nokiav2/docs/sampleVnfs/.gitignore [new file with mode: 0644]
nokiav2/docs/so.rst
nokiav2/driver/pom.xml
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/core/SelfRegistrationManager.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/ISoV2LifecycleManager.java [new file with mode: 0644]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/SoLifecycleManager.java [deleted file]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/SoV2LifecycleManager.java [new file with mode: 0644]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapR2HeatPackageBuilder.java [new file with mode: 0644]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapVnfPackageBuilder.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/SupportedOnapPackageVersions.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/SoApi.java [deleted file]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/SoV2Api.java [new file with mode: 0644]
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/vnfm/AdditionalParameters.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/vnfm/JobManager.java
nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/vnfm/LifecycleManager.java
nokiav2/driver/src/main/resources/self.swagger.json
nokiav2/driver/src/main/resources/upload.html
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/FullUnitTestSuite.java
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/ct/CTDirectReal.java
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/TestSoLifecycleManager.java [deleted file]
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/TestCbamVnfdBuilder.java
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/TestOnapVnfPackageBuilder.java
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/TestConverterApi.java
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/TestSoApi.java [deleted file]
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/TestSwaggerDefinitionConsistency.java
nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/vnfm/TestLifecycleManager.java
nokiav2/driver/src/test/resources/application-direct.properties
nokiav2/driver/src/test/resources/application.properties
nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.full.modified.vnfd.yaml
nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.full.original.vnfd.yaml
nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.minimal.modified.vnfd.yaml
nokiav2/driver/src/test/resources/unittests/packageconverter/cbam.minimal.original.vnfd.yaml
nokiav2/driverwar/pom.xml
nokiav2/generatedapis/pom.xml
nokiav2/generatedapis/src/main/resources/so.vnfm.json [deleted file]
nokiav2/generatedapis/src/main/resources/so.vnfm.v2.json [new file with mode: 0644]
nokiav2/pom.xml

index eb5a316..627714b 100644 (file)
@@ -1 +1,2 @@
 target
+.DS_store
index 68bdb18..107327d 100755 (executable)
@@ -12,7 +12,7 @@ RUN yum -y update && \
     yum -y install mc vim tcpdump net-tools nc strace telnet unzip && \
     yum clean all
 COPY pom.xml pom.xml
-RUN VERSION=`echo -e "setns x=http://maven.apache.org/POM/4.0.0 \n  xpath /x:project/x:version/text() "| xmllint --shell pom.xml | grep content | sed 's/.*content=//'| sed 's/-SNAPSHOT//'` ; wget -q -O driver.war "https://nexus.onap.org/service/local/artifact/maven/redirect?r=${REPO}&g=org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2&a=driverwar&v=${VERSION}${MODE}&e=war"
+RUN VERSION=`echo -e "setns x=http://maven.apache.org/POM/4.0.0 \n  xpath /x:project/x:version/text() "| xmllint --shell pom.xml | grep content | sed 's/.*content=//'| sed 's/-SNAPSHOT//'` ; echo "Version $VERSION mode=$MODE"; wget -q -O driver.war "https://nexus.onap.org/service/local/artifact/maven/redirect?r=${REPO}&g=org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2&a=driverwar&v=${VERSION}${MODE}&e=war"
 #Can be used for local builds instead of the previous line
 #COPY driver.war .
 ENV JAVA_HOME /usr/lib/jvm/jre
diff --git a/nokiav2/deployment/Dockerfile.verify b/nokiav2/deployment/Dockerfile.verify
new file mode 100755 (executable)
index 0000000..107327d
--- /dev/null
@@ -0,0 +1,20 @@
+FROM centos:7
+WORKDIR /service
+ARG REPO
+ARG MODE
+COPY src/main/resources/docker-entrypoint.sh .
+COPY src/main/resources/LICENSE ./ONAP_LICENSE
+COPY src/main/resources/application.properties .
+RUN sed -i 's/enabled=1/enabled=0/' /etc/yum/pluginconf.d/fastestmirror.conf
+RUN sed -i 's|#baseurl=http://mirror.centos.org/centos|baseurl=http://mirrors.ocf.berkeley.edu/centos|' /etc/yum.repos.d/*.repo
+RUN yum -y update && \
+    yum -y install java-1.8.0-openjdk-headless wget && \
+    yum -y install mc vim tcpdump net-tools nc strace telnet unzip && \
+    yum clean all
+COPY pom.xml pom.xml
+RUN VERSION=`echo -e "setns x=http://maven.apache.org/POM/4.0.0 \n  xpath /x:project/x:version/text() "| xmllint --shell pom.xml | grep content | sed 's/.*content=//'| sed 's/-SNAPSHOT//'` ; echo "Version $VERSION mode=$MODE"; wget -q -O driver.war "https://nexus.onap.org/service/local/artifact/maven/redirect?r=${REPO}&g=org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2&a=driverwar&v=${VERSION}${MODE}&e=war"
+#Can be used for local builds instead of the previous line
+#COPY driver.war .
+ENV JAVA_HOME /usr/lib/jvm/jre
+EXPOSE 8089
+ENTRYPOINT /service/docker-entrypoint.sh
index ff9bc50..9411807 100644 (file)
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>deployment</artifactId>
-  <version>1.1.0-SNAPSHOT</version>
+  <version>${driver.version}</version>
   <packaging>pom</packaging>
   <name>vfc/nfvo/driver/vnfm/svnfm/nokiav2/deployment</name>
   <description>Nokia SVNFM driver deployment files</description>
   <parent>
     <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
     <artifactId>vfc-nfvo-driver-vnfm-svnfm-nokiav2</artifactId>
-    <version>1.1.0-SNAPSHOT</version>
+    <version>1.1.1-SNAPSHOT</version>
   </parent>
   <build>
     <plugins>
index 12c0c29..34025c6 100644 (file)
@@ -47,3 +47,5 @@ Recently solved issues
 - Solve remaining severe & moderate license issues
 
 
+
+
diff --git a/nokiav2/docs/sampleVnfs/.gitignore b/nokiav2/docs/sampleVnfs/.gitignore
new file mode 100644 (file)
index 0000000..02c5983
--- /dev/null
@@ -0,0 +1,2 @@
+simple_k8s
+simple_vmware
index 809f4d7..bd7c521 100644 (file)
@@ -15,4 +15,12 @@ will be defined for each VDU
 Limitations of the current release
 ----------------------------------
 
-- at least one server instance mapping for each VDU must be supplied in the VNF activation request
\ No newline at end of file
+- at least one server instance mapping for each VDU must be supplied in the VNF activation request
+
+
+Open questions
+--------------
+
+- What is the vnfVersion in Mso
+- What is the requestType in vnfCreate
+- What is the meaning of the tenantCreated field in rollback
\ No newline at end of file
index 276f265..1c436a5 100644 (file)
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <artifactId>driver</artifactId>
-  <version>1.1.0-SNAPSHOT</version>
+  <version>${driver.version}</version>
   <packaging>jar</packaging>
   <name>vfc/nfvo/driver/vnfm/svnfm/nokiav2/driver</name>
   <description>svnfm vnfm driver</description>
   <parent>
     <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
     <artifactId>vfc-nfvo-driver-vnfm-svnfm-nokiav2</artifactId>
-    <version>1.1.0-SNAPSHOT</version>
+    <version>1.1.1-SNAPSHOT</version>
   </parent>
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -35,7 +35,7 @@
     <dependency>
       <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
       <artifactId>vfc-nfvo-driver-vnfm-svnfm-nokiav2-clients</artifactId>
-      <version>1.1.0-SNAPSHOT</version>
+      <version>${driver.version}</version>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
index 123f263..1319405 100644 (file)
@@ -59,6 +59,10 @@ public class SelfRegistrationManager {
     private String driverVnfmExternalIp;
     @Value("${server.port}")
     private String driverPort;
+    @Value("${skipLcnSubscription}")
+    private boolean skipLcnSubscription;
+    @Value("${skipSelfRegistration}")
+    private boolean skipSelfRegistration;
     private volatile boolean ready = false;
 
     SelfRegistrationManager(VnfmInfoProvider vnfmInfoProvider, MsbApiProvider msbApiProvider, CbamRestApiProvider cbamRestApiProvider) {
@@ -72,11 +76,17 @@ public class SelfRegistrationManager {
      */
     public void register() {
         //the order is important (only publish it's existence after the subscription has been created)
-        subscribeToLcns();
+        if(!skipLcnSubscription) {
+            subscribeToLcns();
+        }
         try {
-            registerMicroService();
+            if(!skipSelfRegistration) {
+                registerMicroService();
+            }
         } catch (RuntimeException e) {
-            deleteSubscriptions();
+            if(!skipLcnSubscription) {
+                deleteSubscriptions();
+            }
             throw e;
         }
         ready = true;
@@ -86,24 +96,28 @@ public class SelfRegistrationManager {
      * De-register the VNFM driver from the micro-service bus
      */
     public void deRegister() {
-        try {
-            logger.info("Cancelling micro service registration");
-            msbApiProvider.getMsbApi().deleteMicroService(SERVICE_NAME, DRIVER_VERSION, null, null).blockingFirst();
-        } catch (Exception e) {
-            //ONAP throws 500 internal server error, but deletes the micro service
-            boolean serviceFoundAfterDelete = false;
+        if(!skipSelfRegistration) {
             try {
-                msbApiProvider.getMsbApi().getMicroService_0(SERVICE_NAME, DRIVER_VERSION, null, null, null, null, null);
-                serviceFoundAfterDelete = true;
-            } catch (Exception e1) {
-                logger.info("Unable to query " + SERVICE_NAME + " from MSB (so the service was successfully deleted)", e1);
-                // the micro service was deleted (even though 500 HTTP code was reported)
-            }
-            if (serviceFoundAfterDelete) {
-                throw buildFatalFailure(logger, "Unable to deRegister Nokia VNFM driver", e);
+                logger.info("Cancelling micro service registration");
+                msbApiProvider.getMsbApi().deleteMicroService(SERVICE_NAME, DRIVER_VERSION, null, null).blockingFirst();
+            } catch (Exception e) {
+                //ONAP throws 500 internal server error, but deletes the micro service
+                boolean serviceFoundAfterDelete = false;
+                try {
+                    msbApiProvider.getMsbApi().getMicroService_0(SERVICE_NAME, DRIVER_VERSION, null, null, null, null, null);
+                    serviceFoundAfterDelete = true;
+                } catch (Exception e1) {
+                    logger.info("Unable to query " + SERVICE_NAME + " from MSB (so the service was successfully deleted)", e1);
+                    // the micro service was deleted (even though 500 HTTP code was reported)
+                }
+                if (serviceFoundAfterDelete) {
+                    throw buildFatalFailure(logger, "Unable to deRegister Nokia VNFM driver", e);
+                }
             }
         }
-        deleteSubscriptions();
+        if(!skipLcnSubscription) {
+            deleteSubscriptions();
+        }
     }
 
     /**
@@ -113,7 +127,7 @@ public class SelfRegistrationManager {
      */
     @VisibleForTesting
     public void assureSubscription(String vnfmId) {
-        if (!vnfmIdToSubscriptionId.containsKey(vnfmId)) {
+        if (!vnfmIdToSubscriptionId.containsKey(vnfmId) && !skipLcnSubscription) {
             subscribeToLcn(vnfmId);
         }
     }
diff --git a/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/ISoV2LifecycleManager.java b/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/ISoV2LifecycleManager.java
new file mode 100644 (file)
index 0000000..32cc779
--- /dev/null
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2016-2017, Nokia Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so;
+
+import javax.servlet.http.HttpServletResponse;
+import org.onap.vnfmadapter.so.v2.model.*;
+
+public interface ISoV2LifecycleManager {
+
+    /**
+     * Create the VNF in VNFM
+     *
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param request the SO VNF creation request
+     * @param httpResponse the HTTP response
+     */
+    void createVnf(String vnfIdInAai, SoV2VnfCreateRequest request, HttpServletResponse httpResponse);
+
+    /**
+     * Query VNF
+     *
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param request the VF module update request
+     * @param httpResponse the HTTP response
+     * @return the VNF query
+     */
+    SoV2VnfQueryResponse queryVnf(String vnfIdInAai, SoV2VnfQueryRequest request, HttpServletResponse httpResponse);
+
+    /**
+     * Delete the VNF in VNFM
+     *
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param request the VNF deletion request
+     * @param httpServletResponse the HTTP response
+     */
+    void delete(String vnfIdInAai, SoV2VnfDeleteRequest request, HttpServletResponse httpServletResponse);
+
+    /**
+     * Update the VNF in VNFM
+     *
+     * - only the VNF modifiable attributes are updated
+     *
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param request the SO VNF update request
+     * @param httpResponse the HTTP response
+     * @return the response the HTTP response
+     */
+    SoV2VnfUpdateResponse updateVnf(String vnfIdInAai, SoV2VnfUpdateRequest request, HttpServletResponse httpResponse);
+
+
+    /**
+     * Rollback the operation on the VNFM
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param rollback the rollback parameters
+     */
+    void rollback(String vnfIdInAai, SoV2RollbackVnfUpdate rollback, HttpServletResponse httpServletResponse);
+
+    /**
+     * Create VF module in VNFM
+     *
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param vfModuleId the identifier of the VF module in A&AI
+     * @param request the creation request
+     * @param httpResponse the HTTP response
+     */
+    void createVfModule(String vnfIdInAai, String vfModuleId, SoV2VfModuleCreateRequest request, HttpServletResponse httpResponse);
+
+    /**
+     * Delete VF module in VNFM
+     *
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param vfModuleId the identifier of the VF module in A&AI
+     * @param request the deletion request
+     * @param httpResponse the HTTP response
+     */
+    void deleteVfModule(String vnfIdInAai, String vfModuleId, SoV2VnfDeleteRequest request, HttpServletResponse httpResponse);
+
+    /**
+     * Update VF module
+     *
+     * @param vnfIdInAai the identifier of the VNF in A&AI
+     * @param vfModuleId the identifier of the VF module in A&AI
+     * @param request the VF module update request
+     * @param httpResponse the HTTP response
+     * @return the response
+     */
+    SoV2VnfUpdateResponse updateVfModule(String vnfIdInAai, String vfModuleId, SoV2VnfUpdateRequest request, HttpServletResponse httpResponse);
+
+}
diff --git a/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/SoLifecycleManager.java b/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/SoLifecycleManager.java
deleted file mode 100644 (file)
index b368fa1..0000000
+++ /dev/null
@@ -1,330 +0,0 @@
-/*
- * Copyright 2016-2017, Nokia Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so;
-
-
-import com.nokia.cbam.lcm.v32.model.*;
-import com.nokia.cbam.lcm.v32.model.VimInfo;
-import java.util.ArrayList;
-import java.util.List;
-import javax.servlet.http.HttpServletResponse;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.api.VimInfoProvider;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.AAIExternalSystemInfoProvider;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.notification.GenericVnfManager;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.*;
-import org.onap.vnfmadapter.so.model.*;
-import org.onap.vnfmdriver.model.ExtVirtualLinkInfo;
-import org.onap.vnfmdriver.model.*;
-import org.onap.vnfmdriver.model.VnfInfo;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import static java.util.Optional.of;
-import static java.util.Optional.ofNullable;
-
-import static com.nokia.cbam.lcm.v32.model.VimInfo.VimInfoTypeEnum.*;
-import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.notification.VnfcManager.buildCbamId;
-import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CbamRestApiProvider.NOKIA_LCM_API_VERSION;
-import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager.getVnfdIdFromModifyableAttributes;
-import static org.onap.vnfmadapter.so.model.SoJobStatus.*;
-
-/**
- * Responsible for providing access to AAI APIs.
- * Handles authentication and mandatory parameters.
- */
-
-@Component
-public class SoLifecycleManager {
-    private final LifecycleManager lifecycleManager;
-    private final VimInfoProvider vimInfoProvider;
-    private final CbamRestApiProvider cbamRestApiProvider;
-    private final JobManager jobManager;
-    private final GenericVnfManager genericVnfManager;
-
-
-    @Autowired
-    SoLifecycleManager(LifecycleManagerForSo lifecycleManager, AAIExternalSystemInfoProvider vimInfoProvider, CbamRestApiProviderForSo cbamRestApiProvider, JobManagerForSo jobManager, GenericVnfManager genericVnfManager) {
-        this.lifecycleManager = lifecycleManager;
-        this.vimInfoProvider = vimInfoProvider;
-        this.cbamRestApiProvider = cbamRestApiProvider;
-        this.jobManager = jobManager;
-        this.genericVnfManager = genericVnfManager;
-    }
-
-    /**
-     * Creates the VNF in SO terminology
-     *
-     * @param vnfmId  the identifier of the VNFM
-     * @param request the VNF creation request
-     * @return the VNF creation response
-     */
-    public SoVnfCreationResponse create(String vnfmId, SoVnfCreationRequest request) {
-        SoVnfCreationResponse response = new SoVnfCreationResponse();
-        LifecycleManager.VnfCreationResult result = lifecycleManager.create(vnfmId, request.getCsarId(), request.getName(), request.getDescription());
-        response.setVnfId(result.getVnfInfo().getId());
-        genericVnfManager.createOrUpdate(response.getVnfId(), false, vnfmId, ofNullable(request.getNsId()));
-        return response;
-    }
-
-    /**
-     * Activate the VNF in SO terminology
-     *
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param soRequest    the VNF activation request
-     * @param httpResponse the HTTP response
-     * @return the job handler of the VNF activation
-     */
-    public SoJobHandler activate(String vnfmId, String vnfId, SoVnfActivationRequest soRequest, HttpServletResponse httpResponse) {
-        AdditionalParameters additionalParameters = new AdditionalParameters();
-        additionalParameters.setAdditionalParams(buildAdditionalParameters(soRequest.getAdditionalParams()));
-        String vimId = soRequest.getVimId();
-        org.onap.vnfmdriver.model.VimInfo vimInfo = vimInfoProvider.getVimInfo(vimId);
-        additionalParameters.setVimType(vimTypeHeuristic(vimInfo.getUrl()));
-        processVdus(soRequest, additionalParameters, vimId);
-        additionalParameters.setInstantiationLevel("default");
-        processNetworks(soRequest, additionalParameters, vimId);
-        processZones(soRequest, additionalParameters, vimId);
-        com.nokia.cbam.lcm.v32.model.VnfInfo cbamVnfInfo = cbamRestApiProvider.getCbamLcmApi(vnfmId).vnfsVnfInstanceIdGet(vnfId, NOKIA_LCM_API_VERSION).blockingFirst();
-        String onapVnfdId = getVnfdIdFromModifyableAttributes(cbamVnfInfo);
-        VnfInfo vnfInfo = lifecycleManager.queryVnf(vnfmId, vnfId);
-        List<ExtVirtualLinkInfo> externalVirtualLinks = new ArrayList<>();
-        VnfInstantiateResponse instantiate = lifecycleManager.instantiate(vnfmId, externalVirtualLinks, httpResponse, soRequest.getAdditionalParams(), additionalParameters, vnfId, onapVnfdId, vnfInfo.getVnfdId());
-        return buildJobHandler(instantiate.getJobId());
-    }
-
-    /**
-     * Scale the VNF
-     *
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param soRequest    the VNF scale request
-     * @param httpResponse the HTTP response
-     * @return the job handler of the VNF activation
-     */
-    public SoJobHandler scale(String vnfmId, String vnfId, SoVnfScaleRequest soRequest, HttpServletResponse httpResponse) {
-        org.onap.vnfmdriver.model.VnfScaleRequest driverRequest = new org.onap.vnfmdriver.model.VnfScaleRequest();
-        driverRequest.setAdditionalParam(buildAdditionalParameters(soRequest.getAdditionalParams()));
-        driverRequest.setAspectId(soRequest.getAspectId());
-        driverRequest.setNumberOfSteps(soRequest.getSteps().toString());
-        driverRequest.setType(soRequest.getDirection() == SoScaleDirection.IN ? org.onap.vnfmdriver.model.ScaleDirection.IN : org.onap.vnfmdriver.model.ScaleDirection.OUT);
-        return buildJobHandler(lifecycleManager.scaleVnf(vnfmId, vnfId, driverRequest, httpResponse).getJobId());
-    }
-
-    /**
-     * Heal the VNF
-     *
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param request      the VNF heal request
-     * @param httpResponse the HTTP response
-     * @return the job handler of the VNF activation
-     */
-    public SoJobHandler heal(String vnfmId, String vnfId, SoVnfHealRequest request, HttpServletResponse httpResponse) {
-        org.onap.vnfmdriver.model.VnfHealRequest vnfHealRequest = new org.onap.vnfmdriver.model.VnfHealRequest();
-        VnfHealRequestAffectedvm affectedVm = new VnfHealRequestAffectedvm();
-        affectedVm.setVimid("notUsedByDriver");
-        affectedVm.setVduid("notUsedByDriver");
-        affectedVm.setVmname("unknown");
-        vnfHealRequest.setAffectedvm(affectedVm);
-        vnfHealRequest.setAction("heal");
-        return buildJobHandler(lifecycleManager.healVnf(vnfmId, vnfId, vnfHealRequest, of(buildCbamId(request.getVnfcId())), httpResponse).getJobId());
-    }
-
-    /**
-     * Deactivate the VNF
-     *
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param soRequest    the VNF deactivation request
-     * @param httpResponse the HTTP response
-     * @return the job handler of the VNF activation
-     */
-    public SoJobHandler deactivate(String vnfmId, String vnfId, SoVnfTerminationRequest soRequest, HttpServletResponse httpResponse) {
-        VnfTerminateRequest driverRequest = new VnfTerminateRequest();
-        if (soRequest.getMode() == SoTerminationMode.FORCEFUL) {
-            driverRequest.setTerminationType(VnfTerminationType.FORCEFUL);
-        } else {
-            driverRequest.setTerminationType(VnfTerminationType.GRACEFUL);
-            driverRequest.setGracefulTerminationTimeout(soRequest.getGracefulTerminationTimeoutInMs().toString());
-
-        }
-        return buildJobHandler(lifecycleManager.terminateAndDelete(vnfmId, vnfId, driverRequest, httpResponse).getJobId());
-    }
-
-    /**
-     * Delete the VNF
-     *
-     * @param vnfmId the identifier of the VNFM
-     * @param vnfId  the identifier of the VNF
-     * @return the job handler of the VNF activation
-     */
-    public void delete(String vnfmId, String vnfId) {
-        lifecycleManager.deleteVnf(vnfmId, vnfId);
-    }
-
-    /**
-     * Execute a custom operation on a VNF
-     *
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param request      the VNF custom
-     * @param httpResponse the HTTP response
-     * @return the job handler of the VNF activation
-     */
-    public SoJobHandler customOperation(String vnfmId, String vnfId, SoVnfCustomOperation request, HttpServletResponse httpResponse) {
-        String operationId = request.getOperationId();
-        CustomOperationRequest cbamRequest = new CustomOperationRequest();
-        cbamRequest.setAdditionalParams(buildAdditionalParameters(request.getAdditionalParams()));
-        return buildJobHandler(lifecycleManager.customOperation(vnfmId, vnfId, operationId, request.getAdditionalParams(), httpResponse).getJobId());
-    }
-
-    /**
-     * @param jobId  the identifier of the job
-     * @param vnfmId the identifier of the VNFM
-     * @return the details of the job
-     */
-    public SoJobDetail getJobDetails(String vnfmId, String jobId) {
-        SoJobDetail jobDetail = new SoJobDetail();
-        jobDetail.setJobId(jobId);
-        JobStatus currentStatus = jobManager.getJob(vnfmId, jobId).getResponseDescriptor().getStatus();
-        if (JobStatus.STARTED.equals(currentStatus)) {
-            jobDetail.setStatus(STARTED);
-        } else if (JobStatus.PROCESSING.equals(currentStatus)) {
-            jobDetail.setStatus(STARTED);
-        } else if (JobStatus.FINISHED.equals(currentStatus)) {
-            jobDetail.setStatus(FINISHED);
-        } else if (JobStatus.TIMEOUT.equals(currentStatus)) {
-            jobDetail.setStatus(FAILED);
-        } else {//ERROR
-            jobDetail.setStatus(FAILED);
-        }
-        return jobDetail;
-    }
-
-    private VimInfo.VimInfoTypeEnum vimTypeHeuristic(String url) {
-        if (url.contains("/v3")) {
-            return OPENSTACK_V3_INFO;
-        } else if (url.contains("/v2")) {
-            return OPENSTACK_V2_INFO;
-        } else {
-            return VMWARE_VCLOUD_INFO;
-        }
-    }
-
-    private Object buildAdditionalParameters(Object additionalParams) {
-        return additionalParams;
-    }
-
-    private SoJobHandler buildJobHandler(String jobId) {
-        SoJobHandler jobHandler = new SoJobHandler();
-        jobHandler.setJobId(jobId);
-        return jobHandler;
-    }
-
-    private void processVdus(SoVnfActivationRequest request, AdditionalParameters additionalParameters, String vimId) {
-        if (request.getVduMappings() != null) {
-            for (SoVduMapping vduMapping : request.getVduMappings()) {
-                VimComputeResourceFlavour flavour = new VimComputeResourceFlavour();
-                flavour.setVimId(vimId);
-                flavour.setVnfdVirtualComputeDescId(vduMapping.getVduId());
-                flavour.setResourceId(vduMapping.getFlavourId());
-                additionalParameters.getComputeResourceFlavours().add(flavour);
-                VimSoftwareImage image = new VimSoftwareImage();
-                image.setVimId(vimId);
-                image.setResourceId(vduMapping.getImageId());
-                image.setVnfdSoftwareImageId(vduMapping.getVduId() + CbamUtils.SEPARATOR + "image");
-                additionalParameters.getSoftwareImages().add(image);
-            }
-        }
-    }
-
-    private void processNetworks(SoVnfActivationRequest request, AdditionalParameters additionalParameters, String vimId) {
-        if (request.getNetworkMappings() != null) {
-            for (SoNetworkMapping networkMapping : request.getNetworkMappings()) {
-                ExtVirtualLinkData extVirtualLinkData = createExtVirtualLinkData(additionalParameters, networkMapping.getVldId());
-                extVirtualLinkData.setVimId(vimId);
-                extVirtualLinkData.setResourceId(networkMapping.getNetworkProviderId());
-                processAssingedAddress(networkMapping, extVirtualLinkData);
-            }
-        }
-    }
-
-    private void processAssingedAddress(SoNetworkMapping networkMapping, ExtVirtualLinkData extVirtualLinkData) {
-        if (networkMapping.getAssignedAddresses() != null) {
-            for (SoAssignedAddresses assignedAddresses : networkMapping.getAssignedAddresses()) {
-                VnfExtCpData extCpData = createExtVirtualLinkData(extVirtualLinkData.getExtCps(), assignedAddresses.getCpdId());
-                addMissing(extCpData, assignedAddresses.getIpAddress());
-            }
-        }
-    }
-
-    private void processZones(SoVnfActivationRequest request, AdditionalParameters additionalParameters, String vimId) {
-        if (request.getServerMappings() != null) {
-            for (SoServerMapping serverMapping : request.getServerMappings()) {
-                ZoneInfo zone = locateOrCreateZone(additionalParameters.getZones(), serverMapping.getVduId());
-                zone.setResourceId(serverMapping.getAvailabilityZoneId());
-                zone.setVimId(vimId);
-            }
-        }
-    }
-
-    private ZoneInfo locateOrCreateZone(List<ZoneInfo> zones, String vduId) {
-        for (ZoneInfo zone : zones) {
-            if (zone.getId().equals(vduId)) {
-                return zone;
-            }
-        }
-        ZoneInfo zoneInfo = new ZoneInfo();
-        zoneInfo.setId(vduId);
-        zones.add(zoneInfo);
-        return zoneInfo;
-    }
-
-    private void addMissing(VnfExtCpData extCpData, String ipAddress) {
-        if (extCpData.getAddresses() == null) {
-            extCpData.setAddresses(new ArrayList<>());
-        }
-        for (NetworkAddress networkAddress : extCpData.getAddresses()) {
-            if (ipAddress.equals(networkAddress.getIp())) {
-                return;
-            }
-        }
-        NetworkAddress address = new NetworkAddress();
-        address.setIp(ipAddress);
-        extCpData.getAddresses().add(address);
-    }
-
-    private VnfExtCpData createExtVirtualLinkData(List<VnfExtCpData> extCps, String cpdId) {
-        for (VnfExtCpData extCp : extCps) {
-            if (extCp.getCpdId().equals(cpdId)) {
-                return extCp;
-            }
-        }
-        VnfExtCpData extCp = new VnfExtCpData();
-        extCp.setCpdId(cpdId);
-        extCps.add(extCp);
-        return extCp;
-    }
-
-    private ExtVirtualLinkData createExtVirtualLinkData(AdditionalParameters additionalParameters, String virtualLinkId) {
-        ExtVirtualLinkData nonExistingVl = new ExtVirtualLinkData();
-        nonExistingVl.setExtVirtualLinkId(virtualLinkId);
-        additionalParameters.getExtVirtualLinks().add(nonExistingVl);
-        return nonExistingVl;
-    }
-}
\ No newline at end of file
diff --git a/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/SoV2LifecycleManager.java b/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/SoV2LifecycleManager.java
new file mode 100644 (file)
index 0000000..708f947
--- /dev/null
@@ -0,0 +1,421 @@
+/*
+ * Copyright 2016-2017, Nokia Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so;
+
+
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.nokia.cbam.lcm.v32.model.*;
+import com.nokia.cbam.lcm.v32.model.VnfInfo;
+import java.util.*;
+import java.util.stream.Collectors;
+import javax.servlet.http.HttpServletResponse;
+import org.onap.aai.model.GenericVnf;
+import org.onap.aai.model.VfModule;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.api.IPackageProvider;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.AAIExternalSystemInfoProvider;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.AAIRestApiProvider;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.SdcPackageProvider;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapR2HeatPackageBuilder;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.*;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.notification.LifecycleChangeNotificationManager;
+import org.onap.vnfmadapter.so.v2.model.*;
+import org.onap.vnfmdriver.model.ExtVirtualLinkInfo;
+import org.onap.vnfmdriver.model.*;
+import org.onap.vnfmdriver.model.ScaleDirection;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+import org.yaml.snakeyaml.Yaml;
+
+import static java.util.Optional.empty;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toMap;
+
+import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.OnapR2HeatPackageBuilder.*;
+import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.*;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Responsible for providing access to AAI APIs.
+ * Handles authentication and mandatory parameters.
+ */
+@Component
+public class SoV2LifecycleManager implements ISoV2LifecycleManager{
+    private static Logger logger = getLogger(SoV2LifecycleManager.class);
+    private final LifecycleManager lifecycleManager;
+    private final CbamRestApiProvider cbamRestApiProvider;
+    private final JobManager jobManager;
+    private final AAIRestApiProvider aaiRestApiProvider;
+    private final AAIExternalSystemInfoProvider aaiExternalSystemInfoProvider;
+    private final IPackageProvider packageProvider;
+
+    @Autowired
+    SoV2LifecycleManager(LifecycleManagerForSo lifecycleManager, CbamRestApiProviderForSo cbamRestApiProvider, JobManagerForSo jobManager, AAIRestApiProvider aaiRestApiProvider, AAIExternalSystemInfoProvider aaiExternalSystemInfoProvider, SdcPackageProvider packageProvider) {
+        this.lifecycleManager = lifecycleManager;
+        this.cbamRestApiProvider = cbamRestApiProvider;
+        this.jobManager = jobManager;
+        this.aaiRestApiProvider = aaiRestApiProvider;
+        this.aaiExternalSystemInfoProvider = aaiExternalSystemInfoProvider;
+        this.packageProvider = packageProvider;
+    }
+
+    @Override
+    public void createVnf(String vnfIdInAai, SoV2VnfCreateRequest request, HttpServletResponse httpResponse) {
+        GenericVnf genericVnf = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnf(vnfIdInAai, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        VnfmInfo vnfmInfo = locateVnfm(genericVnf);
+        Optional<com.nokia.cbam.lcm.v32.model.VnfInfo> matchingVnf = locateVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        if (request.isFailIfExists() != null && request.isFailIfExists()) {
+            if (matchingVnf.isPresent()) {
+                throw buildFatalFailure(logger, "The VNF with " + vnfIdInAai + " identifier in A&AI can not be found in the VNFM");
+            }
+        }
+        String vnfIdInVnfm = null;
+        if (!matchingVnf.isPresent()) {
+            try {
+                LifecycleManager.VnfCreationResult creationResult = lifecycleManager.create(vnfmInfo.getVnfmId(), genericVnf.getModelVersionId(), request.getName(), vnfIdInAai);
+                vnfIdInVnfm = creationResult.getVnfInfo().getId();
+            } catch (Exception e) {
+                logger.warn("Unable to create VNF with " + vnfIdInAai + " identifier in AAI", e);
+                cleanUpVnf(vnfIdInAai, vnfmInfo, request, httpResponse);
+            }
+        } else {
+            vnfIdInVnfm = matchingVnf.get().getId();
+        }
+        try {
+            com.nokia.cbam.lcm.v32.model.VnfInfo vnfAfterCreation = cbamRestApiProvider.getCbamLcmApi(vnfmInfo.getVnfmId()).vnfsVnfInstanceIdGet(vnfIdInVnfm, CbamRestApiProvider.NOKIA_LCM_API_VERSION).blockingFirst();
+            updateModifiableAttributes(vnfmInfo.getVnfmId(), vnfAfterCreation, request.getInputs());
+            String vimId = request.getCloudOwner() + SEPARATOR + request.getRegionName();
+            List<ExtVirtualLinkInfo> externalVirtualLinks = addExtVirtualLinks(vimId, request.getInputs());
+            JsonObject operationAdditionalParameters = new JsonObject();
+            operationAdditionalParameters.addProperty("vimId", vimId);
+            AdditionalParameters additionalParameters = buildAdditionalParameters(request, genericVnf, vimId);
+            String etsiVnfdId = packageProvider.getCbamVnfdId(genericVnf.getModelVersionId());
+            if (!vnfAfterCreation.getInstantiationState().equals(InstantiationState.INSTANTIATED)) {
+                lifecycleManager.instantiate(vnfmInfo.getVnfmId(), externalVirtualLinks, httpResponse, operationAdditionalParameters, additionalParameters, vnfIdInVnfm, genericVnf.getModelVersionId(), etsiVnfdId);
+                logger.info("The VNF in VNFM with " + vnfIdInAai + " identifier in A&AI and " + vnfIdInVnfm + " identifier in VNFM has been instantiated");
+            } else {
+                logger.info("The VNF in VNFM with " + vnfIdInAai + " identifier in A&AI and " + vnfIdInVnfm + " identifier in VNFM is already instantiated");
+            }
+        } catch (Exception e) {
+            logger.warn("The VNF in VNFM with " + vnfIdInAai + " identifier in A&AI and " + vnfIdInVnfm + " identifier in VNFM can not be instantiated", e);
+            cleanUpVnf(vnfIdInAai, vnfmInfo, request, httpResponse);
+        }
+    }
+
+    @Override
+    public SoV2VnfQueryResponse queryVnf(String vnfIdInAai, SoV2VnfQueryRequest request, HttpServletResponse httpResponse) {
+        GenericVnf genericVnf = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnf(vnfIdInAai, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        VnfmInfo vnfmInfo = locateVnfm(genericVnf);
+        Optional<com.nokia.cbam.lcm.v32.model.VnfInfo> matchingVnf = locateVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        SoV2VnfQueryResponse response = new SoV2VnfQueryResponse();
+        response.setStatus(getStatus(vnfmInfo, matchingVnf));
+        return response;
+    }
+
+    private SoVnfStatus getStatus(VnfmInfo vnfmInfo, Optional<VnfInfo> matchingVnf) {
+        if(matchingVnf.isPresent()){
+            OperationExecution lastOperation = findLastOperation(vnfmInfo.getVnfmId(), matchingVnf.get().getId());
+            if(lastOperation.getStatus().equals(OperationStatus.FINISHED)){
+                return SoVnfStatus.ACTIVE;
+            }
+            else if(lastOperation.getStatus().equals(OperationStatus.FAILED)){
+                return SoVnfStatus.FAILED;
+            }
+            else {
+                return SoVnfStatus.UNKNOWN;
+            }
+        }
+        else{
+            return SoVnfStatus.NOTFOUND;
+        }
+    }
+
+    private void cleanUpVnf(String vnfIdInAai, VnfmInfo vnfmInfo, SoV2VnfCreateRequest request, HttpServletResponse httpServletResponse) {
+        if(request.isDeleteUponFailure() != null && request.isDeleteUponFailure()) {
+            logger.info("Cleaning up the VNF in VNFM with " + vnfIdInAai + " identifier in A&AI");
+            SoV2VnfDeleteRequest deleteRequest = new SoV2VnfDeleteRequest();
+            deleteRequest.setMsoRequest(request.getMsoRequest());
+            delete(vnfIdInAai, deleteRequest, httpServletResponse);
+        }
+    }
+
+    private AdditionalParameters buildAdditionalParameters(SoV2VnfCreateRequest request, GenericVnf genericVnf, String vimId) {
+        AdditionalParameters additionalParameters = new AdditionalParameters();
+        buildZones(additionalParameters, vimId, request.getInputs());
+        JsonObject cbamVnfd = new Gson().toJsonTree(new Yaml().load(packageProvider.getCbamVnfdId(genericVnf.getModelVersionId()))).getAsJsonObject();
+        VduMappings vduMappings = getVduToVirtualComputeDescriptoId(cbamVnfd);
+        buildFlavours(vimId, additionalParameters, request.getInputs(), vduMappings.vduIdToVirtualComputeId);
+        buildExtenstions(request, additionalParameters);
+        buildImages(vimId, vduMappings, additionalParameters, request.getInputs());
+        setInstantiationLevel(cbamVnfd, additionalParameters);
+        return additionalParameters;
+    }
+
+    private List<ExtVirtualLinkInfo> addExtVirtualLinks(String vimId, SoInput inputs) {
+        List<ExtVirtualLinkInfo> externalVirtualLinks = new ArrayList<>();
+        for (Map.Entry<String, String> netInput : filterInput(inputs, ".*" + NET_ID)) {
+            ExtVirtualLinkInfo vl = new ExtVirtualLinkInfo();
+            String ecpId = netInput.getKey().replaceAll(NET_ID + "$", "");
+            vl.setVim(new ExtVirtualLinkInfoVim());
+            vl.getVim().setVimid(vimId);
+            vl.setResourceId(netInput.getValue());
+            vl.setCpdId(ecpId);
+            externalVirtualLinks.add(vl);
+        }
+        return externalVirtualLinks;
+    }
+
+    private void setInstantiationLevel(JsonObject cbamVnfd, AdditionalParameters additionalParameters) {
+        JsonObject topologyTemplate = child(cbamVnfd, "topology_template");
+        JsonObject substitutionMappings = child(topologyTemplate, "substitution_mappings");
+        JsonObject deploymentFlavor = child(child(substitutionMappings, "capabilities"), "deployment_flavour");
+        String defaultInstantiationLevel = childElement(child(deploymentFlavor, "properties"), "default_instantiation_level_id").getAsString();
+        additionalParameters.setInstantiationLevel(defaultInstantiationLevel);
+    }
+
+    private void buildImages(String vimId, VduMappings vduMappings, AdditionalParameters additionalParameters, SoInput inputs) {
+        for (Map.Entry<String, String> imageInput : filterInput(inputs, ".*" + IMAGE_NAME)) {
+            String vduName = imageInput.getKey().replace(IMAGE_NAME, "");
+            if (vduMappings.vduIdToVirtualSoftwareId.containsKey(vduName)) {
+                VimSoftwareImage image = new VimSoftwareImage();
+                image.setVimId(vimId);
+                image.setResourceId(imageInput.getKey());
+                image.setVnfdSoftwareImageId(vduMappings.vduIdToVirtualSoftwareId.get(vduName));
+                additionalParameters.getSoftwareImages().add(image);
+            }
+        }
+    }
+
+    private void buildExtenstions(SoV2VnfCreateRequest request, AdditionalParameters additionalParameters) {
+        for (Map.Entry<String, String> extenstion : filterInput(request.getInputs(), ".*" + ETSI_MODIFIABLE_ATTRIBUTES_EXTENSTION)) {
+            VnfProperty property = new VnfProperty();
+            property.setName(extenstion.getKey().replace(ETSI_MODIFIABLE_ATTRIBUTES_EXTENSTION, ""));
+            property.setValue(extenstion.getValue());
+            additionalParameters.getExtensions().add(property);
+        }
+    }
+
+    private static class VduMappings {
+        HashMap<String, String> vduIdToVirtualComputeId = new HashMap<>();
+        HashMap<String, String> vduIdToVirtualSoftwareId = new HashMap<>();
+    }
+
+    private VduMappings getVduToVirtualComputeDescriptoId(JsonObject root) {
+        VduMappings vduMappings = new VduMappings();
+        JsonObject topologyTemplate = child(root, "topology_template");
+        JsonObject nodeTemplates = child(topologyTemplate, "node_templates");
+        for (Map.Entry<String, JsonElement> vdu : OnapR2HeatPackageBuilder.filterType(nodeTemplates, "tosca.nodes.nfv.VDU")) {
+            boolean found = false;
+            for (JsonElement requirement : childElement(vdu.getValue().getAsJsonObject(), "requirements").getAsJsonArray()) {
+                if (requirement.getAsJsonObject().has("virtual_compute")) {
+                    vduMappings.vduIdToVirtualComputeId.put(vdu.getKey(), requirement.getAsJsonObject().get("virtual_compute").getAsString());
+                    found = true;
+                }
+                if (requirement.getAsJsonObject().has("sw_image")) {
+                    vduMappings.vduIdToVirtualSoftwareId.put(vdu.getKey(), requirement.getAsJsonObject().get("sw_image").getAsString());
+                }
+            }
+            if (!found) {
+                throw buildFatalFailure(logger, "Unable to find virtualComputeDescriptor for " + vdu.getKey() + " identifier");
+            }
+        }
+        return vduMappings;
+    }
+
+    private void buildFlavours(String vimId, AdditionalParameters additionalParameters, SoInput inputs, Map<String, String> vduToVirtualComputeDescriptoId) {
+        for (Map.Entry<String, String> input : filterInput(inputs, ".*_flavor_name")) {
+            String vduName = input.getKey().replaceAll("_flavor_name$", "");
+            VimComputeResourceFlavour flavor = new VimComputeResourceFlavour();
+            flavor.setVimId(vimId);
+            flavor.setVnfdVirtualComputeDescId(vduToVirtualComputeDescriptoId.get(vduName));
+            flavor.setResourceId(input.getValue());
+            additionalParameters.getComputeResourceFlavours().add(flavor);
+        }
+    }
+
+    private Set<Map.Entry<String, String>> filterInput(SoInput input, String pattern) {
+        return input.entrySet().stream().filter(i -> i.getKey().matches(pattern)).collect(Collectors.toSet());
+    }
+
+    private void buildZones(AdditionalParameters additionalParameters, String vimId, SoInput inputs) {
+        for (Map.Entry<String, String> input : filterInput(inputs, "availability_zone_[0-9]*")) {
+            ZoneInfo zone = new ZoneInfo();
+            zone.setId(input.getKey());
+            zone.setResourceId(input.getValue());
+            zone.setVimId(vimId);
+            additionalParameters.getZones().add(zone);
+        }
+    }
+
+    private OperationExecution findLastOperation(String vnfmId, String vnfIdInVnfm) {
+        List<OperationExecution> operationExecutions = cbamRestApiProvider.getCbamLcmApi(vnfmId).vnfsVnfInstanceIdOperationExecutionsGet(vnfIdInVnfm, CbamRestApiProvider.NOKIA_LCM_API_VERSION).blockingFirst();
+        return LifecycleChangeNotificationManager.NEWEST_OPERATIONS_FIRST.sortedCopy(operationExecutions).get(0);
+    }
+
+    @Override
+    public void delete(String vnfIdInAai, SoV2VnfDeleteRequest request, HttpServletResponse httpServletResponse) {
+        GenericVnf genericVnf = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnf(vnfIdInAai, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        VnfmInfo vnfmInfo = locateVnfm(genericVnf);
+        Optional<com.nokia.cbam.lcm.v32.model.VnfInfo> matchingVnf = locateVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        if (matchingVnf.isPresent()) {
+            VnfTerminateRequest terminateRequest = new VnfTerminateRequest();
+            terminateRequest.setTerminationType(VnfTerminationType.GRACEFUL);
+            terminateRequest.setGracefulTerminationTimeout(Long.valueOf(60 * 60 * 1000L).toString());
+            jobManager.waitForJobToFinish(lifecycleManager.terminateAndDelete(vnfmInfo.getVnfmId(), matchingVnf.get().getId(), terminateRequest, httpServletResponse));
+        }
+    }
+
+    @Override
+    public void rollback(String vnfIdInAai, SoV2RollbackVnfUpdate rollback, HttpServletResponse httpServletResponse) {
+        GenericVnf genericVnf = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnf(vnfIdInAai, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        VnfmInfo vnfmInfo = locateVnfm(genericVnf);
+        VnfInfo vnfInfo = expectVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        ModifyVnfInfoRequest request= new ModifyVnfInfoRequest();
+        request.setExtensions(buildExtension(rollback.getOriginalVnfProperties()));
+        lifecycleManager.executeModifyVnfInfo(vnfmInfo.getVnfmId(), vnfInfo.getId(), request);
+    }
+
+    @Override
+    public void createVfModule(String vnfIdInAai, String vfModuleId, SoV2VfModuleCreateRequest request, HttpServletResponse httpResponse) {
+        GenericVnf genericVnf = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnf(vnfIdInAai, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        VnfmInfo vnfmInfo = locateVnfm(genericVnf);
+        VnfInfo vnfInfo = expectVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        healVnfIfRequired(vnfIdInAai, httpResponse, vnfmInfo, vnfInfo);
+        executeScale(request.getScalingAspectId(), httpResponse, genericVnf, vnfmInfo, vnfInfo);
+    }
+
+    @Override
+    public void deleteVfModule(String vnfIdInAai, String vfModuleId, SoV2VnfDeleteRequest request, HttpServletResponse httpResponse) {
+        GenericVnf genericVnf = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnf(vnfIdInAai, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        VnfmInfo vnfmInfo = locateVnfm(genericVnf);
+        VnfInfo vnfInfo = expectVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        VfModule vfModule = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnfVfModulesVfModule(genericVnf.getVnfId(), vfModuleId, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        String aspectId = vfModule.getHeatStackId();
+        executeScale(aspectId, httpResponse, genericVnf, vnfmInfo, vnfInfo);
+        healVnfIfRequired(vnfIdInAai, httpResponse, vnfmInfo, vnfInfo);
+    }
+
+    @Override
+    public SoV2VnfUpdateResponse updateVfModule(String vnfIdInAai, String vfModuleId, SoV2VnfUpdateRequest request, HttpServletResponse httpResponse) {
+        return updateVnf(vnfIdInAai, request, httpResponse);
+    }
+
+    private void executeScale(String aspectId, HttpServletResponse httpResponse, GenericVnf genericVnf, VnfmInfo vnfmInfo, VnfInfo vnfInfo) {
+        ScaleInfo scaleInfo = vnfInfo.getInstantiatedVnfInfo().getScaleStatus().stream().filter(s -> s.getAspect().equals(aspectId)).findFirst().get();
+        long expectedStepCount = genericVnf.getVfModules().stream().filter(m -> m.getHeatStackId().equals(aspectId)).count();
+        if(expectedStepCount != scaleInfo.getScaleLevel().longValue()){
+            VnfScaleRequest scaleRequest = new VnfScaleRequest();
+            scaleRequest.setAspectId(aspectId);
+            scaleRequest.setType(expectedStepCount > scaleInfo.getScaleLevel().longValue() ? ScaleDirection.OUT : ScaleDirection.IN);
+            scaleRequest.setNumberOfSteps(Long.valueOf(Math.abs(expectedStepCount - scaleInfo.getScaleLevel().longValue())).toString());
+            JobInfo jobInfo = lifecycleManager.scaleVnf(vnfmInfo.getVnfmId(), vnfInfo.getId(), scaleRequest, httpResponse);
+            jobManager.waitForJobToFinish(jobInfo);
+        }
+    }
+
+    private void healVnfIfRequired(String vnfIdInAai, HttpServletResponse httpResponse, VnfmInfo vnfmInfo, VnfInfo vnfInfo) {
+        OperationExecution lastOperation = findLastOperation(vnfmInfo.getVnfmId(), vnfIdInAai);
+        if(lastOperation.getStatus().equals(OperationStatus.FAILED)){
+            VnfHealRequest healRequest = new VnfHealRequest();
+            healRequest.setAffectedvm(new VnfHealRequestAffectedvm());
+            healRequest.setAction("reboot");
+            JobInfo jobInfo = lifecycleManager.healVnf(vnfmInfo.getVnfmId(), vnfInfo.getId(), healRequest, empty(), httpResponse);
+            jobManager.waitForJobToFinish(jobInfo);
+        }
+    }
+
+    @Override
+    public SoV2VnfUpdateResponse updateVnf(String vnfIdInAai, SoV2VnfUpdateRequest request, HttpServletResponse httpResponse) {
+        GenericVnf genericVnf = aaiRestApiProvider.getNetworkApi().getNetworkGenericVnfsGenericVnf(vnfIdInAai, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null).blockingFirst();
+        VnfmInfo vnfmInfo = locateVnfm(genericVnf);
+        Optional<com.nokia.cbam.lcm.v32.model.VnfInfo> matchingVnf = locateVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        Map<String, String> specifiedExtensions = collecSpecifiedExtensions(request.getInputs());
+        SoV2VnfUpdateResponse response = new SoV2VnfUpdateResponse();
+        Map<String, String> existingProperties = matchingVnf.get().getExtensions().stream().filter(p -> specifiedExtensions.containsKey(p.getName())).collect(Collectors.toMap(vnfProperty -> vnfProperty.getName(), vnfProperty -> vnfProperty.getValue().toString()));
+        response.setOriginalVnfProperties(new OriginalVnfProperties());
+        response.getOriginalVnfProperties().putAll(existingProperties);
+        if(matchingVnf.isPresent()){
+            try{
+                ModifyVnfInfoRequest modifyRequest = new ModifyVnfInfoRequest();
+                modifyRequest.setExtensions(buildExtension(specifiedExtensions));
+                lifecycleManager.executeModifyVnfInfo(vnfmInfo.getVnfmId(), matchingVnf.get().getId(), modifyRequest);
+                response.setSuccessful(true);
+            }
+            catch (Exception e){
+                response.setSuccessful(false);
+            }
+            return response;
+        }
+        else{
+            throw buildFatalFailure(logger, "No VNF with " + vnfIdInAai + " identifier in A&AI exists in the VNFM");
+        }
+    }
+
+    private List<VnfProperty> buildExtension(Map<String, String> specifiedExtensions) {
+        return specifiedExtensions.entrySet().stream().map(e -> {
+            VnfProperty p = new VnfProperty();
+            p.setName(e.getKey());
+            p.setValue(e.getValue());
+            return p;
+        }).collect(toList());
+    }
+
+    private void updateModifiableAttributes(String vnfmId, com.nokia.cbam.lcm.v32.model.VnfInfo vnfInfo, SoInput inputs) {
+        ModifyVnfInfoRequest request = new ModifyVnfInfoRequest();
+        request.setExtensions(new ArrayList<>());
+        Map<String, String> specifedExtensions = collecSpecifiedExtensions(inputs);
+        for (Map.Entry<String, String> specifiedExtension : specifedExtensions.entrySet()) {
+            Optional<VnfProperty> exactProperty = vnfInfo.getExtensions().stream().filter(p -> p.getName().equals(specifiedExtension.getKey()) && p.getValue().equals(specifiedExtension.getValue())).findFirst();
+            if (!exactProperty.isPresent()) {
+                VnfProperty onapCsarIdProperty = new VnfProperty();
+                onapCsarIdProperty.setName(specifiedExtension.getKey());
+                onapCsarIdProperty.setValue(specifiedExtension.getValue());
+                request.getExtensions().add(onapCsarIdProperty);
+            }
+        }
+        if (!request.getExtensions().isEmpty()) {
+            lifecycleManager.executeModifyVnfInfo(vnfmId, vnfInfo.getId(), request);
+        }
+    }
+
+    private Map<String, String> collecSpecifiedExtensions(SoInput inputs) {
+        return inputs.entrySet().stream().filter(i -> i.getKey().startsWith("etsi.modifiableAttribute.")).collect(toMap(i -> i.getKey().replace("etsi.modifiableAttribute.", ""), i -> i.getValue()));
+    }
+
+    private Optional<com.nokia.cbam.lcm.v32.model.VnfInfo> locateVnfBasedOnAaiVnfId(String vnfIdInAai, VnfmInfo vnfmInfo) {
+        return cbamRestApiProvider.getCbamLcmApi(vnfmInfo.getVnfmId()).vnfsGet(CbamRestApiProvider.NOKIA_LCM_API_VERSION).blockingFirst().stream().filter(vnf -> vnf.getDescription().equals(vnfIdInAai)).findFirst();
+    }
+
+    private com.nokia.cbam.lcm.v32.model.VnfInfo expectVnfBasedOnAaiVnfId(String vnfIdInAai, VnfmInfo vnfmInfo) {
+        Optional<VnfInfo> vnfInfo = locateVnfBasedOnAaiVnfId(vnfIdInAai, vnfmInfo);
+        if(!vnfInfo.isPresent()){
+            throw buildFatalFailure(logger, "Unable to locate VNF with " + vnfIdInAai + " A&AI identifier in VNFM");
+        }
+        return vnfInfo.get();
+    }
+
+    private VnfmInfo locateVnfm(GenericVnf vnf) {
+        for (String vnfmId : aaiExternalSystemInfoProvider.getVnfms()) {
+            VnfmInfo vnfmInfo = aaiExternalSystemInfoProvider.queryVnfmInfoFromSource(vnfmId);
+            if (vnfmInfo.getType().equals(vnf.getNfType())) {
+                return vnfmInfo;
+            }
+        }
+        throw buildFatalFailure(logger, "Unable to locate a VNFM for VNF with " + vnf.getVnfId() + " identifier with " + vnf.getNfType() + " type");
+    }
+}
\ No newline at end of file
diff --git a/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapR2HeatPackageBuilder.java b/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/packagetransformer/OnapR2HeatPackageBuilder.java
new file mode 100644 (file)
index 0000000..f437a90
--- /dev/null
@@ -0,0 +1,216 @@
+/*
+ * Copyright 2016-2017, Nokia Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer;
+
+import com.google.common.collect.Sets;
+import com.google.gson.*;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.LifecycleManager;
+import org.slf4j.Logger;
+import org.yaml.snakeyaml.Yaml;
+
+import static java.util.stream.Collectors.toSet;
+
+import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.CbamUtils.*;
+import static org.slf4j.LoggerFactory.getLogger;
+
+/**
+ * Transforms a CBAM package into an ONAP package
+ */
+public class OnapR2HeatPackageBuilder {
+    public static final String ETSI_MODIFIABLE_ATTRIBUTES_EXTENSTION = "etsi_modifiable_attributes_extenstion_";
+    public static final String IMAGE_NAME = "_image_name";
+    public static final String FLAVOR_NAME = "_flavor_name";
+    public static final String NET_ID = "_net_id";
+    private static Logger logger = getLogger(OnapR2HeatPackageBuilder.class);
+    public static final String BASE_ENV_FILE_NAME = "base.env";
+    public static final String BASE_YAML_FILE_NAME = "base.yaml";
+
+    private Set<String> autoManagedExtensions = Sets.newHashSet(LifecycleManager.ONAP_CSAR_ID, LifecycleManager.EXTERNAL_VNFM_ID);
+
+    Map<String, String> processVnfd(String cbamVnfd) {
+        Map<String, String> files = new HashMap<>();
+        JsonObject root = new Gson().toJsonTree(new Yaml().load(cbamVnfd)).getAsJsonObject();
+        JsonObject topologyTemplate = child(root, "topology_template");
+        JsonObject substitutionMappings = child(topologyTemplate, "substitution_mappings");
+        JsonObject capabilities = child(substitutionMappings, "capabilities");
+        JsonObject deploymentFlavour = child(capabilities, "deployment_flavour");
+        JsonArray policies = childElement(topologyTemplate, "policies").getAsJsonArray();
+        JsonObject manifest = new JsonObject();
+        manifest.addProperty("name", "ONAP VNF package");
+        manifest.addProperty("description", "");
+        JsonArray data = new JsonArray();
+        manifest.add("data", data);
+        JsonObject deploymentFlavorProperties = child(deploymentFlavour, "properties");
+        if (deploymentFlavorProperties.has("scaling_aspects")) {
+            JsonObject scalingAspects = child(deploymentFlavorProperties, "scaling_aspects");
+            for (Map.Entry<String, JsonElement> scalingAspect : scalingAspects.entrySet()) {
+                processAspect(files, data, policies, scalingAspect.getKey(), childElement(scalingAspect.getValue().getAsJsonObject(), "max_scale_level").getAsLong());
+            }
+        }
+        processBaseIncrement(topologyTemplate, files, policies, data);
+        files.put("MANIFEST.json", new GsonBuilder().setPrettyPrinting().create().toJson(manifest));
+        return files;
+    }
+
+    private void processBaseIncrement(JsonObject topologyTemplate, Map<String, String> files, JsonArray policies, JsonArray data) {
+        StringBuilder envContent = prepareEvnContent();
+        StringBuilder yamlContent = prepareYamlContent();
+        if (topologyTemplate.has("node_templates")) {
+            JsonObject nodeTemplates = child(topologyTemplate, "node_templates");
+            processEcps(nodeTemplates, envContent, yamlContent);
+            for (Map.Entry<String, JsonElement> vdu : filterType(nodeTemplates, "tosca.nodes.nfv.VDU")) {
+                addImageAndFlavor(envContent, yamlContent, vdu);
+            }
+        }
+        processModifiableAttributes(topologyTemplate, envContent, yamlContent);
+        data.add(buildManifestEntry(BASE_ENV_FILE_NAME, BASE_YAML_FILE_NAME, true));
+        files.put(BASE_ENV_FILE_NAME, envContent.toString());
+        files.put(BASE_YAML_FILE_NAME, yamlContent.toString());
+    }
+
+    private void processModifiableAttributes(JsonObject topologyTemplate, StringBuilder envContent, StringBuilder yamlContent) {
+        JsonObject capabilities = child(child(topologyTemplate, "substitution_mappings"), "capabilities");
+        if (capabilities.has("vnf")) {
+            JsonObject vnf = child(capabilities, "vnf");
+            if (vnf.has("properties")) {
+                JsonObject properties = child(vnf, "properties");
+                if (properties.has("modifiable_attributes")) {
+                    JsonObject modifiableAttributes = child(properties, "modifiable_attributes");
+                    if (modifiableAttributes.has("extensions")) {
+                        JsonObject extensions = child(modifiableAttributes, "extensions");
+                        for (Map.Entry<String, JsonElement> extension : extensions.entrySet()) {
+                            if (!autoManagedExtensions.contains(extension.getKey())) {
+                                addParameter(yamlContent, envContent, ETSI_MODIFIABLE_ATTRIBUTES_EXTENSTION + extension.getKey(), "Modifiable attribute", "Modifiable attribute for " + extension.getKey());
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    public static Set<Map.Entry<String, JsonElement>> filterType(JsonObject nodeTemplates, String type) {
+        return nodeTemplates.entrySet().stream().filter(e -> e.getValue().getAsJsonObject().get("type").equals(type)).collect(toSet());
+    }
+
+    private void processEcps(JsonObject nodeTemplates, StringBuilder envContent, StringBuilder yamlContent) {
+        for (Map.Entry<String, JsonElement> node : filterType(nodeTemplates, "tosca.nodes.nfv.ECP")) {
+            envContent.append("  " + node.getKey() + NET_ID + ": PUT YOUR NETWORK ID HERE\n");
+            addYamlParameter(yamlContent, node.getKey() + NET_ID, "Network id", "Network identifier for " + node.getKey() + " ECP");
+        }
+    }
+
+    private StringBuilder prepareYamlContent() {
+        StringBuilder yamlContent = new StringBuilder();
+        yamlContent.append("heat_template_version: 2013-05-23\n");
+        yamlContent.append("parameters:\n");
+        return yamlContent;
+    }
+
+    private void processAspect(Map<String, String> files, JsonArray data, JsonArray policies, String aspectName, long maxScaleLevel) {
+        JsonObject aspect = locateAspect(locateHeatPolicy(policies), aspectName);
+        StringBuilder envContent = prepareEvnContent();
+        StringBuilder yamlContent = prepareYamlContent();
+        if (aspect.has("vdus")) {
+            processMapping(aspect, envContent, yamlContent);
+        }
+        if (maxScaleLevel > 1001) {
+            throw buildFatalFailure(logger, "Refusing to create more than 1001 scaling levels");
+        }
+        envContent.append("  etsi.scalingAspectId: "+ aspectName + "\n");
+        for (int scaleIndex = 0; scaleIndex < maxScaleLevel; scaleIndex++) {
+            String envFileName = "module_" + aspectName + "_" + scaleIndex + ".env";
+            files.put(envFileName, envContent.toString());
+            String yamlFileName = "module_" + aspectName + "_" + scaleIndex + ".yaml";
+            files.put(yamlFileName, yamlContent.toString());
+            data.add(buildManifestEntry(envFileName, yamlFileName, false));
+        }
+    }
+
+    private StringBuilder prepareEvnContent() {
+        StringBuilder envContent = new StringBuilder();
+        envContent.append("parameters:\n");
+        return envContent;
+    }
+
+    private JsonObject buildManifestEntry(String envFileName, String yamlFileName, boolean base) {
+        JsonObject manifestEntry = new JsonObject();
+        manifestEntry.addProperty("file", yamlFileName);
+        manifestEntry.addProperty("type", "HEAT");
+        manifestEntry.addProperty("isBase", Boolean.toString(base));
+        JsonArray envEntries = new JsonArray();
+        manifestEntry.add("data", envEntries);
+        JsonObject envEntry = new JsonObject();
+        envEntries.add(envEntry);
+        envEntry.addProperty("file", envFileName);
+        envEntry.addProperty("type", "HEAT_ENV");
+        return manifestEntry;
+    }
+
+    private void processMapping(JsonObject mapping, StringBuilder envContent, StringBuilder yamlContent) {
+        for (Map.Entry<String, JsonElement> vdusElement : child(mapping, "vdus").entrySet()) {
+            addImageAndFlavor(envContent, yamlContent, vdusElement);
+        }
+        if (mapping.has("externalConnectionPoints")) {
+            for (Map.Entry<String, JsonElement> externalConnectionPoints : child(mapping, "externalConnectionPoints").entrySet()) {
+                addParameter(yamlContent, envContent, externalConnectionPoints.getKey() + "_net_id", "Network id", "Network to be used for " + externalConnectionPoints.getKey() + " ECP");
+                addParameter(yamlContent, envContent, externalConnectionPoints.getKey() + "_subnet_id", "Subnet id", "Subnet to be used for " + externalConnectionPoints.getKey() + " ECP");
+            }
+        }
+    }
+
+    private void addImageAndFlavor(StringBuilder envContent, StringBuilder yamlContent, Map.Entry<String, JsonElement> vdusElement) {
+        String vdu = vdusElement.getKey();
+        addParameter(yamlContent, envContent, vdu + IMAGE_NAME, "Image name or identifier", "Image to be used for " + vdu + " VDU");
+        addParameter(yamlContent, envContent, vdu + FLAVOR_NAME, "Flavor name or identifier", "Flavor to be used for " + vdu + " VDU");
+    }
+
+    private void addParameter(StringBuilder yamlContent, StringBuilder envContent, String key, String label, String description) {
+        addYamlParameter(yamlContent, key, label, description);
+        envContent.append("  " + key + ": PUT YOUR " + label.toUpperCase() + " HERE\n");
+    }
+
+    private void addYamlParameter(StringBuilder yamlContent, String key, String label, String description) {
+        yamlContent.append("  " + key + ":\n");
+        yamlContent.append("    type: string\n");
+        yamlContent.append("    label: " + label + "\n");
+        yamlContent.append("    description: " + description + "\n");
+    }
+
+    private JsonObject locateHeatPolicy(JsonArray policies) {
+        for (int index = 0; index < policies.size(); index++) {
+            JsonObject c = policies.get(index).getAsJsonObject();
+            JsonObject policy = c.getAsJsonObject().entrySet().iterator().next().getValue().getAsJsonObject();
+            if ("tosca.policies.nfv.HeatMapping".equals(childElement(policy, "type").getAsString())) {
+                return policy;
+            }
+        }
+        throw buildFatalFailure(logger, "The heat_mapping section is missing from VNFD");
+    }
+
+    private JsonObject locateAspect(JsonObject policy, String aspectName) {
+        for (Map.Entry<String, JsonElement> aspect : child(child(policy, "properties"), "aspects").entrySet()) {
+            if (aspect.getKey().equals(aspectName)) {
+                return aspect.getValue().getAsJsonObject();
+            }
+        }
+        throw buildFatalFailure(logger, "Unable to locate " + aspectName + " in heat policy");
+    }
+}
index 8de8234..70b18c5 100644 (file)
@@ -22,6 +22,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
+import java.util.Map;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipOutputStream;
 
@@ -41,7 +42,7 @@ public class OnapVnfPackageBuilder {
      * @param args not used (required due to signature)
      */
     public static void main(String[] args) throws Exception {
-        byte[] covert = new OnapVnfPackageBuilder().covert(systemFunctions().in(), SupportedOnapPackageVersions.V1);
+        byte[] covert = new OnapVnfPackageBuilder().covert(systemFunctions().in(), SupportedOnapPackageVersions.V1TOSCA);
         systemFunctions().out().write(covert);
     }
 
@@ -55,11 +56,35 @@ public class OnapVnfPackageBuilder {
         String vnfdLocation = getVnfdLocation(new ByteArrayInputStream(cbamVnfPackage));
         ByteArrayOutputStream vnfdContent = getFileInZip(new ByteArrayInputStream(cbamVnfPackage), vnfdLocation);
         byte[] cbamVnfdContent = vnfdContent.toByteArray();
-        String onapVnfd = SupportedOnapPackageVersions.V2 == version ?
-                new OnapR2VnfdBuilder().toOnapVnfd(new String(cbamVnfdContent, StandardCharsets.UTF_8)) :
-                new OnapR1VnfdBuilder().toOnapVnfd(new String(cbamVnfdContent, StandardCharsets.UTF_8));
         byte[] modifiedCbamPackage = new CbamVnfPackageBuilder().toModifiedCbamVnfPackage(cbamVnfPackage, vnfdLocation, new CbamVnfdBuilder().build(new String(cbamVnfdContent)));
-        return buildNewOnapPackage(modifiedCbamPackage, onapVnfd);
+        switch (version){
+            case V1TOSCA:
+            case V2TOSCA:
+                String onapVnfd = SupportedOnapPackageVersions.V2TOSCA == version ?
+                        new OnapR2VnfdBuilder().toOnapVnfd(new String(cbamVnfdContent, StandardCharsets.UTF_8)) :
+                        new OnapR1VnfdBuilder().toOnapVnfd(new String(cbamVnfdContent, StandardCharsets.UTF_8));
+                return buildNewOnapPackage(modifiedCbamPackage, onapVnfd);
+            case V2HEAT:
+            default:
+                Map<String, String> files = new OnapR2HeatPackageBuilder().processVnfd(new String(cbamVnfdContent));
+                return buildHeatOnapPackage(modifiedCbamPackage, files);
+        }
+
+    }
+
+    private byte [] buildHeatOnapPackage(byte [] modifiedCbamPackage, Map<String, String> heatFiles) throws IOException {
+        ByteArrayOutputStream result = new ByteArrayOutputStream();
+        ZipOutputStream out = new ZipOutputStream(result);
+        out.putNextEntry(new ZipEntry("Artifacts/Deployment/OTHER/cbam.package.zip"));
+        out.write(modifiedCbamPackage);
+        out.closeEntry();
+        for (Map.Entry<String, String> file : heatFiles.entrySet()) {
+            out.putNextEntry(new ZipEntry(file.getKey()));
+            out.write(file.getValue().getBytes());
+            out.closeEntry();
+        }
+        out.close();
+        return result.toByteArray();
     }
 
     private byte[] buildNewOnapPackage(byte[] modifiedCbamPackage, String onapVnfd) throws IOException {
index 545b2d9..b5f5a06 100644 (file)
@@ -20,6 +20,7 @@ package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer;
  * The supported ONAP package versions
  */
 public enum SupportedOnapPackageVersions {
-    V1,
-    V2
+    V1TOSCA,
+    V2TOSCA,
+    V2HEAT
 }
\ No newline at end of file
diff --git a/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/SoApi.java b/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/SoApi.java
deleted file mode 100644 (file)
index eb6c289..0000000
+++ /dev/null
@@ -1,174 +0,0 @@
-/*
- * Copyright 2016-2017, Nokia Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.restapi;
-
-import javax.servlet.http.HttpServletResponse;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so.SoLifecycleManager;
-import org.onap.vnfmadapter.so.model.*;
-import org.slf4j.Logger;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Controller;
-import org.springframework.web.bind.annotation.PathVariable;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.ResponseBody;
-
-import static javax.servlet.http.HttpServletResponse.SC_CREATED;
-
-import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.Constants.BASE_URL;
-import static org.slf4j.LoggerFactory.getLogger;
-import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
-import static org.springframework.web.bind.annotation.RequestMethod.*;
-
-/**
- * Responsible for providing the Nokia sVNFM REST APIs
- */
-@Controller
-@RequestMapping(value = BASE_URL + "/so")
-public class SoApi {
-    private static Logger logger = getLogger(SoApi.class);
-
-    private final SoLifecycleManager soLifecycleManager;
-
-    @Autowired
-    SoApi(SoLifecycleManager lifecycleManager) {
-        this.soLifecycleManager = lifecycleManager;
-    }
-
-    /**
-     * Create the VNF
-     *
-     * @param request      the creation request
-     * @param vnfmId       the identifier of the VNFM
-     * @param httpResponse the HTTP response
-     * @return the descriptor of the created VNF
-     */
-    @RequestMapping(value = "/{vnfmId}/vnfs", method = POST, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public SoVnfCreationResponse createVnf(@RequestBody SoVnfCreationRequest request, @PathVariable("vnfmId") String vnfmId, HttpServletResponse httpResponse) {
-        logger.info("REST: Create the VNF");
-        SoVnfCreationResponse response = soLifecycleManager.create(vnfmId, request);
-        httpResponse.setStatus(SC_CREATED);
-        return response;
-    }
-
-    /**
-     * Activate the VNF
-     *
-     * @param request      the activation request
-     * @param vnfmId       the identifier of the VNFM
-     * @param httpResponse the HTTP response
-     * @return the descriptor of the created VNF
-     */
-    @RequestMapping(value = "/{vnfmId}/vnfs/{vnfId}", method = POST, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public SoJobHandler activateVnf(@RequestBody SoVnfActivationRequest request, @PathVariable("vnfmId") String vnfmId, @PathVariable("vnfId") String vnfId, HttpServletResponse httpResponse) {
-        logger.info("REST: Activate the VNF");
-        return soLifecycleManager.activate(vnfmId, vnfId, request, httpResponse);
-    }
-
-    /**
-     * Execute custom operation on the VNF
-     *
-     * @param request      the custom operation request
-     * @param vnfmId       the identifier of the VNFM
-     * @param httpResponse the HTTP response
-     * @return the descriptor of the created VNF
-     */
-    @RequestMapping(value = "/{vnfmId}/vnfs/{vnfId}/customOperation", method = POST, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public SoJobHandler executeCustomOperation(@RequestBody SoVnfCustomOperation request, @PathVariable("vnfmId") String vnfmId, @PathVariable("vnfId") String vnfId, HttpServletResponse httpResponse) {
-        logger.info("REST: Execute custom operation on the VNF");
-        return soLifecycleManager.customOperation(vnfmId, vnfId, request, httpResponse);
-    }
-
-    /**
-     * Terminate the VNF
-     *
-     * @param request      the termination request
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param httpResponse the HTTP response
-     * @return the job representing the VNF termination operation
-     */
-    @RequestMapping(value = "/{vnfmId}/vnfs/{vnfId}/terminate", method = POST, produces = APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public SoJobHandler deactivateVnf(@RequestBody SoVnfTerminationRequest request, @PathVariable("vnfmId") String vnfmId, @PathVariable("vnfId") String vnfId, HttpServletResponse httpResponse) {
-        logger.info("REST: Deactivate the VNF");
-        return soLifecycleManager.deactivate(vnfmId, vnfId, request, httpResponse);
-    }
-
-    /**
-     * Delete the VNF
-     *
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param httpResponse the HTTP response
-     */
-    @RequestMapping(value = "/{vnfmId}/vnfs/{vnfId}", method = DELETE)
-    public void deleteVnf(@PathVariable("vnfmId") String vnfmId, @PathVariable("vnfId") String vnfId, HttpServletResponse httpResponse) {
-        logger.info("REST: Delete the VNF");
-        soLifecycleManager.delete(vnfmId, vnfId);
-        httpResponse.setStatus(HttpServletResponse.SC_NO_CONTENT);
-    }
-
-    /**
-     * Query the job
-     *
-     * @param jobId        the identifier of the job
-     * @param vnfmId       the identifier of the VNFM
-     * @param httpResponse the HTTP response
-     * @return the instantiated VNF info
-     */
-    @RequestMapping(value = "/{vnfmId}/jobs/{jobId}", method = GET, produces = APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public SoJobDetail getJob(@PathVariable("vnfmId") String vnfmId, @PathVariable("jobId") String jobId, HttpServletResponse httpResponse) {
-        logger.trace("REST: Query the job");
-        return soLifecycleManager.getJobDetails(vnfmId, jobId);
-    }
-
-    /**
-     * Scale the VNF (defined further in the VF-C driver integration documentation)
-     *
-     * @param request      the scaling request
-     * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
-     * @param httpResponse the HTTP response
-     * @return the job representing the scaling operation
-     */
-    @RequestMapping(value = "/{vnfmId}/vnfs/{vnfId}/scale", method = POST, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public SoJobHandler scaleVnf(@RequestBody SoVnfScaleRequest request, @PathVariable("vnfmId") String vnfmId, @PathVariable("vnfId") String vnfId, HttpServletResponse httpResponse) {
-        logger.info("REST: Scale the VNF");
-        return soLifecycleManager.scale(vnfmId, vnfId, request, httpResponse);
-    }
-
-    /**
-     * Heal the VNF (defined further in the VF-C driver integration documentation)
-     *
-     * @param request       the healing request
-     * @param vnfmId        the identifier of the VNFM
-     * @param vnfInstanceId the identifier of the VNF
-     * @param httpResponse  the HTTP response
-     * @return the job representing the healing operation
-     */
-    @RequestMapping(value = "/{vnfmId}/vnfs/{vnfId}/heal", method = POST, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
-    @ResponseBody
-    public SoJobHandler healVnf(@RequestBody SoVnfHealRequest request, @PathVariable("vnfmId") String vnfmId, @PathVariable("vnfId") String vnfInstanceId, HttpServletResponse httpResponse) {
-        logger.info("REST: Heal the VNF");
-        return soLifecycleManager.heal(vnfmId, vnfInstanceId, request, httpResponse);
-    }
-}
diff --git a/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/SoV2Api.java b/nokiav2/driver/src/main/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/SoV2Api.java
new file mode 100644 (file)
index 0000000..13d4ef8
--- /dev/null
@@ -0,0 +1,194 @@
+/*
+ * Copyright 2016-2017, Nokia Corporation
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.restapi;
+
+import javax.servlet.http.HttpServletResponse;
+import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so.SoV2LifecycleManager;
+import org.onap.vnfmadapter.so.v2.model.*;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import static javax.servlet.http.HttpServletResponse.SC_CREATED;
+import static javax.servlet.http.HttpServletResponse.SC_NO_CONTENT;
+
+import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.Constants.BASE_URL;
+import static org.slf4j.LoggerFactory.getLogger;
+import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
+import static org.springframework.web.bind.annotation.RequestMethod.*;
+
+/**
+ * Responsible for providing the Nokia sVNFM REST APIs
+ */
+@Controller
+@RequestMapping(value = BASE_URL + "/so/v2")
+public class SoV2Api {
+    private static Logger logger = getLogger(SoV2Api.class);
+
+    private final SoV2LifecycleManager soLifecycleManager;
+
+    @Autowired
+    SoV2Api(SoV2LifecycleManager lifecycleManager) {
+        this.soLifecycleManager = lifecycleManager;
+    }
+
+    /**
+     * Create the VNF
+     *
+     * @param request      the creation request
+     * @param vnfIdInAai   the identifier of the VNF in A&AI
+     * @param httpResponse the HTTP response
+     * @return the descriptor of the created VNF
+     */
+    @RequestMapping(value = "/vnfs/{vnfIdInAai}", method = POST, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public void createVnf(@RequestBody SoV2VnfCreateRequest request, @PathVariable("vnfIdInAai") String vnfIdInAai, HttpServletResponse httpResponse) {
+        logger.info("REST: Create the VNF");
+        soLifecycleManager.createVnf(vnfIdInAai, request, httpResponse);
+        httpResponse.setStatus(SC_NO_CONTENT);
+    }
+
+    /**
+     * Query the VNF
+     *
+     * @param request      the creation request
+     * @param vnfIdInAai   the identifier of the VNF in A&AI
+     * @param httpResponse the HTTP response
+     * @return the descriptor of the created VNF
+     */
+    @RequestMapping(value = "/vnfs/{vnfIdInAai}", method = POST, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public SoV2VnfQueryResponse queryVnf(@RequestBody SoV2VnfQueryRequest request, @PathVariable("vnfIdInAai") String vnfIdInAai, HttpServletResponse httpResponse) {
+        logger.info("REST: Create the VNF");
+        return soLifecycleManager.queryVnf(vnfIdInAai, request, httpResponse);
+    }
+
+    /**
+     * Terminate the VNF
+     *
+     * @param request      the termination request
+     * @param vnfIdInAai   the identifier of the VNF in A&AI
+     * @param httpResponse the HTTP response
+     * @return the job representing the VNF termination operation
+     */
+    @RequestMapping(value = "/vnfs/{vnfIdInAai}", method = DELETE, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public void delete(@RequestBody SoV2VnfDeleteRequest request, @PathVariable("vnfIdInAai") String vnfIdInAai, HttpServletResponse httpResponse) {
+        logger.info("REST: Deactivate the VNF");
+        soLifecycleManager.delete(vnfIdInAai, request, httpResponse);
+        httpResponse.setStatus(SC_NO_CONTENT);
+    }
+
+    /**
+     * Update the VNF
+     *
+     * @param request      the creation request
+     * @param vnfIdInAai   the identifier of the VNF in A&AI
+     * @param httpResponse the HTTP response
+     * @return the descriptor of the created VNF
+     */
+    @RequestMapping(value = "/vnfs/{vnfIdInAai}", method = PUT, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public SoV2VnfUpdateResponse updateVnf(@RequestBody SoV2VnfUpdateRequest request, @PathVariable("vnfIdInAai") String vnfIdInAai, HttpServletResponse httpResponse) {
+        logger.info("REST: Update the VNF");
+        return soLifecycleManager.updateVnf(vnfIdInAai, request, httpResponse);
+    }
+
+    /**
+     * Rollback update VNF
+     *
+     * @param request      the rollback request
+     * @param httpResponse the HTTP response
+     */
+    @RequestMapping(value = "/vnfs/{vnfIdInAai}/rollback", method = POST, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public void rollback(@RequestBody SoV2RollbackVnfUpdate request, @PathVariable("vnfIdInAai") String vnfIdInAai, HttpServletResponse httpResponse) {
+        logger.info("REST: Create the VF");
+        soLifecycleManager.rollback(vnfIdInAai, request, httpResponse);
+    }
+
+    /**
+     * Create the VF module
+     *
+     * @param request      the creation request
+     * @param vnfIdInAai   the identifier of the VNF in A&AI
+     * @param httpResponse the HTTP response
+     */
+    @RequestMapping(value = "/vfmodule/{vnfIdInAai}/{vfModuleId}", method = POST, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public void createVfModule(@RequestBody SoV2VfModuleCreateRequest request, @PathVariable("vnfIdInAai") String vnfIdInAai, @PathVariable("vfModuleId") String vfModuleId, HttpServletResponse httpResponse) {
+        logger.info("REST: Create the VF");
+        soLifecycleManager.createVfModule(vnfIdInAai, vfModuleId, request, httpResponse);
+        httpResponse.setStatus(SC_CREATED);
+    }
+
+    /**
+     * Terminate the VF module
+     *
+     * @param request      the termination request
+     * @param vnfIdInAai   the identifier of the VNF in A&AI
+     * @param httpResponse the HTTP response
+     */
+    @RequestMapping(value = "/vfmodule/{vnfIdInAai}/{vfModuleId}", method = DELETE, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public void deleteVfModule(@RequestBody SoV2VnfDeleteRequest request, @PathVariable("vnfIdInAai") String vnfIdInAai, @PathVariable("vfModuleId") String vfModuleId, HttpServletResponse httpResponse) {
+        logger.info("REST: Deactivate the VNF");
+        soLifecycleManager.deleteVfModule(vnfIdInAai, vfModuleId, request, httpResponse);
+        httpResponse.setStatus(SC_NO_CONTENT);
+    }
+
+    /**
+     * Update the VF module
+     *
+     * @param request      the creation request
+     * @param vnfIdInAai   the identifier of the VNF in A&AI
+     * @param httpResponse the HTTP response
+     * @return the descriptor of the created VNF
+     */
+    @RequestMapping(value = "/vfmodule/{vnfIdInAai}/{vfModuleId}", method = PUT, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public SoV2VnfUpdateResponse updateVfModule(@RequestBody SoV2VnfUpdateRequest request, @PathVariable("vnfIdInAai") String vnfIdInAai, @PathVariable("vfModuleId") String vfModuleId, HttpServletResponse httpResponse) {
+        logger.info("REST: Update the VNF");
+        return soLifecycleManager.updateVfModule(vnfIdInAai, vfModuleId, request, httpResponse);
+    }
+
+    /**
+     * Rollback update VNF
+     *
+     * @param request      the rollback request
+     * @param httpResponse the HTTP response
+     */
+    @RequestMapping(value = "/vfmodule/{vnfIdInAai}/{vfModuleId}/rollback", method = PUT, produces = APPLICATION_JSON_VALUE, consumes = APPLICATION_JSON_VALUE)
+    @ResponseBody
+    public void rollbackVfModuleUpdate(@RequestBody SoV2RollbackVnfUpdate request, @PathVariable("vnfIdInAai") String vnfIdInAai, HttpServletResponse httpResponse) {
+        logger.info("REST: Roll back VF module update");
+        soLifecycleManager.rollback(vnfIdInAai, request, httpResponse);
+    }
+
+    /**
+     * Provides a probe for SO to test health of VNFM adapter
+     *
+     * @param httpResponse the HTTP response
+     */
+    @RequestMapping(value = "/ping", method = GET)
+    public void testLcnConnectivity(HttpServletResponse httpResponse) {
+        httpResponse.setStatus(HttpServletResponse.SC_OK);
+    }
+}
index 5895108..d1ec9e0 100644 (file)
@@ -23,7 +23,6 @@ import java.util.*;
  * Represents the additional parameters to be sent during instantiation from VF-C to the driver
  */
 public class AdditionalParameters {
-    private VimInfoTypeEnum vimType;
     private String instantiationLevel;
     private List<VimComputeResourceFlavour> computeResourceFlavours = new ArrayList<>();
     private List<ZoneInfo> zones = new ArrayList<>();
@@ -33,7 +32,6 @@ public class AdditionalParameters {
     private List<ExtVirtualLinkData> extVirtualLinks = new ArrayList<>();
     private List<VnfProperty> extensions = new ArrayList<>();
     private Object additionalParams;
-    private String domain;
 
     public AdditionalParameters() {
         //only used through reflection (gson)
@@ -53,20 +51,6 @@ public class AdditionalParameters {
         this.additionalParams = additionalParams;
     }
 
-    /**
-     * @return the type of the VIM
-     */
-    public VimInfoTypeEnum getVimType() {
-        return vimType;
-    }
-
-    /**
-     * @param vimType the type of the VIM
-     */
-    public void setVimType(VimInfoTypeEnum vimType) {
-        this.vimType = vimType;
-    }
-
     /**
      * @return the flavours to be used for the VNF
      */
@@ -159,14 +143,6 @@ public class AdditionalParameters {
         this.extVirtualLinks = extVirtualLinks;
     }
 
-    public String getDomain() {
-        return domain;
-    }
-
-    public void setDomain(String domain) {
-        this.domain = domain;
-    }
-
     /**
      * @return the extensions of the VNF modifiable attributes
      */
@@ -188,8 +164,7 @@ public class AdditionalParameters {
         if (this == o) return true;
         if (o == null || getClass() != o.getClass()) return false;
         AdditionalParameters that = (AdditionalParameters) o;
-        return vimType == that.vimType &&
-                Objects.equals(domain, that.domain) &&
+        return
                 Objects.equals(instantiationLevel, that.instantiationLevel) &&
                 Objects.equals(computeResourceFlavours, that.computeResourceFlavours) &&
                 Objects.equals(zones, that.zones) &&
@@ -203,13 +178,12 @@ public class AdditionalParameters {
 
     @Override
     public int hashCode() {
-        return Objects.hash(vimType, domain, instantiationLevel, computeResourceFlavours, zones, softwareImages, extManagedVirtualLinks, externalConnectionPointAddresses, extVirtualLinks, extensions, additionalParams);
+        return Objects.hash(instantiationLevel, computeResourceFlavours, zones, softwareImages, extManagedVirtualLinks, externalConnectionPointAddresses, extVirtualLinks, extensions, additionalParams);
     }
 
     @Override
     public String toString() {
         return "AdditionalParameters{" +
-                "vimType=" + vimType +
                 ", instantiationLevel='" + instantiationLevel + '\'' +
                 ", computeResourceFlavours=" + computeResourceFlavours +
                 ", zones=" + zones +
@@ -219,7 +193,6 @@ public class AdditionalParameters {
                 ", extVirtualLinks=" + extVirtualLinks +
                 ", extensions=" + extensions +
                 ", additionalParams=" + additionalParams +
-                ", domain='" + domain + '\'' +
                 '}';
     }
 }
\ No newline at end of file
index 34dce14..c7d1977 100644 (file)
@@ -27,10 +27,7 @@ import com.nokia.cbam.lcm.v32.model.VnfInfo;
 import java.util.*;
 import javax.servlet.http.HttpServletResponse;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.core.SelfRegistrationManager;
-import org.onap.vnfmdriver.model.JobDetailInfo;
-import org.onap.vnfmdriver.model.JobDetailInfoResponseDescriptor;
-import org.onap.vnfmdriver.model.JobResponseInfo;
-import org.onap.vnfmdriver.model.JobStatus;
+import org.onap.vnfmdriver.model.*;
 import org.slf4j.Logger;
 
 import static javax.servlet.http.HttpServletResponse.SC_SERVICE_UNAVAILABLE;
@@ -183,6 +180,15 @@ public class JobManager {
         }
     }
 
+    public void waitForJobToFinish(JobInfo jobInfo) {
+        while(true){
+            if(ongoingJobs.contains(jobInfo.getJobId())){
+                return;
+            }
+            systemFunctions().sleep(500L);
+        }
+    }
+
     private JobDetailInfo getJobDetailInfoForMissingVnf(String jobId) {
         if (ongoingJobs.contains(jobId)) {
             return reportOngoing(jobId);
index 7c8e231..8e72d68 100644 (file)
@@ -37,6 +37,7 @@ import org.onap.vnfmdriver.model.*;
 import org.onap.vnfmdriver.model.VimInfo;
 import org.onap.vnfmdriver.model.VnfInfo;
 import org.slf4j.Logger;
+import org.springframework.util.StringUtils;
 import org.yaml.snakeyaml.Yaml;
 
 import static java.lang.Integer.parseInt;
@@ -176,7 +177,6 @@ public class LifecycleManager {
     @SuppressWarnings("squid:S00107") //wrapping them into an object makes the code less readable
     public VnfInstantiateResponse instantiate(String vnfmId, List<ExtVirtualLinkInfo> externalVirtualLinks, HttpServletResponse httpResponse, Object operationAdditionalParameters, AdditionalParameters additionalParameters, String vnfId, String onapVnfdId, String vnfmVnfdId) {
         logOperationInput(vnfId, "instantiation", additionalParameters);
-        validateVimType(additionalParameters.getVimType());
         VnfInstantiateResponse response = new VnfInstantiateResponse();
         response.setVnfInstanceId(vnfId);
         String vimId = getVimId(operationAdditionalParameters);
@@ -212,7 +212,6 @@ public class LifecycleManager {
      */
     public VnfInstantiateResponse createAndInstantiate(String vnfmId, VnfInstantiateRequest request, HttpServletResponse httpResponse) {
         AdditionalParameters additionalParameters = convertInstantiationAdditionalParams(request.getVnfPackageId(), request.getAdditionalParam());
-        validateVimType(additionalParameters.getVimType());
         VnfCreationResult creationResult = create(vnfmId, request.getVnfDescriptorId(), request.getVnfInstanceName(), request.getVnfInstanceDescription());
         return instantiate(vnfmId, request.getExtVirtualLink(), httpResponse, request.getAdditionalParam(), additionalParameters, creationResult.vnfInfo.getId(), request.getVnfPackageId(), creationResult.vnfdId);
     }
@@ -268,31 +267,18 @@ public class LifecycleManager {
     }
 
     private com.nokia.cbam.lcm.v32.model.VimInfo addVim(AdditionalParameters additionalParameters, String vimId, GrantVNFResponseVim vim, VimInfo vimInfo) {
-        if (additionalParameters.getVimType() == OPENSTACK_V2_INFO) {
-            return buildOpenStackV2INFO(vimId, vim, vimInfo);
-
-        } else if (additionalParameters.getVimType() == OPENSTACK_V3_INFO) {
-            if (isEmpty(vimInfo.getDomain())) {
-                if (isEmpty(additionalParameters.getDomain())) {
-                    throw buildFatalFailure(logger, "The cloud did not supply the cloud domain (Amsterdam release) and was not supplied as additional data");
-                } else {
-                    logger.warn("Setting domain from additional parameters");
-                    vimInfo.setDomain(additionalParameters.getDomain());
-                }
+        if (vimInfo.getType().equals("openstack")) {
+            if (StringUtils.isEmpty(vimInfo.getDomain())) {
+                return buildOpenStackV2INFO(vimId, vim, vimInfo);
+            } else {
+                return buildOpenStackV3INFO(vimId, vim, vimInfo);
             }
-            return buildOpenStackV3INFO(vimId, vim, vimInfo);
         } else {
             //OTHER VIM TYPE is not possible
             return buildVcloudInfo(vimId, vimInfo);
         }
     }
 
-    private void validateVimType(com.nokia.cbam.lcm.v32.model.VimInfo.VimInfoTypeEnum vimType) {
-        if (com.nokia.cbam.lcm.v32.model.VimInfo.VimInfoTypeEnum.OTHER_VIM_INFO.equals(vimType)) {
-            throw buildFatalFailure(logger, "Only " + OPENSTACK_V2_INFO + ", " + OPENSTACK_V3_INFO + " and " + VMWARE_VCLOUD_INFO + " is the supported VIM types");
-        }
-    }
-
     private String getVimId(Object additionalParams) {
         return childElement(new Gson().toJsonTree(additionalParams).getAsJsonObject(), "vimId").getAsString();
     }
@@ -367,7 +353,7 @@ public class LifecycleManager {
         executeModifyVnfInfo(vnfmId, vnfId, request);
     }
 
-    private void executeModifyVnfInfo(String vnfmId, String vnfId, ModifyVnfInfoRequest request) {
+    public void executeModifyVnfInfo(String vnfmId, String vnfId, ModifyVnfInfoRequest request) {
         try {
             OperationExecution operationExecution = cbamRestApiProvider.getCbamLcmApi(vnfmId).vnfsVnfInstanceIdPatch(vnfId, request, NOKIA_LCM_API_VERSION).blockingFirst();
             waitForOperationToFinish(vnfmId, vnfId, operationExecution.getId());
@@ -459,16 +445,16 @@ public class LifecycleManager {
      * </ul>
      *
      * @param vnfmId       the identifier of the VNFM
-     * @param vnfId        the identifier of the VNF
+     * @param vnfIdInVnfm  the identifier of the VNF in VNFM
      * @param request      the termination request
      * @param httpResponse the HTTP response
      * @return the job for polling the progress of the termination
      */
-    public JobInfo terminateAndDelete(String vnfmId, String vnfId, VnfTerminateRequest request, HttpServletResponse httpResponse) {
-        logOperationInput(vnfId, "termination", request);
-        return scheduleExecution(vnfId, httpResponse, "terminateVnf", jobInfo -> {
-            terminateVnf(vnfmId, vnfId, request, jobInfo);
-            deleteVnf(vnfmId, vnfId);
+    public JobInfo terminateAndDelete(String vnfmId, String vnfIdInVnfm, VnfTerminateRequest request, HttpServletResponse httpResponse) {
+        logOperationInput(vnfIdInVnfm, "termination", request);
+        return scheduleExecution(vnfIdInVnfm, httpResponse, "terminateVnf", jobInfo -> {
+            terminateVnf(vnfmId, vnfIdInVnfm, request, jobInfo);
+            deleteVnf(vnfmId, vnfIdInVnfm);
         });
     }
 
@@ -528,12 +514,12 @@ public class LifecycleManager {
      * Delete the VNF
      *
      * @param vnfmId the identifier of the VNFM
-     * @param vnfId  the identifier fo the VNF
+     * @param vnfIdInVnfm  the identifier fo the VNF
      */
-    public void deleteVnf(String vnfmId, String vnfId) {
-        logger.info("Deleting VNF with {} identifier", vnfId);
-        cbamRestApiProvider.getCbamLcmApi(vnfmId).vnfsVnfInstanceIdDelete(vnfId, NOKIA_LCM_API_VERSION).blockingFirst(null);
-        logger.info("The VNF with {} identifier has been deleted", vnfId);
+    public void deleteVnf(String vnfmId, String vnfIdInVnfm) {
+        logger.info("Deleting VNF with {} identifier", vnfIdInVnfm);
+        cbamRestApiProvider.getCbamLcmApi(vnfmId).vnfsVnfInstanceIdDelete(vnfIdInVnfm, NOKIA_LCM_API_VERSION).blockingFirst(null);
+        logger.info("The VNF with {} identifier has been deleted", vnfIdInVnfm);
     }
 
     private String getVimIdFromInstantiationRequest(String vnfmId, com.nokia.cbam.lcm.v32.model.VnfInfo vnf) {
index 2645cd0..680fee4 100644 (file)
     "version": "1.1.0"
   },
   "definitions": {
-    "SoJobHandler": {
-      "type": "object",
-      "properties": {
-        "jobId": {
-          "required": true,
-          "description": "The identifier of the job",
-          "type": "string"
-        }
-      }
-    },
-    "SoJobStatus": {
-      "description": "The status of the job",
-      "type": "string",
-      "enum": [
-        "started",
-        "finished",
-        "failed"
-      ]
-    },
-    "SoJobDetail": {
-      "allOf": [
-        {
-          "$ref": "#/definitions/SoJobHandler"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "status": {
-              "required": true,
-              "description": "The status of the job",
-              "$ref": "#/definitions/SoJobStatus"
-            },
-            "description": {
-              "required": true,
-              "description": "The description of the current state of the job",
-              "type": "string"
-            }
-          }
-        }
-      ]
-    },
-    "SoVnfCreationRequest": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "required": true,
-          "description": "The name of the VNF",
-          "type": "string"
-        },
-        "csarId": {
-          "required": true,
-          "description": "The identifier of the VNF package in SDC",
-          "type": "string"
-        },
-        "description": {
-          "required": false,
-          "description": "The description of the VNF",
-          "type": "string"
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoVnfCreationResponse": {
-      "type": "object",
-      "properties": {
-        "vnfId": {
-          "required": true,
-          "description": "The identifier of the created VNF",
-          "type": "string"
-        }
-      }
-    },
-    "SoVduMapping": {
-      "type": "object",
-      "properties": {
-        "vduId": {
-          "required": true,
-          "description": "The identifier of the VDU within the VNF package",
-          "type": "string"
-        },
-        "imageId": {
-          "required": true,
-          "description": "The provider id of the image to be used for the VDU",
-          "type": "string"
-        },
-        "flavourId": {
-          "required": true,
-          "description": "The provider id of the flavour to be used for the VDU",
-          "type": "string"
-        }
-      }
-    },
-    "SoServerMapping": {
-      "type": "object",
-      "description": "Maps a server instance to a VDU and availability zone",
-      "properties": {
-        "vduId": {
-          "required": true,
-          "description": "The identifier of the VDU",
-          "type": "string"
-        },
-        "availabilityZoneId": {
-          "required": false,
-          "description": "The provider id of the availability zone to be used for the server instance",
-          "type": "string"
-        }
-      }
-    },
-    "SoAssignedAddresses": {
-      "type": "object",
-      "properties": {
-        "cpdId": {
-          "required": true,
-          "description": "The identifier of the connection point descriptor",
-          "type": "string"
-        },
-        "ipAddress": {
-          "required": true,
-          "description": "The IP address to be used",
-          "type": "string"
-        }
-      }
-    },
-    "SoNetworkMapping": {
-      "type": "object",
-      "properties": {
-        "vldId": {
-          "required": true,
-          "description": "The identifier of the network in the VNF package",
-          "type": "string"
-        },
-        "networkProviderId": {
-          "required": true,
-          "description": "The provider id of the network be used for the given purpose",
-          "type": "string"
-        },
-        "assignedAddresses": {
-          "required": true,
-          "description": "The assigned network addresses",
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/SoAssignedAddresses"
-          }
-        }
-      }
-    },
-    "SoVnfActivationRequest": {
-      "type": "object",
-      "properties": {
-        "vimId": {
-          "required": true,
-          "type": "string",
-          "description": "The identifier of the VIM on which the VNF is to be instantiated"
-        },
-        "serverMappings": {
-          "required": true,
-          "description": "The server mappings",
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/SoServerMapping"
-          }
-        },
-        "vduMappings": {
-          "required": true,
-          "description": "The VDU mappings",
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/SoVduMapping"
-          }
-        },
-        "networkMappings": {
-          "required": true,
-          "description": "The network mappings",
-          "type": "array",
-          "items": {
-            "$ref": "#/definitions/SoNetworkMapping"
-          }
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoScaleDirection": {
-      "description": "The direction of the scale",
-      "type": "string",
-      "enum": [
-        "in",
-        "out"
-      ]
-    },
-    "SoVnfScaleRequest": {
-      "type": "object",
-      "properties": {
-        "aspectId": {
-          "type": "string",
-          "description": "The identifier of the scaling aspect in the VNF package"
-        },
-        "steps": {
-          "type": "integer",
-          "description": "The expected absolute scale level"
-        },
-        "direction": {
-          "required": true,
-          "description": "The direction of the scale",
-          "$ref": "#/definitions/SoScaleDirection"
-        },
-        "serverMappings": {
-          "required": true,
-          "description": "The server mappings",
-          "items": {
-            "$ref": "#/definitions/SoServerMapping"
-          }
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoVnfCustomOperation": {
-      "type": "object",
-      "properties": {
-        "operationId": {
-          "required": true,
-          "type": "string",
-          "description": "The identifier of the custom operation"
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoVnfHealRequest": {
-      "type": "object",
-      "properties": {
-        "vnfcId": {
-          "type": "string",
-          "description": "The identifier of the VNFC to be healed"
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoTerminationMode": {
-      "description": "The way in which the VNF is terminated",
-      "type": "string",
-      "enum": [
-        "forceful",
-        "graceful"
-      ]
-    },
-    "SoVnfTerminationRequest": {
-      "type": "object",
-      "properties": {
-        "mode": {
-          "required": true,
-          "description": "The VNF termination mode",
-          "$ref": "#/definitions/SoTerminationMode"
-        },
-        "gracefulTerminationTimeoutInMs": {
-          "required": false,
-          "type": "integer",
-          "description": "The timeout for graceful termination. After the timeout has expired forceful termination is attempted."
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
     "JobDetailInfo": {
       "properties": {
         "jobId": {
     "VnfLifecycleChangeNotification": {
       "type": "object",
       "description": "The lifecycle change notifications send from CBAM"
+    },
+    "SoMsoRequest": {
+      "type": "object",
+      "properties": {
+        "requestId": {
+          "required": true,
+          "description": "The identifier of the request in SO. Used to track requests.",
+          "type": "string"
+        },
+        "serviceInstanceId": {
+          "required": true,
+          "description": "The identifier of the service instance in A&AI.",
+          "type": "string"
+        }
+      }
+    },
+    "SoV2VnfQueryRequest": {
+      "type": "object",
+      "properties": {
+        "msoRequest": {
+          "required": true,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoVnfStatus": {
+      "description": "The status of the VNF",
+      "type": "string",
+      "enum": [
+        "ACTIVE",
+        "FAILED",
+        "NOTFOUND",
+        "UNKNOWN"
+      ]
+    },
+    "SoOutput": {
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      }
+    },
+    "SoInput": {
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      }
+    },
+    "SoV2VnfQueryResponse": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "required": true,
+          "description": "The status of the VNF",
+          "$ref": "#/definitions/SoVnfStatus"
+        }
+      }
+    },
+    "SoV2VnfCreateRequest": {
+      "type": "object",
+      "properties": {
+        "cloudOwner": {
+          "required": true,
+          "type": "string",
+          "description": "The owner of cloud in A&AI."
+        },
+        "regionName": {
+          "required": true,
+          "type": "string",
+          "description": "The regionName of cloud in A&AI."
+        },
+        "tenantId": {
+          "required": true,
+          "type": "string",
+          "description": "The identifier of the tenant."
+        },
+        "name": {
+          "required": true,
+          "type": "string",
+          "description": "The name of the VNF."
+        },
+        "inputs": {
+          "required": false,
+          "description": "The inputs of the VNF.",
+          "$ref": "#/definitions/SoInput"
+        },
+        "failIfExists": {
+          "required": false,
+          "description": "Should the VNF creation fail if the VNF already exists. (defaults to false)",
+          "type": "boolean"
+        },
+        "deleteUponFailure": {
+          "required": false,
+          "description": "Delete VNF in case of failure. (defaults to false)",
+          "type": "boolean"
+        },
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoMsoRollback": {
+      "type": "object",
+      "description": "Generic rollback parameters",
+      "properties": {
+        "deleteIfExists": {
+          "required": true,
+          "description": "Delete the VNF if exists",
+          "type": "boolean"
+        },
+        "vnfIdInAai": {
+          "required": true,
+          "description": "The identifier of the VNF in AAI",
+          "type": "string"
+        },
+        "msoRequest": {
+          "required": true,
+          "description": "The pointer to the original request that triggered the rollback",
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "OriginalVnfProperties": {
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      }
+    },
+    "SoV2RollbackVnfUpdate": {
+      "allOf": [
+        {
+          "$ref": "#/definitions/SoMsoRollback"
+        },
+        {
+          "type": "object",
+          "properties": {
+            "originalVnfProperties": {
+              "required": false,
+              "description": "The original VNF properties before the operation",
+              "$ref": "#/definitions/OriginalVnfProperties"
+            }
+          }
+        }
+      ]
+    },
+    "SoV2VnfUpdateRequest": {
+      "type": "object",
+      "properties": {
+        "inputs": {
+          "required": false,
+          "description": "The inputs of the VNF.",
+          "$ref": "#/definitions/SoInput"
+        },
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoV2VnfUpdateResponse": {
+      "allOf": [
+        {
+          "$ref": "#/definitions/SoV2RollbackVnfUpdate"
+        },
+        {
+          "type": "object",
+          "properties": {
+            "successful": {
+              "required": true,
+              "description": "Is the update successful. The operation can be rolled back regardless of this attribute",
+              "type": "boolean"
+            }
+          }
+        }
+      ]
+    },
+    "SoV2VnfDeleteRequest": {
+      "type": "object",
+      "properties": {
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoV2VfModuleCreateRequest": {
+      "type": "object",
+      "properties": {
+        "scalingAspectId": {
+          "required": true,
+          "description": "The identifier of the scaling aspect",
+          "type": "string"
+        },
+        "inputs": {
+          "required": false,
+          "description": "The inputs of the VNF.",
+          "$ref": "#/definitions/SoInput"
+        },
+        "failIfExists": {
+          "required": false,
+          "description": "Should the VNF creation fail if the VNF already exists. (defaults to false)",
+          "type": "boolean"
+        },
+        "deleteUponFailure": {
+          "required": false,
+          "description": "Delete VF module in case of failure. (defaults to false)",
+          "type": "boolean"
+        },
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
     }
   },
   "paths": {
         }
       }
     },
-    "/so/{vnfmId}/vnfs": {
+    "/so/v2/ping": {
+      "get": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "Test VNFM driver health",
+        "description": "Test VNFM driver health",
+        "responses": {
+          "204": {
+            "description": "VNFM adapter is healthy"
+          }
+        }
+      }
+    },
+    "/so/v2/vnfs/{vnfIdInAai}/rollback": {
       "post": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
         ],
-        "summary": "VNF create",
-        "description": "VNF create",
-        "operationId": "vnf_create",
+        "summary": "Rollback VNF update operation",
+        "description": "Rollback VNF update operation",
+        "operationId": "rollback",
         "consumes": [
           "application/json"
         ],
-        "produces": [
-          "application/json"
-        ],
         "parameters": [
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
             "in": "body",
             "name": "body",
-            "description": "VNF creation request parameter",
+            "description": "Rollback parameters",
             "required": true,
             "schema": {
-              "$ref": "#/definitions/SoVnfCreationRequest"
+              "$ref": "#/definitions/SoV2RollbackVnfUpdate"
             }
           }
         ],
         "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoVnfCreationResponse"
-            }
+          "204": {
+            "description": "Operation has been rolled back"
           }
         }
       }
     },
-    "/so/{vnfmId}/vnfs/{vnfId}": {
-      "post": {
+    "/so/v2/vnfs/{vnfIdInAai}": {
+      "get": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
         ],
-        "summary": "VNF activation",
-        "description": "VNF activation",
-        "operationId": "vnf_activate",
+        "summary": "VNF query",
+        "description": "VNF query",
+        "operationId": "vnf_query",
         "consumes": [
           "application/json"
         ],
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
+            "description": "The identifier of the VNF in A&AI.",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
             "in": "body",
             "name": "body",
-            "description": "instantiate request param",
+            "description": "VNF creation query parameter",
             "required": true,
             "schema": {
-              "$ref": "#/definitions/SoVnfActivationRequest"
+              "$ref": "#/definitions/SoV2VnfQueryRequest"
             }
           }
         ],
           "201": {
             "description": "",
             "schema": {
-              "$ref": "#/definitions/SoJobHandler"
+              "$ref": "#/definitions/SoV2VnfQueryResponse"
             }
+          },
+          "404": {
+            "descriotion": "The VNF does not exist on the VNFM side"
           }
         }
       },
-      "delete": {
+      "post": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VNF create",
+        "description": "VNF create",
+        "operationId": "vnf_create",
+        "consumes": [
+          "application/json"
         ],
-        "summary": "Deletes VNF",
-        "description": "Deletes the VNF. If the VNF was instantiated VNF termination must be called before VNF deletion",
-        "operationId": "delete_vnf",
         "parameters": [
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
+            "in": "body",
+            "name": "body",
+            "description": "VNF creation query parameter",
             "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
-            "in": "path"
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfCreateRequest"
+            }
           }
         ],
         "responses": {
           "204": {
-            "description": "The VNF was deleted successfully"
+            "description": "The VNF was created on the VNFM side."
+          },
+          "400": {
+            "description": "The VNF could not be instantiated on the VNFM side. Failure has been treated according to deleteUponFailure parameter"
           }
         }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}/scale": {
-      "post": {
+      },
+      "put": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
         ],
-        "summary": "VNF scale",
-        "description": "VNF scale request",
-        "operationId": "vnf_scale",
+        "summary": "VNF update",
+        "description": "VNF update",
+        "operationId": "vnf_update",
         "consumes": [
           "application/json"
         ],
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
             "in": "path"
           },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF update parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfUpdateRequest"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "The VNF update has finished. Success is indicated in the success field.",
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfUpdateResponse"
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VNF delete",
+        "description": "VNF delete",
+        "operationId": "vnf_delete",
+        "consumes": [
+          "application/json"
+        ],
+        "parameters": [
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
             "in": "body",
             "name": "body",
-            "description": "VNF scale request parameters",
+            "description": "VNF delete parameter",
             "required": true,
             "schema": {
-              "$ref": "#/definitions/SoVnfScaleRequest"
+              "$ref": "#/definitions/SoV2VnfDeleteRequest"
             }
           }
         ],
         "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
+          "204": {
+            "description": "The VNF was successfully deleted."
           }
         }
       }
     },
-    "/so/{vnfmId}/vnfs/{vnfId}/customOperation": {
+    "/so/v2/vfmodule/{vnfIdInAai}/{vfModuleId}": {
       "post": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
         ],
-        "summary": "VNF scale",
-        "description": "VNF scale request",
-        "operationId": "vnf_scale",
+        "summary": "VF module create",
+        "description": "VF module create",
+        "operationId": "vf_module_create",
         "consumes": [
           "application/json"
         ],
-        "produces": [
-          "application/json"
-        ],
         "parameters": [
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
             "in": "path"
           },
           {
             "in": "body",
             "name": "body",
-            "description": "VNF scale request parameters",
+            "description": "VNF creation query parameter",
             "required": true,
             "schema": {
-              "$ref": "#/definitions/SoVnfCustomOperation"
+              "$ref": "#/definitions/SoV2VfModuleCreateRequest"
             }
           }
         ],
         "responses": {
           "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
+            "description": "The VF module has been created"
           }
         }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}/heal": {
-      "post": {
+      },
+      "put": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
         ],
-        "summary": "VNF heal",
-        "description": "VNF heal",
-        "operationId": "vnf_heal",
+        "summary": "VF module update",
+        "description": "VF module update",
+        "operationId": "vf_module_update",
         "consumes": [
           "application/json"
         ],
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
             "in": "path"
           },
           {
             "in": "body",
             "name": "body",
-            "description": "VNF heal request parameters",
+            "description": "VNF creation query parameter",
             "required": true,
             "schema": {
-              "$ref": "#/definitions/SoVnfHealRequest"
+              "$ref": "#/definitions/SoV2VnfUpdateRequest"
             }
           }
         ],
         "responses": {
           "201": {
-            "description": "",
             "schema": {
-              "$ref": "#/definitions/SoJobHandler"
+              "$ref": "#/definitions/SoV2VnfUpdateResponse"
             }
           }
         }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}/terminate": {
-      "post": {
+      },
+      "delete": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
         ],
-        "summary": "VNF terminate",
-        "description": "VNF terminate",
-        "operationId": "vnf_terminate",
+        "summary": "VF module delete",
+        "description": "VF module delete",
+        "operationId": "vf_module_delete",
         "consumes": [
           "application/json"
         ],
-        "produces": [
-          "application/json"
-        ],
         "parameters": [
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
             "in": "path"
           },
           {
             "in": "body",
             "name": "body",
-            "description": "VNF termination request parameters",
+            "description": "VNF delete parameter",
             "required": true,
             "schema": {
-              "$ref": "#/definitions/SoVnfTerminationRequest"
+              "$ref": "#/definitions/SoV2VnfDeleteRequest"
             }
           }
         ],
         "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
+          "204": {
+            "description": "The VNF was successfully deleted."
           }
         }
       }
     },
-    "/so/{vnfmId}/jobs/{jobId}": {
-      "get": {
+    "/so/v2/vfmodule/{vnfIdInAai}/{vfModuleId}/rollback": {
+      "put": {
         "tags": [
-          "SO VNFM Adaptor"
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VF module update rollback",
+        "description": "VF module update rollback",
+        "operationId": "vf_module_update rollback",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
         ],
-        "summary": "Query job status",
-        "description": "Query the job status",
-        "operationId": "get_jobstatus",
         "parameters": [
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
             "in": "path"
           },
           {
             "required": true,
             "type": "string",
-            "description": "The identifier of the job",
-            "name": "jobId",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
             "in": "path"
-          }
-        ],
-        "responses": {
-          "202": {
-            "description": "The details of a job",
-            "schema": {
-              "$ref": "#/definitions/SoJobDetail"
-            }
           },
-          "404": {
-            "description": "The job is unknown to the VNFM. The VNFM does not keep finished jobs for forever.",
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF update rollback parameter",
+            "required": true,
             "schema": {
-              "$ref": "#/definitions/SoJobDetail"
+              "$ref": "#/definitions/SoV2RollbackVnfUpdate"
             }
           }
+        ],
+        "responses": {
+          "204": {
+            "description": "Operation has been rolled back"
+          }
         }
       }
     }
index ace9d2e..907b566 100644 (file)
@@ -6,8 +6,9 @@
     Select CBAM package to upload:
     <input type="file" name="fileToUpload" id="fileToUpload"> ONAP package version:
     <select name="version">
-      <option value="V1">V1</option>
-      <option value="V2" selected="selected">V2</option>
+      <option value="V1TOSCA">V1TOSCA</option>
+      <option value="V2TOSCA" selected="selected">V2TOSCA</option>
+      <option value="V2HEAT">V2HEAT</option>
     </select>
     <input type="submit" value="Upload" name="submit">
 </form>
index b37d95f..61919e0 100644 (file)
@@ -26,7 +26,6 @@ import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.TestAAIRestApiProvi
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.TestGrantlessGrantManager;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.TestSdcPackageProvider;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.notification.*;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so.TestSoLifecycleManager;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.vfc.*;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.packagetransformer.*;
 import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.restapi.*;
@@ -58,8 +57,6 @@ import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.notification.TestReportedA
         TestGrantlessGrantManager.class,
         TestSdcPackageProvider.class,
 
-        TestSoLifecycleManager.class,
-
         TestVfcExternalSystemInfoProvider.class,
         TestVfcGrantManager.class,
         TestVfcPackageProvider.class,
index a284f28..457d468 100644 (file)
@@ -52,50 +52,6 @@ public class CTDirectReal {
     public void testBasicWorkflow() throws Exception {
         SystemFunctions.systemFunctions().sleep(10000000 * 1000L);
 
-        VimInfo nokia_regionOne = externalSystemInfoProvider.getVimInfo("Nokia_RegionOne");
-
-        VnfLifecycleChangeNotification recievedNot = new VnfLifecycleChangeNotification();
-        recievedNot.setVnfInstanceId("CBAM-d8deb02a7a51449dba576ac9eabb55b8");
-        ReportedAffectedConnectionPoints affectedConnectionPoints = new ReportedAffectedConnectionPoints();
-        recievedNot.setAffectedVirtualLinks(new ArrayList<>());
-        AffectedVirtualLink link = new AffectedVirtualLink();
-        recievedNot.getAffectedVirtualLinks().add(link);
-        link.setId("vlid1");
-        link.setChangeType(ChangeType.REMOVED);
-        link.setVirtualLinkDescId("vldId1");
-        link.setResource(new ResourceHandle());
-        link.getResource().setResourceId("netProviderId1");
-        link.getResource().setAdditionalData(additionalData("name", "networkName"));
-        recievedNot.setAffectedVnfcs(new ArrayList<>());
-        AffectedVnfc vnfc = new AffectedVnfc();
-        vnfc.setId("myVnfcId1");
-        vnfc.setChangeType(ChangeType.ADDED);
-        vnfc.setVduId("myVduId");
-        vnfc.setStorageResourceIds(new ArrayList<>());
-        vnfc.setComputeResource(new ResourceHandle());
-        vnfc.getComputeResource().setResourceId("serverProvId1");
-        JsonObject additionalData = additionalData("name", "serverName");
-        additionalData.addProperty("tenantId", "de8fd0d1d5874503a47b920c10f4322a");
-        vnfc.getComputeResource().setAdditionalData(additionalData);
-        recievedNot.getAffectedVnfcs().add(vnfc);
-        ReportedAffectedCp addedCp = new ReportedAffectedCp();
-        addedCp.setCpId("cpId");
-        addedCp.setIpAddress("1.2.3.4");
-        addedCp.setMacAddress("a:b:c:d:e:f");
-        addedCp.setNetworkProviderId("netProviderId1");
-        addedCp.setServerProviderId("serverProvId1");
-        addedCp.setProviderId("portId");
-        addedCp.setTenantId("de8fd0d1d5874503a47b920c10f4322a");
-        addedCp.setCpdId("cpdId");
-        affectedConnectionPoints.getPost().add(addedCp);
-        notificationProcessor.processNotification(recievedNot, null, of(affectedConnectionPoints), "Nokia_RegionOne", "vnfmId");
-    }
-
-    JsonObject additionalData(String key, String value) {
-        JsonObject jsonObject = new JsonObject();
-        jsonObject.addProperty(key, value);
-        return jsonObject;
     }
 
-
 }
diff --git a/nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/TestSoLifecycleManager.java b/nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/onap/so/TestSoLifecycleManager.java
deleted file mode 100644 (file)
index 582b41d..0000000
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- * Copyright 2016-2017, Nokia Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so;
-
-import com.google.gson.JsonObject;
-import com.nokia.cbam.lcm.v32.model.ExtVirtualLinkData;
-import com.nokia.cbam.lcm.v32.model.VimSoftwareImage;
-import com.nokia.cbam.lcm.v32.model.VnfInfo;
-import com.nokia.cbam.lcm.v32.model.VnfProperty;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.ArgumentCaptor;
-import org.mockito.Mock;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.AAIExternalSystemInfoProvider;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.direct.notification.GenericVnfManager;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.*;
-import org.onap.vnfmadapter.so.model.*;
-import org.onap.vnfmdriver.model.*;
-
-import static com.nokia.cbam.lcm.v32.model.VimInfo.VimInfoTypeEnum.*;
-import static junit.framework.TestCase.assertEquals;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.CbamRestApiProvider.NOKIA_LCM_API_VERSION;
-
-public class TestSoLifecycleManager extends TestBase {
-
-    private static final String VNFD_ID = "cbamVnfdId";
-    @Mock
-    private LifecycleManagerForSo lifecycleManager;
-    @Mock
-    private AAIExternalSystemInfoProvider vimInfoProvider;
-    @Mock
-    private JobManagerForSo jobManager;
-    @Mock
-    private GenericVnfManager genericVnfManager;
-    private SoLifecycleManager soLifecycleManager;
-
-    @Before
-    public void init() {
-        soLifecycleManager = new SoLifecycleManager(lifecycleManager, vimInfoProvider, cbamRestApiProviderForSo, jobManager, genericVnfManager);
-    }
-
-    /**
-     * test VNF creation
-     */
-    @Test
-    public void testVnfCreation() throws Exception {
-        SoVnfCreationRequest onapRequest = new SoVnfCreationRequest();
-        Object additionalParams = new JsonObject();
-        onapRequest.setAdditionalParams(additionalParams);
-        onapRequest.setCsarId("csarId");
-        onapRequest.setDescription("description");
-        onapRequest.setName("name");
-        VnfInfo vnfInfo = new VnfInfo();
-        vnfInfo.setId(VNF_ID);
-        LifecycleManager.VnfCreationResult genericResponse = new LifecycleManager.VnfCreationResult(vnfInfo, VNFD_ID);
-        when(lifecycleManager.create(VNFM_ID, "csarId", "name", "description")).thenReturn(genericResponse);
-        //when
-        SoVnfCreationResponse response = soLifecycleManager.create(VNFM_ID, onapRequest);
-        //verify
-        assertEquals(VNF_ID, response.getVnfId());
-    }
-
-    /**
-     * test VNF activation without parameters
-     */
-    @Test
-    public void testVnfActivation() throws Exception {
-        SoVnfActivationRequest soRequest = new SoVnfActivationRequest();
-        soRequest.setVimId(VIM_ID);
-
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        org.onap.vnfmdriver.model.VnfInfo vnfInfo = new org.onap.vnfmdriver.model.VnfInfo();
-        vnfInfo.setVnfdId(VNFD_ID);
-        when(lifecycleManager.queryVnf(VNFM_ID, VNF_ID)).thenReturn(vnfInfo);
-        ArgumentCaptor<List<ExtVirtualLinkInfo>> extLinks = ArgumentCaptor.forClass(List.class);
-        ArgumentCaptor<AdditionalParameters> additionalParameters = ArgumentCaptor.forClass(AdditionalParameters.class);
-        VnfInstantiateResponse instantiationResponse = new VnfInstantiateResponse();
-        instantiationResponse.setJobId(JOB_ID);
-        when(lifecycleManager.instantiate(eq(VNFM_ID), extLinks.capture(), eq(httpResponse), eq(additionalParams), additionalParameters.capture(), eq(VNF_ID), eq("csarId"), eq(VNFD_ID))).thenReturn(instantiationResponse);
-        org.onap.vnfmdriver.model.VimInfo esrInfo = new org.onap.vnfmdriver.model.VimInfo();
-        esrInfo.setUrl("http://localhost:123/v3");
-        esrInfo.setDomain("domain");
-        when(vimInfoProvider.getVimInfo(VIM_ID)).thenReturn(esrInfo);
-        VnfInfo cbamVnfInfo = new VnfInfo();
-        cbamVnfInfo.setExtensions(new ArrayList<>());
-        VnfProperty onapVnfdId = new VnfProperty();
-        cbamVnfInfo.getExtensions().add(onapVnfdId);
-        onapVnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
-        onapVnfdId.setValue("csarId");
-        when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(cbamVnfInfo));
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.activate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        AdditionalParameters actualAdditionalParameters = additionalParameters.getValue();
-        assertEquals(0, actualAdditionalParameters.getComputeResourceFlavours().size());
-        assertEquals(additionalParams, actualAdditionalParameters.getAdditionalParams());
-        assertEquals(0, actualAdditionalParameters.getExternalConnectionPointAddresses().size());
-        assertEquals(0, actualAdditionalParameters.getExtManagedVirtualLinks().size());
-        assertEquals(0, actualAdditionalParameters.getExtVirtualLinks().size());
-        assertEquals("default", actualAdditionalParameters.getInstantiationLevel());
-        assertEquals(0, actualAdditionalParameters.getSoftwareImages().size());
-        assertEquals(OPENSTACK_V3_INFO, actualAdditionalParameters.getVimType());
-        assertEquals(0, actualAdditionalParameters.getZones().size());
-        assertEquals(0, extLinks.getValue().size());
-    }
-
-
-    /**
-     * test VNF activation without parameters for V2 based API
-     */
-    @Test
-    public void testVnfActivationForV2() throws Exception {
-        SoVnfActivationRequest soRequest = new SoVnfActivationRequest();
-        soRequest.setVimId(VIM_ID);
-
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        org.onap.vnfmdriver.model.VnfInfo vnfInfo = new org.onap.vnfmdriver.model.VnfInfo();
-        vnfInfo.setVnfdId(VNFD_ID);
-        when(lifecycleManager.queryVnf(VNFM_ID, VNF_ID)).thenReturn(vnfInfo);
-        ArgumentCaptor<List<ExtVirtualLinkInfo>> extLinks = ArgumentCaptor.forClass(List.class);
-        ArgumentCaptor<AdditionalParameters> additionalParameters = ArgumentCaptor.forClass(AdditionalParameters.class);
-        VnfInstantiateResponse instantiationResponse = new VnfInstantiateResponse();
-        instantiationResponse.setJobId(JOB_ID);
-        when(lifecycleManager.instantiate(eq(VNFM_ID), extLinks.capture(), eq(httpResponse), eq(additionalParams), additionalParameters.capture(), eq(VNF_ID), eq("csarId"), eq(VNFD_ID))).thenReturn(instantiationResponse);
-        org.onap.vnfmdriver.model.VimInfo esrInfo = new org.onap.vnfmdriver.model.VimInfo();
-        esrInfo.setUrl("http://localhost:123/v2");
-        when(vimInfoProvider.getVimInfo(VIM_ID)).thenReturn(esrInfo);
-        VnfInfo cbamVnfInfo = new VnfInfo();
-        cbamVnfInfo.setExtensions(new ArrayList<>());
-        VnfProperty onapVnfdId = new VnfProperty();
-        cbamVnfInfo.getExtensions().add(onapVnfdId);
-        onapVnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
-        onapVnfdId.setValue("csarId");
-        when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(cbamVnfInfo));
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.activate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        AdditionalParameters actualAdditionalParameters = additionalParameters.getValue();
-        assertEquals(OPENSTACK_V2_INFO, actualAdditionalParameters.getVimType());
-    }
-
-    /**
-     * test VNF activation without parameters for vCloud based API
-     */
-    @Test
-    public void testVnfActivationForVcloud() throws Exception {
-        SoVnfActivationRequest soRequest = new SoVnfActivationRequest();
-        soRequest.setVimId(VIM_ID);
-
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        org.onap.vnfmdriver.model.VnfInfo vnfInfo = new org.onap.vnfmdriver.model.VnfInfo();
-        vnfInfo.setVnfdId(VNFD_ID);
-        when(lifecycleManager.queryVnf(VNFM_ID, VNF_ID)).thenReturn(vnfInfo);
-        ArgumentCaptor<List<ExtVirtualLinkInfo>> extLinks = ArgumentCaptor.forClass(List.class);
-        ArgumentCaptor<AdditionalParameters> additionalParameters = ArgumentCaptor.forClass(AdditionalParameters.class);
-        VnfInstantiateResponse instantiationResponse = new VnfInstantiateResponse();
-        instantiationResponse.setJobId(JOB_ID);
-        when(lifecycleManager.instantiate(eq(VNFM_ID), extLinks.capture(), eq(httpResponse), eq(additionalParams), additionalParameters.capture(), eq(VNF_ID), eq("csarId"), eq(VNFD_ID))).thenReturn(instantiationResponse);
-        org.onap.vnfmdriver.model.VimInfo esrInfo = new org.onap.vnfmdriver.model.VimInfo();
-        esrInfo.setUrl("http://localhost:123/");
-        esrInfo.setDomain("domain");
-        when(vimInfoProvider.getVimInfo(VIM_ID)).thenReturn(esrInfo);
-        VnfInfo cbamVnfInfo = new VnfInfo();
-        cbamVnfInfo.setExtensions(new ArrayList<>());
-        VnfProperty onapVnfdId = new VnfProperty();
-        cbamVnfInfo.getExtensions().add(onapVnfdId);
-        onapVnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
-        onapVnfdId.setValue("csarId");
-        when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(cbamVnfInfo));
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.activate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        AdditionalParameters actualAdditionalParameters = additionalParameters.getValue();
-        assertEquals(VMWARE_VCLOUD_INFO, actualAdditionalParameters.getVimType());
-    }
-
-    /**
-     * test VNF activation with VDU mappings
-     */
-    @Test
-    public void testVnfActivationWithVdu() throws Exception {
-        SoVnfActivationRequest soRequest = new SoVnfActivationRequest();
-        soRequest.setVimId(VIM_ID);
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        org.onap.vnfmdriver.model.VnfInfo vnfInfo = new org.onap.vnfmdriver.model.VnfInfo();
-        vnfInfo.setVnfdId(VNFD_ID);
-        when(lifecycleManager.queryVnf(VNFM_ID, VNF_ID)).thenReturn(vnfInfo);
-        ArgumentCaptor<List<ExtVirtualLinkInfo>> extLinks = ArgumentCaptor.forClass(List.class);
-        ArgumentCaptor<AdditionalParameters> additionalParameters = ArgumentCaptor.forClass(AdditionalParameters.class);
-        VnfInstantiateResponse instantiationResponse = new VnfInstantiateResponse();
-        instantiationResponse.setJobId(JOB_ID);
-        when(lifecycleManager.instantiate(eq(VNFM_ID), extLinks.capture(), eq(httpResponse), eq(additionalParams), additionalParameters.capture(), eq(VNF_ID), eq("csarId"), eq(VNFD_ID))).thenReturn(instantiationResponse);
-        org.onap.vnfmdriver.model.VimInfo esrInfo = new org.onap.vnfmdriver.model.VimInfo();
-        esrInfo.setUrl("http://localhost:123/v3");
-        esrInfo.setDomain("domain");
-        when(vimInfoProvider.getVimInfo(VIM_ID)).thenReturn(esrInfo);
-        VnfInfo cbamVnfInfo = new VnfInfo();
-        cbamVnfInfo.setExtensions(new ArrayList<>());
-        VnfProperty onapVnfdId = new VnfProperty();
-        cbamVnfInfo.getExtensions().add(onapVnfdId);
-        onapVnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
-        onapVnfdId.setValue("csarId");
-        when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(cbamVnfInfo));
-        soRequest.setVduMappings(new ArrayList<>());
-        SoVduMapping vduMapping = new SoVduMapping();
-        soRequest.getVduMappings().add(vduMapping);
-        vduMapping.setFlavourId("flavorId");
-        vduMapping.setImageId("imageId");
-        vduMapping.setVduId("vduId");
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.activate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        AdditionalParameters actualAdditionalParameters = additionalParameters.getValue();
-        assertEquals(1, actualAdditionalParameters.getComputeResourceFlavours().size());
-        assertEquals(1, actualAdditionalParameters.getSoftwareImages().size());
-        VimSoftwareImage image = actualAdditionalParameters.getSoftwareImages().get(0);
-        assertEquals(VIM_ID, image.getVimId());
-        assertEquals("vduId_image", image.getVnfdSoftwareImageId());
-        assertEquals("imageId", image.getResourceId());
-        assertEquals(VIM_ID, actualAdditionalParameters.getComputeResourceFlavours().get(0).getVimId());
-        assertEquals("flavorId", actualAdditionalParameters.getComputeResourceFlavours().get(0).getResourceId());
-        assertEquals("vduId", actualAdditionalParameters.getComputeResourceFlavours().get(0).getVnfdVirtualComputeDescId());
-        assertEquals(OPENSTACK_V3_INFO, actualAdditionalParameters.getVimType());
-    }
-
-    /**
-     * test VNF activation with network mappings
-     */
-    @Test
-    public void testVnfActivationWithNetworkMapping() throws Exception {
-        SoVnfActivationRequest soRequest = new SoVnfActivationRequest();
-        soRequest.setVimId(VIM_ID);
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        org.onap.vnfmdriver.model.VnfInfo vnfInfo = new org.onap.vnfmdriver.model.VnfInfo();
-        vnfInfo.setVnfdId(VNFD_ID);
-        when(lifecycleManager.queryVnf(VNFM_ID, VNF_ID)).thenReturn(vnfInfo);
-        ArgumentCaptor<List<ExtVirtualLinkInfo>> extLinks = ArgumentCaptor.forClass(List.class);
-        ArgumentCaptor<AdditionalParameters> additionalParameters = ArgumentCaptor.forClass(AdditionalParameters.class);
-        VnfInstantiateResponse instantiationResponse = new VnfInstantiateResponse();
-        instantiationResponse.setJobId(JOB_ID);
-        when(lifecycleManager.instantiate(eq(VNFM_ID), extLinks.capture(), eq(httpResponse), eq(additionalParams), additionalParameters.capture(), eq(VNF_ID), eq("csarId"), eq(VNFD_ID))).thenReturn(instantiationResponse);
-        org.onap.vnfmdriver.model.VimInfo esrInfo = new org.onap.vnfmdriver.model.VimInfo();
-        esrInfo.setUrl("http://localhost:123/v3");
-        esrInfo.setDomain("domain");
-        when(vimInfoProvider.getVimInfo(VIM_ID)).thenReturn(esrInfo);
-        VnfInfo cbamVnfInfo = new VnfInfo();
-        cbamVnfInfo.setExtensions(new ArrayList<>());
-        VnfProperty onapVnfdId = new VnfProperty();
-        cbamVnfInfo.getExtensions().add(onapVnfdId);
-        onapVnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
-        onapVnfdId.setValue("csarId");
-        when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(cbamVnfInfo));
-        soRequest.setNetworkMappings(new ArrayList<>());
-        SoNetworkMapping networkMapping = new SoNetworkMapping();
-        networkMapping.setVldId("myVldId");
-        networkMapping.setNetworkProviderId("providerId");
-        networkMapping.setAssignedAddresses(new ArrayList<>());
-        SoAssignedAddresses e1 = new SoAssignedAddresses();
-        e1.setIpAddress("1.2.3.4");
-        e1.setCpdId("cpdId");
-        SoAssignedAddresses e2 = new SoAssignedAddresses();
-        e2.setIpAddress("1.2.3.5");
-        e2.setCpdId("cpdId2");
-        SoAssignedAddresses e3 = new SoAssignedAddresses();
-        e3.setIpAddress("1.2.3.6");
-        e3.setCpdId("cpdId2");
-        SoAssignedAddresses e4 = new SoAssignedAddresses();
-        e4.setIpAddress("1.2.3.6");
-        e4.setCpdId("cpdId2");
-        networkMapping.getAssignedAddresses().add(e1);
-        networkMapping.getAssignedAddresses().add(e2);
-        networkMapping.getAssignedAddresses().add(e3);
-        networkMapping.getAssignedAddresses().add(e4);
-        SoNetworkMapping networkMapping2 = new SoNetworkMapping();
-        soRequest.getNetworkMappings().add(networkMapping);
-        soRequest.getNetworkMappings().add(networkMapping2);
-        networkMapping2.setVldId("myVldId2");
-        networkMapping2.setNetworkProviderId("providerId2");
-
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.activate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        AdditionalParameters actualAdditionalParameters = additionalParameters.getValue();
-        assertEquals(2, actualAdditionalParameters.getExtVirtualLinks().size());
-        ExtVirtualLinkData actualVl = actualAdditionalParameters.getExtVirtualLinks().get(0);
-        assertEquals(VIM_ID, actualVl.getVimId());
-        assertEquals("providerId", actualVl.getResourceId());
-        assertEquals("myVldId", actualVl.getExtVirtualLinkId());
-        assertEquals(2, actualVl.getExtCps().size());
-        assertEquals("cpdId", actualVl.getExtCps().get(0).getCpdId());
-        assertEquals("1.2.3.4", actualVl.getExtCps().get(0).getAddresses().get(0).getIp());
-        assertEquals("cpdId2", actualVl.getExtCps().get(1).getCpdId());
-        assertEquals("1.2.3.5", actualVl.getExtCps().get(1).getAddresses().get(0).getIp());
-        assertEquals("1.2.3.6", actualVl.getExtCps().get(1).getAddresses().get(1).getIp());
-    }
-
-    /**
-     * test VNF activation with server mappings
-     */
-    @Test
-    public void testVnfActivationWithServerMappings() throws Exception {
-        SoVnfActivationRequest soRequest = new SoVnfActivationRequest();
-        soRequest.setVimId(VIM_ID);
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        org.onap.vnfmdriver.model.VnfInfo vnfInfo = new org.onap.vnfmdriver.model.VnfInfo();
-        vnfInfo.setVnfdId(VNFD_ID);
-        when(lifecycleManager.queryVnf(VNFM_ID, VNF_ID)).thenReturn(vnfInfo);
-        ArgumentCaptor<List<ExtVirtualLinkInfo>> extLinks = ArgumentCaptor.forClass(List.class);
-        ArgumentCaptor<AdditionalParameters> additionalParameters = ArgumentCaptor.forClass(AdditionalParameters.class);
-        VnfInstantiateResponse instantiationResponse = new VnfInstantiateResponse();
-        instantiationResponse.setJobId(JOB_ID);
-        when(lifecycleManager.instantiate(eq(VNFM_ID), extLinks.capture(), eq(httpResponse), eq(additionalParams), additionalParameters.capture(), eq(VNF_ID), eq("csarId"), eq(VNFD_ID))).thenReturn(instantiationResponse);
-        org.onap.vnfmdriver.model.VimInfo esrInfo = new org.onap.vnfmdriver.model.VimInfo();
-        esrInfo.setUrl("http://localhost:123/v3");
-        esrInfo.setDomain("domain");
-        when(vimInfoProvider.getVimInfo(VIM_ID)).thenReturn(esrInfo);
-        VnfInfo cbamVnfInfo = new VnfInfo();
-        cbamVnfInfo.setExtensions(new ArrayList<>());
-        VnfProperty onapVnfdId = new VnfProperty();
-        cbamVnfInfo.getExtensions().add(onapVnfdId);
-        onapVnfdId.setName(LifecycleManager.ONAP_CSAR_ID);
-        onapVnfdId.setValue("csarId");
-        when(vnfApi.vnfsVnfInstanceIdGet(VNF_ID, NOKIA_LCM_API_VERSION)).thenReturn(buildObservable(cbamVnfInfo));
-        soRequest.setServerMappings(new ArrayList<>());
-        SoServerMapping s1 = new SoServerMapping();
-        soRequest.getServerMappings().add(s1);
-        s1.setVduId("vduId1");
-        s1.setAvailabilityZoneId("azId1");
-        SoServerMapping s2 = new SoServerMapping();
-        soRequest.getServerMappings().add(s2);
-        s2.setVduId("vduId1");
-        s2.setAvailabilityZoneId("azId1");
-        SoServerMapping s3 = new SoServerMapping();
-        soRequest.getServerMappings().add(s3);
-        s3.setVduId("vduId2");
-        s3.setAvailabilityZoneId("azId1");
-
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.activate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        AdditionalParameters actualAdditionalParameters = additionalParameters.getValue();
-        assertEquals(2, actualAdditionalParameters.getZones().size());
-        assertEquals(VIM_ID, actualAdditionalParameters.getZones().get(0).getVimId());
-        assertEquals("azId1", actualAdditionalParameters.getZones().get(0).getResourceId());
-        assertEquals("vduId1", actualAdditionalParameters.getZones().get(0).getId());
-        assertEquals(VIM_ID, actualAdditionalParameters.getZones().get(1).getVimId());
-        assertEquals("azId1", actualAdditionalParameters.getZones().get(1).getResourceId());
-        assertEquals("vduId2", actualAdditionalParameters.getZones().get(1).getId());
-    }
-
-    /**
-     * test VNF scale in
-     */
-    @Test
-    public void testScaleIn() throws Exception {
-        SoVnfScaleRequest soRequest = new SoVnfScaleRequest();
-        ArgumentCaptor<org.onap.vnfmdriver.model.VnfScaleRequest> driverRequest = ArgumentCaptor.forClass(org.onap.vnfmdriver.model.VnfScaleRequest.class);
-        JobInfo jobInfo = new JobInfo();
-        jobInfo.setJobId(JOB_ID);
-
-        soRequest.setAspectId("aspectId");
-        soRequest.setDirection(SoScaleDirection.IN);
-        soRequest.setSteps(2);
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        when(lifecycleManager.scaleVnf(eq(VNFM_ID), eq(VNF_ID), driverRequest.capture(), eq(httpResponse))).thenReturn(jobInfo);
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.scale(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        assertEquals(2, Integer.parseInt(driverRequest.getValue().getNumberOfSteps()));
-        assertEquals("aspectId", driverRequest.getValue().getAspectId());
-        assertEquals(org.onap.vnfmdriver.model.ScaleDirection.IN, driverRequest.getValue().getType());
-        assertEquals(additionalParams, driverRequest.getValue().getAdditionalParam());
-    }
-
-    /**
-     * test VNF scale out
-     */
-    @Test
-    public void testScaleOut() throws Exception {
-        SoVnfScaleRequest soRequest = new SoVnfScaleRequest();
-        ArgumentCaptor<org.onap.vnfmdriver.model.VnfScaleRequest> driverRequest = ArgumentCaptor.forClass(org.onap.vnfmdriver.model.VnfScaleRequest.class);
-        JobInfo jobInfo = new JobInfo();
-        jobInfo.setJobId(JOB_ID);
-
-        soRequest.setAspectId("aspectId");
-        soRequest.setDirection(SoScaleDirection.OUT);
-        soRequest.setSteps(2);
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        when(lifecycleManager.scaleVnf(eq(VNFM_ID), eq(VNF_ID), driverRequest.capture(), eq(httpResponse))).thenReturn(jobInfo);
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.scale(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        assertEquals(2, Integer.parseInt(driverRequest.getValue().getNumberOfSteps()));
-        assertEquals("aspectId", driverRequest.getValue().getAspectId());
-        assertEquals(org.onap.vnfmdriver.model.ScaleDirection.OUT, driverRequest.getValue().getType());
-        assertEquals(additionalParams, driverRequest.getValue().getAdditionalParam());
-    }
-
-    /**
-     * test VNF heal
-     */
-    @Test
-    public void testHeal() throws Exception {
-        SoVnfHealRequest soRequest = new SoVnfHealRequest();
-        ArgumentCaptor<org.onap.vnfmdriver.model.VnfHealRequest> driverRequest = ArgumentCaptor.forClass(org.onap.vnfmdriver.model.VnfHealRequest.class);
-        JobInfo jobInfo = new JobInfo();
-        jobInfo.setJobId(JOB_ID);
-
-        soRequest.setVnfcId(VNF_ID + "_vnfcId");
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        when(lifecycleManager.healVnf(eq(VNFM_ID), eq(VNF_ID), driverRequest.capture(), eq(Optional.of("vnfcId")), eq(httpResponse))).thenReturn(jobInfo);
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.heal(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        assertEquals("notUsedByDriver", driverRequest.getValue().getAffectedvm().getVduid());
-        assertEquals("notUsedByDriver", driverRequest.getValue().getAffectedvm().getVimid());
-        assertEquals("unknown", driverRequest.getValue().getAffectedvm().getVmname());
-        assertEquals("heal", driverRequest.getValue().getAction());
-    }
-
-    /**
-     * test VNF deactivation
-     */
-    @Test
-    public void testDeactivation() throws Exception {
-        SoVnfTerminationRequest soRequest = new SoVnfTerminationRequest();
-        ArgumentCaptor<org.onap.vnfmdriver.model.VnfTerminateRequest> driverRequest = ArgumentCaptor.forClass(org.onap.vnfmdriver.model.VnfTerminateRequest.class);
-        JobInfo jobInfo = new JobInfo();
-        jobInfo.setJobId(JOB_ID);
-        soRequest.setGracefulTerminationTimeoutInMs(1234);
-        soRequest.setMode(SoTerminationMode.GRACEFUL);
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        when(lifecycleManager.terminateAndDelete(eq(VNFM_ID), eq(VNF_ID), driverRequest.capture(), eq(httpResponse))).thenReturn(jobInfo);
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.deactivate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        assertEquals(VnfTerminationType.GRACEFUL, driverRequest.getValue().getTerminationType());
-        assertEquals("1234", driverRequest.getValue().getGracefulTerminationTimeout());
-    }
-
-    /**
-     * test VNF deactivation
-     */
-    @Test
-    public void testDeactivationForceFull() throws Exception {
-        SoVnfTerminationRequest soRequest = new SoVnfTerminationRequest();
-        ArgumentCaptor<org.onap.vnfmdriver.model.VnfTerminateRequest> driverRequest = ArgumentCaptor.forClass(org.onap.vnfmdriver.model.VnfTerminateRequest.class);
-        JobInfo jobInfo = new JobInfo();
-        jobInfo.setJobId(JOB_ID);
-        soRequest.setMode(SoTerminationMode.FORCEFUL);
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        when(lifecycleManager.terminateAndDelete(eq(VNFM_ID), eq(VNF_ID), driverRequest.capture(), eq(httpResponse))).thenReturn(jobInfo);
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.deactivate(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-        assertEquals(VnfTerminationType.FORCEFUL, driverRequest.getValue().getTerminationType());
-        assertEquals(null, driverRequest.getValue().getGracefulTerminationTimeout());
-    }
-
-    /**
-     * test VNF deletion
-     */
-    @Test
-    public void testDelete() throws Exception {
-        //when
-        soLifecycleManager.delete(VNFM_ID, VNF_ID);
-        //verify
-        verify(lifecycleManager).deleteVnf(VNFM_ID, VNF_ID);
-    }
-
-    /**
-     * test VNF custom operation
-     */
-    @Test
-    public void testCustomOperation() throws Exception {
-        SoVnfCustomOperation soRequest = new SoVnfCustomOperation();
-        JobInfo jobInfo = new JobInfo();
-        jobInfo.setJobId(JOB_ID);
-        soRequest.setOperationId("operationId");
-        JsonObject additionalParams = new JsonObject();
-        soRequest.setAdditionalParams(additionalParams);
-        when(lifecycleManager.customOperation(VNFM_ID, VNF_ID, "operationId", additionalParams, httpResponse)).thenReturn(jobInfo);
-        //when
-        SoJobHandler jobHandler = soLifecycleManager.customOperation(VNFM_ID, VNF_ID, soRequest, httpResponse);
-        //verify
-        assertEquals(JOB_ID, jobHandler.getJobId());
-    }
-
-
-    /**
-     * test VNF custom operation
-     */
-    @Test
-    public void testJobDetails() throws Exception {
-        JobDetailInfo currentJobDetails = new JobDetailInfo();
-        currentJobDetails.setJobId(JOB_ID);
-        when(jobManager.getJob(VNFM_ID, JOB_ID)).thenReturn(currentJobDetails);
-        currentJobDetails.setResponseDescriptor(new JobDetailInfoResponseDescriptor());
-
-        assertJob(currentJobDetails, SoJobStatus.FINISHED, JobStatus.FINISHED);
-        assertJob(currentJobDetails, SoJobStatus.FAILED, JobStatus.ERROR);
-        assertJob(currentJobDetails, SoJobStatus.FAILED, JobStatus.TIMEOUT);
-        assertJob(currentJobDetails, SoJobStatus.STARTED, JobStatus.STARTED);
-        assertJob(currentJobDetails, SoJobStatus.STARTED, JobStatus.PROCESSING);
-
-    }
-
-    private void assertJob(JobDetailInfo currentJobDetails, SoJobStatus expectedState, JobStatus started) {
-        currentJobDetails.getResponseDescriptor().setStatus(started);
-        //when
-        SoJobDetail jobDetail = soLifecycleManager.getJobDetails(VNFM_ID, JOB_ID);
-        //verify
-        assertEquals(JOB_ID, jobDetail.getJobId());
-        assertEquals(expectedState, jobDetail.getStatus());
-    }
-
-
-}
\ No newline at end of file
index 5840ef4..10a5a38 100644 (file)
@@ -26,7 +26,7 @@ public class TestCbamVnfdBuilder extends TestBase {
     private CbamVnfdBuilder packageTransformer = new CbamVnfdBuilder();
 
     /**
-     * test package conversion on the most mininal VNFD possible
+     * test package conversion on the most minimal VNFD possible
      */
     @Test
     public void testEmpty() throws Exception {
index d2a9255..78a8a72 100644 (file)
@@ -60,7 +60,7 @@ public class TestOnapVnfPackageBuilder extends TestBase {
     }
 
     /**
-     * Test conversion for V1 package
+     * Test conversion for V1TOSCA package
      */
     @Test
     public void testConversionViaV1() throws Exception {
@@ -73,7 +73,7 @@ public class TestOnapVnfPackageBuilder extends TestBase {
         String cbamVnfd = new String(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip.vnfd"));
         String expectedOnapVnfd = new OnapR1VnfdBuilder().toOnapVnfd(cbamVnfd);
         //when
-        byte[] convertedPackage = new OnapVnfPackageBuilder().covert(new ByteArrayInputStream(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip")), SupportedOnapPackageVersions.V1);
+        byte[] convertedPackage = new OnapVnfPackageBuilder().covert(new ByteArrayInputStream(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip")), SupportedOnapPackageVersions.V1TOSCA);
         //verify
         assertFileInZip(convertedPackage, "TOSCA-Metadata/TOSCA.meta", TestUtil.loadFile("TOSCA.meta"));
         assertFileInZip(convertedPackage, "MainServiceTemplate.yaml", expectedOnapVnfd.getBytes());
@@ -84,7 +84,7 @@ public class TestOnapVnfPackageBuilder extends TestBase {
     }
 
     /**
-     * Test conversion for V2 package
+     * Test conversion for V2TOSCA package
      */
     @Test
     public void testConversionViaV2() throws Exception {
@@ -97,7 +97,7 @@ public class TestOnapVnfPackageBuilder extends TestBase {
         String cbamVnfd = new String(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip.vnfd"));
         String expectedOnapVnfd = new OnapR2VnfdBuilder().toOnapVnfd(cbamVnfd);
         //when
-        byte[] convertedPackage = new OnapVnfPackageBuilder().covert(new ByteArrayInputStream(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip")), SupportedOnapPackageVersions.V2);
+        byte[] convertedPackage = new OnapVnfPackageBuilder().covert(new ByteArrayInputStream(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip")), SupportedOnapPackageVersions.V2TOSCA);
         //verify
         assertFileInZip(convertedPackage, "TOSCA-Metadata/TOSCA.meta", TestUtil.loadFile("TOSCA.meta"));
         assertFileInZip(convertedPackage, "MainServiceTemplate.yaml", expectedOnapVnfd.getBytes());
index 99fd203..ba64b92 100644 (file)
@@ -75,7 +75,7 @@ public class TestConverterApi extends TestBase {
         when(httpRequest.getPart("fileToUpload")).thenReturn(part);
         Part part2 = Mockito.mock(Part.class);
         when(httpRequest.getPart("version")).thenReturn(part2);
-        when(part2.getInputStream()).thenReturn(new ByteArrayInputStream("V1".getBytes()));
+        when(part2.getInputStream()).thenReturn(new ByteArrayInputStream("V1TOSCA".getBytes()));
         //when
         converterApi.convert(httpResponse, httpRequest);
         //verify
@@ -122,7 +122,7 @@ public class TestConverterApi extends TestBase {
         when(httpRequest.getPart("fileToUpload")).thenThrow(expectedException);
         Part part = Mockito.mock(Part.class);
         when(httpRequest.getPart("version")).thenReturn(part);
-        when(part.getInputStream()).thenReturn(new ByteArrayInputStream("V1".getBytes()));
+        when(part.getInputStream()).thenReturn(new ByteArrayInputStream("V1TOSCA".getBytes()));
         try {
             converterApi.convert(httpResponse, httpRequest);
             fail();
@@ -143,7 +143,7 @@ public class TestConverterApi extends TestBase {
         when(part.getInputStream()).thenReturn(new ByteArrayInputStream(TestUtil.loadFile("unittests/packageconverter/cbam.package.zip")));
         when(httpRequest.getPart("fileToUpload")).thenReturn(part);
         when(httpRequest.getPart("version")).thenThrow(expectedException);
-        when(part.getInputStream()).thenReturn(new ByteArrayInputStream("V1".getBytes()));
+        when(part.getInputStream()).thenReturn(new ByteArrayInputStream("V1TOSCA".getBytes()));
         try {
             converterApi.convert(httpResponse, httpRequest);
             fail();
@@ -165,7 +165,7 @@ public class TestConverterApi extends TestBase {
 
         Part part2 = Mockito.mock(Part.class);
         when(httpRequest.getPart("version")).thenReturn(part2);
-        when(part2.getInputStream()).thenReturn(new ByteArrayInputStream("V1".getBytes()));
+        when(part2.getInputStream()).thenReturn(new ByteArrayInputStream("V1TOSCA".getBytes()));
         try {
             converterApi.convert(httpResponse, httpRequest);
             fail();
diff --git a/nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/TestSoApi.java b/nokiav2/driver/src/test/java/org/onap/vfc/nfvo/driver/vnfm/svnfm/nokia/restapi/TestSoApi.java
deleted file mode 100644 (file)
index be1ee5a..0000000
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Copyright 2016-2017, Nokia Corporation
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.restapi;
-
-import junit.framework.TestCase;
-import org.junit.Before;
-import org.junit.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.Mockito;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.onap.so.SoLifecycleManager;
-import org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.vnfm.TestBase;
-import org.onap.vnfmadapter.so.model.*;
-
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-import static org.springframework.test.util.ReflectionTestUtils.setField;
-
-
-public class TestSoApi extends TestBase {
-
-    @Mock
-    private SoLifecycleManager soLifecycleManager;
-    @InjectMocks
-    private SoApi soApi;
-    @Mock
-    private SoJobHandler jobHandler;
-
-    @Before
-    public void initMocks() throws Exception {
-        setField(SoApi.class, "logger", logger);
-    }
-
-    /**
-     * test create
-     */
-    @Test
-    public void testCreate() {
-        SoVnfCreationRequest soRequest = Mockito.mock(SoVnfCreationRequest.class);
-        SoVnfCreationResponse vnf = new SoVnfCreationResponse();
-        when(soLifecycleManager.create(VNFM_ID, soRequest)).thenReturn(vnf);
-        //when
-        SoVnfCreationResponse actual = soApi.createVnf(soRequest, VNFM_ID, httpResponse);
-        //verify
-        verify(logger).info("REST: Create the VNF");
-        TestCase.assertEquals(vnf, actual);
-    }
-
-    /**
-     * test activation
-     */
-    @Test
-    public void testActivate() {
-        SoVnfActivationRequest soRequest = Mockito.mock(SoVnfActivationRequest.class);
-        when(soLifecycleManager.activate(VNFM_ID, VNF_ID, soRequest, httpResponse)).thenReturn(jobHandler);
-        //when
-        SoJobHandler soJobHandler = soApi.activateVnf(soRequest, VNFM_ID, VNF_ID, httpResponse);
-        //verify
-        verify(logger).info("REST: Activate the VNF");
-        TestCase.assertEquals(jobHandler, soJobHandler);
-    }
-
-    /**
-     * test scale
-     */
-    @Test
-    public void testScale() {
-        SoVnfScaleRequest soRequest = Mockito.mock(SoVnfScaleRequest.class);
-        when(soLifecycleManager.scale(VNFM_ID, VNF_ID, soRequest, httpResponse)).thenReturn(jobHandler);
-        //when
-        SoJobHandler soJobHandler = soApi.scaleVnf(soRequest, VNFM_ID, VNF_ID, httpResponse);
-        //verify
-        verify(logger).info("REST: Scale the VNF");
-        TestCase.assertEquals(jobHandler, soJobHandler);
-    }
-
-    /**
-     * test heal
-     */
-    @Test
-    public void testHeal() {
-        SoVnfHealRequest soRequest = Mockito.mock(SoVnfHealRequest.class);
-        when(soLifecycleManager.heal(VNFM_ID, VNF_ID, soRequest, httpResponse)).thenReturn(jobHandler);
-        //when
-        SoJobHandler soJobHandler = soApi.healVnf(soRequest, VNFM_ID, VNF_ID, httpResponse);
-        //verify
-        verify(logger).info("REST: Heal the VNF");
-        TestCase.assertEquals(jobHandler, soJobHandler);
-    }
-
-
-    /**
-     * test custom
-     */
-    @Test
-    public void testCustom() {
-        SoVnfCustomOperation soRequest = Mockito.mock(SoVnfCustomOperation.class);
-        when(soLifecycleManager.customOperation(VNFM_ID, VNF_ID, soRequest, httpResponse)).thenReturn(jobHandler);
-        //when
-        SoJobHandler soJobHandler = soApi.executeCustomOperation(soRequest, VNFM_ID, VNF_ID, httpResponse);
-        //verify
-        verify(logger).info("REST: Execute custom operation on the VNF");
-        TestCase.assertEquals(jobHandler, soJobHandler);
-    }
-
-    /**
-     * test deactivation
-     */
-    @Test
-    public void testDeactivation() {
-        SoVnfTerminationRequest soRequest = Mockito.mock(SoVnfTerminationRequest.class);
-        when(soLifecycleManager.deactivate(VNFM_ID, VNF_ID, soRequest, httpResponse)).thenReturn(jobHandler);
-        //when
-        SoJobHandler soJobHandler = soApi.deactivateVnf(soRequest, VNFM_ID, VNF_ID, httpResponse);
-        //verify
-        verify(logger).info("REST: Deactivate the VNF");
-        TestCase.assertEquals(jobHandler, soJobHandler);
-    }
-
-    /**
-     * test delete
-     */
-    @Test
-    public void testDelete() {
-        //when
-        soApi.deleteVnf(VNFM_ID, VNF_ID, httpResponse);
-        //verify
-        verify(logger).info("REST: Delete the VNF");
-        verify(soLifecycleManager).delete(VNFM_ID, VNF_ID);
-    }
-
-    /**
-     * test deactivation
-     */
-    @Test
-    public void testGetJob() {
-        SoJobDetail jobDetail = new SoJobDetail();
-        when(soLifecycleManager.getJobDetails(VNFM_ID, JOB_ID)).thenReturn(jobDetail);
-        //when
-        SoJobDetail actial = soApi.getJob(VNFM_ID, JOB_ID, httpResponse);
-        //verify
-        verify(logger).trace("REST: Query the job");
-        TestCase.assertEquals(jobDetail, actial);
-    }
-
-}
index d39a144..77406c2 100644 (file)
@@ -37,7 +37,7 @@ import static org.onap.vfc.nfvo.driver.vnfm.svnfm.nokia.util.TestUtil.loadFile;
 
 public class TestSwaggerDefinitionConsistency extends TestBase {
 
-    public static final HashSet<Class<?>> CLASSES = Sets.newHashSet(LcmApi.class, LcnApi.class, SwaggerApi.class, ConverterApi.class, SoApi.class);
+    public static final HashSet<Class<?>> CLASSES = Sets.newHashSet(LcmApi.class, LcnApi.class, SwaggerApi.class, ConverterApi.class, SoV2Api.class);
 
     @Test
     public void test() throws Exception {
index ea379e6..0ece008 100644 (file)
@@ -288,30 +288,7 @@ public class TestLifecycleManager extends TestBase {
     }
 
     /**
-     * invalid VIM type results in failure
-     */
-    @Test
-    public void testInstantiationWithInvalidVimType() throws Exception {
-        //given
-        VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OTHER_VIM_INFO, false);
-        when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
-        when(logger.isInfoEnabled()).thenReturn(false);
-        //when
-        try {
-            lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
-            //verify
-            fail();
-        } catch (Exception e) {
-            assertEquals("Only OPENSTACK_V2_INFO, OPENSTACK_V3_INFO and VMWARE_VCLOUD_INFO is the supported VIM types", e.getMessage());
-        }
-        verify(vnfApi, never()).vnfsPost(Mockito.any(), Mockito.any());
-        verify(logger, never()).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("creation"), eq("not yet specified"), anyString());
-        verify(logger, never()).info(eq("Starting {} operation on VNF with {} identifier with {} parameter"), eq("instantiation"), eq(VNF_ID), anyString());
-        verify(logger).error("Only OPENSTACK_V2_INFO, OPENSTACK_V3_INFO and VMWARE_VCLOUD_INFO is the supported VIM types");
-    }
-
-    /**
-     * test instantiation with KeyStone V2 based with SSL
+     * test instantiation with KeyStone V2TOSCA based with SSL
      */
     @Test
     public void testInstantiationV2WithSsl() throws Exception {
@@ -578,70 +555,6 @@ public class TestLifecycleManager extends TestBase {
         assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
     }
 
-    /**
-     * verify backward compatibility with Amsterdam release
-     */
-    @Test
-    public void testInstantiationV3WithNoDomain() throws Exception {
-        additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
-        additionalParam.setDomain("myDomain");
-        VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, false);
-        vimInfo.setDomain(null);
-        when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
-        when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
-        grantResponse.setVimId(VIM_ID);
-        GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
-        accessInfo.setTenant(TENANT);
-        vimInfo.setSslInsecure(null);
-        grantResponse.setAccessInfo(accessInfo);
-        ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
-        when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
-        //when
-        VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
-        waitForJobToFinishInJobManager(finished);
-        assertEquals(1, actualInstantiationRequest.getValue().getVims().size());
-        //verify
-        OPENSTACKV3INFO actualVim = (OPENSTACKV3INFO) actualInstantiationRequest.getValue().getVims().get(0);
-        assertEquals(VIM_ID, actualVim.getId());
-        assertEquals(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, actualVim.getVimInfoType());
-        assertEquals("cloudUrl", actualVim.getInterfaceInfo().getEndpoint());
-        //FIXME assertEquals();actualVim.getInterfaceInfo().getTrustedCertificates());
-        assertEquals("vimPassword", actualVim.getAccessInfo().getPassword());
-        assertEquals("regionId", actualVim.getAccessInfo().getRegion());
-        assertEquals("myTenant", actualVim.getAccessInfo().getProject());
-        assertEquals("myDomain", actualVim.getAccessInfo().getDomain());
-        assertEquals("vimUsername", actualVim.getAccessInfo().getUsername());
-        assertTrue(actualVim.getInterfaceInfo().isSkipCertificateVerification());
-        assertTrue(actualVim.getInterfaceInfo().isSkipCertificateHostnameCheck());
-        verify(logger).warn("Setting domain from additional parameters");
-    }
-
-    /**
-     * verify backward compatibility with Amsterdam release
-     * if no domain is specified error is propagated
-     */
-    @Test
-    public void testInstantiationV3WithNoDomainFail() throws Exception {
-        VnfInstantiateRequest instantiationRequest = prepareInstantiationRequest(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO, false);
-        vimInfo.setDomain(null);
-        when(vnfApi.vnfsPost(createRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(vnfInfo));
-        additionalParam.setInstantiationLevel(INSTANTIATION_LEVEL);
-        when(vfcGrantManager.requestGrantForInstantiate(VNFM_ID, VNF_ID, VIM_ID, ONAP_CSAR_ID, INSTANTIATION_LEVEL, cbamVnfdContent, JOB_ID)).thenReturn(grantResponse);
-        grantResponse.setVimId(VIM_ID);
-        GrantVNFResponseVimAccessInfo accessInfo = new GrantVNFResponseVimAccessInfo();
-        accessInfo.setTenant(TENANT);
-        vimInfo.setSslInsecure(null);
-        grantResponse.setAccessInfo(accessInfo);
-        ArgumentCaptor<InstantiateVnfRequest> actualInstantiationRequest = ArgumentCaptor.forClass(InstantiateVnfRequest.class);
-        when(vnfApi.vnfsVnfInstanceIdInstantiatePost(eq(VNF_ID), actualInstantiationRequest.capture(), eq(NOKIA_LCM_API_VERSION))).thenReturn(buildObservable(instantiationOperationExecution));
-        //when
-        VnfInstantiateResponse response = lifecycleManager.createAndInstantiate(VNFM_ID, instantiationRequest, restResponse);
-        waitForJobToFinishInJobManager(finished);
-        assertEquals(0, actualInstantiationRequest.getAllValues().size());
-        //verify
-        verify(logger).error("The cloud did not supply the cloud domain (Amsterdam release) and was not supplied as additional data");
-    }
-
     /**
      * test instantiation with vcloud
      */
@@ -1709,17 +1622,15 @@ public class TestLifecycleManager extends TestBase {
         additionalParam.setInstantiationLevel("level1");
         switch (cloudType) {
             case OPENSTACK_V2_INFO:
-                additionalParam.setVimType(VimInfo.VimInfoTypeEnum.OPENSTACK_V2_INFO);
+                vimInfo.setType("openstack");
                 break;
             case OPENSTACK_V3_INFO:
-                additionalParam.setVimType(VimInfo.VimInfoTypeEnum.OPENSTACK_V3_INFO);
+                vimInfo.setType("openstack");
                 vimInfo.setDomain("myDomain");
                 break;
             case VMWARE_VCLOUD_INFO:
-                additionalParam.setVimType(VimInfo.VimInfoTypeEnum.VMWARE_VCLOUD_INFO);
+                vimInfo.setType("vmware");
                 break;
-            default:
-                additionalParam.setVimType(VimInfo.VimInfoTypeEnum.OTHER_VIM_INFO);
         }
 
         Map<String, List<NetworkAddress>> exteranalConnectionPointAddresses = new HashMap<>();
index b9c1c68..9134f64 100644 (file)
@@ -61,6 +61,8 @@ sdcPassword=SDC
 ###############################################################################
 # End of mandatory properties for driver                                      #
 ###############################################################################
+skipLcnSubscription=true
+skipSelfRegistration=true
 ipMap=10.0.14.1->msb.api.simpledemo.onap.org,172.17.0.15->msb.api.simpledemo.onap.org,10.0.1.1->aai.api.simpledemo.onap.org
 vnfmInfoCacheEvictionInMs=600000
 ## for logging begin ##
index d273291..29da757 100644 (file)
@@ -61,6 +61,8 @@ sdcPassword=SDC
 ###############################################################################
 # End of mandatory properties for driver                                      #
 ###############################################################################
+skipLcnSubscription=false
+skipSelfRegistration=false
 spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration
 vnfmInfoCacheEvictionInMs=600000
 ## for logging begin ##
index f9fe6a2..53fbdba 100644 (file)
@@ -11,6 +11,11 @@ topology_template:
               onapCsarId: {default: kuku}
               externalVnfmId: {default: kuku}
               vimId: {default: kuku}
+      deployment_flavour:
+        properties:
+          scaling_aspects:
+            aspect1: {max_scale_level: 2}
+            aspect2: {max_scale_level: 3}
     interfaces:
       Basic:
         instantiate:
@@ -67,3 +72,37 @@ topology_template:
                 include: [javascript/cbam.collectConnectionPoints.js]
                 output: operation_result
             additional_parameters: {jobId: kuku}
+  policies:
+  - b: {type: x}
+  - heat_mapping:
+      type: tosca.policies.nfv.HeatMapping
+      properties:
+        static:
+          virtualLinks: {net1: path, net2: path}
+          vdus:
+            vdu1:
+            - {heatResource: path}
+            vdu2:
+            - {heatResource: path}
+          externalConnectionPoints:
+            ecp1: [path]
+            ecp2: [path]
+        aspects:
+          aspect1:
+            vdus:
+              vdu1:
+              - heatResource: any
+                connectionPoints: {cp1: nic_0, cp2: nic_1}
+                virtualStorages: {disk1: disk_0, disk2: disk_1}
+              vdu2:
+              - {heatResource: any}
+              - {heatResource: any}
+            externalConnectionPoints:
+              ecp1: [path]
+              ecp2: [path]
+          aspect2:
+            vdus:
+              vdu2:
+              - {heatResource: any}
+            externalConnectionPoints:
+              ecp2: [path]
index 42569b0..dbe57d0 100644 (file)
@@ -10,6 +10,13 @@ topology_template:
             extensions:
               existingAttribute:
                 default: "value"
+      deployment_flavour:
+        properties:
+          scaling_aspects:
+            aspect1:
+              max_scale_level: 2
+            aspect2:
+              max_scale_level: 3
     interfaces:
       Basic:
         instantiate:
@@ -30,4 +37,50 @@ topology_template:
         scale:
       Healable:
         heal:
+  policies:
+    - b:
+        type: x
+    - heat_mapping:
+        type: tosca.policies.nfv.HeatMapping
+        properties:
+          static:
+            virtualLinks:
+              net1: path
+              net2: path
+            vdus:
+              vdu1:
+               - heatResource: path
+              vdu2:
+               - heatResource: path
+            externalConnectionPoints:
+              ecp1:
+                - path
+              ecp2:
+                - path
+          aspects:
+            aspect1:
+              vdus:
+                vdu1:
+                  - heatResource: any
+                    connectionPoints:
+                      cp1: nic_0
+                      cp2: nic_1
+                    virtualStorages:
+                      disk1: disk_0
+                      disk2: disk_1
+                vdu2:
+                  - heatResource: any
+                  - heatResource: any
+              externalConnectionPoints:
+                ecp1:
+                  - path
+                ecp2:
+                  - path
+            aspect2:
+              vdus:
+                vdu2:
+                  - heatResource: any
+              externalConnectionPoints:
+                ecp2:
+                  - path
 
index 256aa9e..f16f34a 100644 (file)
@@ -2,6 +2,15 @@ tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0_nokia
 topology_template:
   substitution_mappings:
     node_type: tosca.nodes.nfv.VNF
+    capabilities:
+      deployment_flavour: {}
+      vnf:
+        properties:
+          modifiable_attributes:
+            extensions:
+              onapCsarId: {default: kuku}
+              externalVnfmId: {default: kuku}
+              vimId: {default: kuku}
     interfaces:
       Basic:
         instantiate:
@@ -28,11 +37,3 @@ topology_template:
                 include: [javascript/cbam.collectConnectionPoints.js]
                 output: operation_result
             additional_parameters: {jobId: kuku}
-    capabilities:
-      vnf:
-        properties:
-          modifiable_attributes:
-            extensions:
-              onapCsarId: {default: kuku}
-              externalVnfmId: {default: kuku}
-              vimId: {default: kuku}
index 7709793..057edda 100644 (file)
@@ -3,6 +3,9 @@ tosca_definitions_version: tosca_simple_profile_for_nfv_1_0_0_nokia
 topology_template:
   substitution_mappings:
     node_type: tosca.nodes.nfv.VNF
+    capabilities:
+      deployment_flavour:
+        properties:
     interfaces:
       Basic:
         instantiate:
index af8d420..10f12e0 100644 (file)
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
   <artifactId>driverwar</artifactId>
-  <version>1.1.0-SNAPSHOT</version>
+  <version>${driver.version}</version>
   <packaging>war</packaging>
   <name>vfc/nfvo/driver/vnfm/svnfm/nokiav2/driverwar</name>
   <description>svnfm vnfm driver</description>
   <parent>
     <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
     <artifactId>vfc-nfvo-driver-vnfm-svnfm-nokiav2</artifactId>
-    <version>1.1.0-SNAPSHOT</version>
+    <version>1.1.1-SNAPSHOT</version>
   </parent>
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
@@ -36,7 +36,7 @@
     <dependency>
       <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
       <artifactId>driver</artifactId>
-      <version>1.1.0-SNAPSHOT</version>
+      <version>${driver.version}</version>
     </dependency>
     <dependency>
       <groupId>org.springframework.boot</groupId>
index aa2df37..9b953d1 100644 (file)
   <parent>
     <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
     <artifactId>vfc-nfvo-driver-vnfm-svnfm-nokiav2</artifactId>
-    <version>1.1.0-SNAPSHOT</version>
+    <version>1.1.1-SNAPSHOT</version>
   </parent>
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
   <artifactId>vfc-nfvo-driver-vnfm-svnfm-nokiav2-clients</artifactId>
-  <version>1.1.0-SNAPSHOT</version>
+  <version>${driver.version}</version>
   <packaging>jar</packaging>
   <name>vfc/nfvo/driver/vnfm/svnfm/nokiav2/generatedapis</name>
   <properties>
@@ -92,6 +92,27 @@ Release AAI
               </configOptions>
             </configuration>
           </execution>
+          <execution>
+            <id>sov2</id>
+            <goals>
+              <goal>generate</goal>
+            </goals>
+            <configuration>
+              <inputSpec>${basedir}/src/main/resources/so.vnfm.v2.json</inputSpec>
+              <language>java</language>
+              <library>retrofit2</library>
+              <output>${project.build.directory}/generated-sources/sov2</output>
+              <apiPackage>org.onap.vnfmadapter.so.v2.api</apiPackage>
+              <modelPackage>org.onap.vnfmadapter.so.v2.model</modelPackage>
+              <configOptions>
+                <jackson>true</jackson>
+                <sourceFolder>src/gen/java/main</sourceFolder>
+                <withXml>true</withXml>
+                <useRxJava2>true</useRxJava2>
+              </configOptions>
+            </configuration>
+          </execution>
+<!--
           <execution>
             <id>so</id>
             <goals>
@@ -112,6 +133,7 @@ Release AAI
               </configOptions>
             </configuration>
           </execution>
+-->
           <execution>
             <id>msb</id>
             <goals>
diff --git a/nokiav2/generatedapis/src/main/resources/so.vnfm.json b/nokiav2/generatedapis/src/main/resources/so.vnfm.json
deleted file mode 100644 (file)
index c70a83b..0000000
+++ /dev/null
@@ -1,679 +0,0 @@
-{
-  "swagger": "2.0",
-  "info": {
-    "version": "1.0.0",
-    "title": "ONAP SO VNFM Adapter API",
-    "description": "Describes the API between SO and the adapter for VNFM",
-    "contact": {
-      "name": "ONAP SO VNFM",
-      "email": "onap-discuss@lists.onap.org",
-      "url": "https://gerrit.onap.org/r/#/admin/projects/vfc/nfvo/lcm"
-    }
-  },
-  "basePath": "/api/v1",
-  "schemes": [
-    "http",
-    "https"
-  ],
-  "consumes": [
-    "application/json"
-  ],
-  "produces": [
-    "application/json"
-  ],
-  "paths": {
-    "/so/{vnfmId}/vnfs": {
-      "post": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "VNF create",
-        "description": "VNF create",
-        "operationId": "vnf_create",
-        "consumes": [
-          "application/json"
-        ],
-        "produces": [
-          "application/json"
-        ],
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "in": "body",
-            "name": "body",
-            "description": "VNF creation request parameter",
-            "required": true,
-            "schema": {
-              "$ref": "#/definitions/SoVnfCreationRequest"
-            }
-          }
-        ],
-        "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoVnfCreationResponse"
-            }
-          }
-        }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}": {
-      "post": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "VNF activation",
-        "description": "VNF activation",
-        "operationId": "vnf_activate",
-        "consumes": [
-          "application/json"
-        ],
-        "produces": [
-          "application/json"
-        ],
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
-            "in": "path"
-          },
-          {
-            "in": "body",
-            "name": "body",
-            "description": "instantiate request param",
-            "required": true,
-            "schema": {
-              "$ref": "#/definitions/SoVnfActivationRequest"
-            }
-          }
-        ],
-        "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
-          }
-        }
-      },
-      "delete": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "Deletes VNF",
-        "description": "Deletes the VNF. If the VNF was instantiated VNF termination must be called before VNF deletion",
-        "operationId": "delete_vnf",
-        "consumes": [
-          "application/json"
-        ],
-        "produces": [
-          "application/json"
-        ],
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
-            "in": "path"
-          }
-        ],
-        "responses": {
-          "204": {
-            "description": "The VNF was deleted successfully"
-          }
-        }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}/scale": {
-      "post": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "VNF scale",
-        "description": "VNF scale request",
-        "operationId": "vnf_scale",
-        "consumes": [
-          "application/json"
-        ],
-        "produces": [
-          "application/json"
-        ],
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
-            "in": "path"
-          },
-          {
-            "in": "body",
-            "name": "body",
-            "description": "VNF scale request parameters",
-            "required": true,
-            "schema": {
-              "$ref": "#/definitions/SoVnfScaleRequest"
-            }
-          }
-        ],
-        "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
-          }
-        }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}/customOperation": {
-      "post": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "VNF scale",
-        "description": "VNF scale request",
-        "operationId": "vnf_scale",
-        "consumes": [
-          "application/json"
-        ],
-        "produces": [
-          "application/json"
-        ],
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
-            "in": "path"
-          },
-          {
-            "in": "body",
-            "name": "body",
-            "description": "VNF scale request parameters",
-            "required": true,
-            "schema": {
-              "$ref": "#/definitions/SoVnfCustomOperation"
-            }
-          }
-        ],
-        "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
-          }
-        }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}/heal": {
-      "post": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "VNF heal",
-        "description": "VNF heal",
-        "operationId": "vnf_heal",
-        "consumes": [
-          "application/json"
-        ],
-        "produces": [
-          "application/json"
-        ],
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
-            "in": "path"
-          },
-          {
-            "in": "body",
-            "name": "body",
-            "description": "VNF heal request parameters",
-            "required": true,
-            "schema": {
-              "$ref": "#/definitions/SoVnfHealRequest"
-            }
-          }
-        ],
-        "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
-          }
-        }
-      }
-    },
-    "/so/{vnfmId}/vnfs/{vnfId}/terminate": {
-      "post": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "VNF terminate",
-        "description": "VNF terminate",
-        "operationId": "vnf_terminate",
-        "consumes": [
-          "application/json"
-        ],
-        "produces": [
-          "application/json"
-        ],
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNF in A&AI",
-            "name": "vnfId",
-            "in": "path"
-          },
-          {
-            "in": "body",
-            "name": "body",
-            "description": "VNF termination request parameters",
-            "required": true,
-            "schema": {
-              "$ref": "#/definitions/SoVnfTerminationRequest"
-            }
-          }
-        ],
-        "responses": {
-          "201": {
-            "description": "",
-            "schema": {
-              "$ref": "#/definitions/SoJobHandler"
-            }
-          }
-        }
-      }
-    },
-    "/so/{vnfmId}/jobs/{jobId}": {
-      "get": {
-        "tags": [
-          "SO VNFM Adaptor"
-        ],
-        "summary": "Query job status",
-        "description": "Query the job status",
-        "operationId": "get_jobstatus",
-        "parameters": [
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the VNFM in A&AI",
-            "name": "vnfmId",
-            "in": "path"
-          },
-          {
-            "required": true,
-            "type": "string",
-            "description": "The identifier of the job",
-            "name": "jobId",
-            "in": "path"
-          }
-        ],
-        "responses": {
-          "202": {
-            "description": "The details of a job",
-            "schema": {
-              "$ref": "#/definitions/SoJobDetail"
-            }
-          },
-          "404": {
-            "description": "The job is unknown to the VNFM. The VNFM does not keep finished jobs for forever.",
-            "schema": {
-              "$ref": "#/definitions/SoJobDetail"
-            }
-          }
-        }
-      }
-    }
-  },
-  "definitions": {
-    "SoJobHandler": {
-      "type": "object",
-      "properties": {
-        "jobId": {
-          "required": true,
-          "description": "The identifier of the job",
-          "type": "string"
-        }
-      }
-    },
-    "SoJobStatus": {
-      "description": "The status of the job",
-      "type": "string",
-      "enum": [
-        "started",
-        "finished",
-        "failed"
-      ]
-    },
-    "SoJobDetail": {
-      "allOf": [
-        {
-          "$ref": "#/definitions/SoJobHandler"
-        },
-        {
-          "type": "object",
-          "properties": {
-            "status": {
-              "required": true,
-              "description": "The status of the job",
-               "$ref": "#/definitions/SoJobStatus"
-            },
-            "description": {
-              "required": true,
-              "description": "The description of the current state of the job",
-              "type": "string"
-            }
-          }
-        }
-      ]
-    },
-    "SoVnfCreationRequest": {
-      "type": "object",
-      "properties": {
-        "name": {
-          "required": true,
-          "description": "The name of the VNF",
-          "type": "string"
-        },
-        "csarId": {
-          "required": true,
-          "description": "The identifier of the VNF package in SDC",
-          "type": "string"
-        },
-        "nsId": {
-          "required": false,
-          "description": "The identifier of the NS in AAI",
-          "type": "string"
-        },
-        "description": {
-          "required": false,
-          "description": "The description of the VNF",
-          "type": "string"
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoVnfCreationResponse": {
-      "type": "object",
-      "properties": {
-        "vnfId": {
-          "required": true,
-          "description": "The identifier of the created VNF",
-          "type": "string"
-        }
-      }
-    },
-    "SoVduMapping": {
-      "type": "object",
-      "properties": {
-        "vduId": {
-          "required": true,
-          "description": "The identifier of the VDU within the VNF package",
-          "type": "string"
-        },
-        "imageId": {
-          "required": true,
-          "description": "The provider id of the image to be used for the VDU",
-          "type": "string"
-        },
-        "flavourId": {
-          "required": true,
-          "description": "The provider id of the flavour to be used for the VDU",
-          "type": "string"
-        }
-      }
-    },
-    "SoServerMapping": {
-      "type": "object",
-      "description": "Maps a server instance to a VDU and availability zone",
-      "properties": {
-        "vduId": {
-          "required": true,
-          "description": "The identifier of the VDU",
-          "type": "string"
-        },
-        "availabilityZoneId": {
-          "required": false,
-          "description": "The provider id of the availability zone to be used for the server instance",
-          "type": "string"
-        }
-      }
-    },
-    "SoAssignedAddresses": {
-      "type": "object",
-      "properties": {
-        "cpdId" : {
-          "required": true,
-          "description": "The identifier of the connection point descriptor",
-          "type" : "string"
-        },
-        "ipAddress": {
-          "required": true,
-          "description": "The IP address to be used",
-          "type": "string"
-        }
-      }
-    },
-    "SoNetworkMapping": {
-      "type": "object",
-      "properties": {
-        "vldId": {
-          "required": true,
-          "description": "The identifier of the network in the VNF package",
-          "type": "string"
-        },
-        "networkProviderId": {
-          "required": true,
-          "description": "The provider id of the network be used for the given purpose",
-          "type": "string"
-        },
-        "assignedAddresses": {
-          "required": true,
-          "description": "The assigned network addresses",
-          "type" : "array",
-          "items": {
-            "$ref": "#/definitions/SoAssignedAddresses"
-          }
-        }
-      }
-    },
-    "SoVnfActivationRequest": {
-      "type": "object",
-      "properties": {
-        "vimId" : {
-          "required" : true,
-           "type" : "string",
-          "description" : "The identifier of the VIM on which the VNF is to be instantiated"
-        },
-        "serverMappings": {
-          "required": true,
-          "description": "The server mappings",
-          "type" : "array",
-          "items": {
-            "$ref": "#/definitions/SoServerMapping"
-          }
-        },
-        "vduMappings": {
-          "required": true,
-          "description": "The VDU mappings",
-          "type" : "array",
-          "items": {
-            "$ref": "#/definitions/SoVduMapping"
-          }
-        },
-        "networkMappings": {
-          "required": true,
-          "description": "The network mappings",
-          "type" : "array",
-          "items": {
-            "$ref": "#/definitions/SoNetworkMapping"
-          }
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoScaleDirection": {
-      "description": "The direction of the scale",
-      "type": "string",
-      "enum": [
-        "in",
-        "out"
-      ]
-    },
-    "SoVnfScaleRequest": {
-      "type": "object",
-      "properties": {
-        "aspectId": {
-          "type": "string",
-          "description": "The identifier of the scaling aspect in the VNF package"
-        },
-        "steps": {
-          "type": "integer",
-          "description": "The expected absolute scale level"
-        },
-        "direction": {
-          "required": true,
-          "description": "The direction of the scale",
-          "$ref": "#/definitions/SoScaleDirection"
-        },
-        "serverMappings": {
-          "required": true,
-          "description": "The server mappings",
-          "items": {
-            "$ref": "#/definitions/SoServerMapping"
-          }
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoVnfCustomOperation": {
-      "type": "object",
-      "properties": {
-        "operationId": {
-          "required" : true,
-          "type": "string",
-          "description": "The identifier of the custom operation"
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoVnfHealRequest": {
-      "type": "object",
-      "properties": {
-        "vnfcId": {
-          "type": "string",
-          "description": "The identifier of the VNFC to be healed"
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    },
-    "SoTerminationMode": {
-      "description": "The way in which the VNF is terminated",
-      "type": "string",
-      "enum": [
-        "forceful",
-        "graceful"
-      ]
-    },
-    "SoVnfTerminationRequest": {
-      "type": "object",
-      "properties": {
-        "mode" : {
-          "required" : true,
-          "description" : "The VNF termination mode",
-          "$ref": "#/definitions/SoTerminationMode"
-        },
-        "gracefulTerminationTimeoutInMs": {
-          "required" : false,
-          "type": "integer",
-          "description": "The timeout for graceful termination. After the timeout has expired forceful termination is attempted."
-        },
-        "additionalParams": {
-          "description": "Additional VNFM specific parameters",
-          "type": "object",
-          "additionalProperties": true
-        }
-      }
-    }
-  }
-}
diff --git a/nokiav2/generatedapis/src/main/resources/so.vnfm.v2.json b/nokiav2/generatedapis/src/main/resources/so.vnfm.v2.json
new file mode 100644 (file)
index 0000000..248eb92
--- /dev/null
@@ -0,0 +1,616 @@
+{
+  "swagger": "2.0",
+  "info": {
+    "version": "2.0.0",
+    "title": "ONAP SO VNFM Adapter API v2",
+    "description": "Describes the API between SO and the adapter for VNFM",
+    "contact": {
+      "name": "ONAP SO VNFM",
+      "email": "onap-discuss@lists.onap.org",
+      "url": "https://gerrit.onap.org/r/#/admin/projects/vfc/nfvo/lcm"
+    }
+  },
+  "basePath": "/api/v1",
+  "schemes": [
+    "http",
+    "https"
+  ],
+  "consumes": [
+    "application/json"
+  ],
+  "produces": [
+    "application/json"
+  ],
+  "paths": {
+    "/so/v2/ping": {
+      "get": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "Test VNFM driver health",
+        "description": "Test VNFM driver health",
+        "responses": {
+          "204": {
+            "description": "VNFM adapter is healthy"
+          }
+        }
+      }
+    },
+    "/so/v2/vnfs/{vnfIdInAai}/rollback": {
+      "post": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "Rollback VNF update operation",
+        "description": "Rollback VNF update operation",
+        "operationId": "rollback",
+        "consumes": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "Rollback parameters",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2RollbackVnfUpdate"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Operation has been rolled back"
+          }
+        }
+      }
+    },
+    "/so/v2/vnfs/{vnfIdInAai}": {
+      "get": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VNF query",
+        "description": "VNF query",
+        "operationId": "vnf_query",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VNF in A&AI.",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF creation query parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfQueryRequest"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "",
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfQueryResponse"
+            }
+          },
+          "404": {
+            "descriotion": "The VNF does not exist on the VNFM side"
+          }
+        }
+      },
+      "post": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VNF create",
+        "description": "VNF create",
+        "operationId": "vnf_create",
+        "consumes": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF creation query parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfCreateRequest"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "The VNF was created on the VNFM side."
+          },
+          "400": {
+            "description": "The VNF could not be instantiated on the VNFM side. Failure has been treated according to deleteUponFailure parameter"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VNF update",
+        "description": "VNF update",
+        "operationId": "vnf_update",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF update parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfUpdateRequest"
+            }
+          }
+        ],
+        "responses": {
+          "200": {
+            "description": "The VNF update has finished. Success is indicated in the success field.",
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfUpdateResponse"
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VNF delete",
+        "description": "VNF delete",
+        "operationId": "vnf_delete",
+        "consumes": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VNF",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF delete parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfDeleteRequest"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "The VNF was successfully deleted."
+          }
+        }
+      }
+    },
+    "/so/v2/vfmodule/{vnfIdInAai}/{vfModuleId}": {
+      "post": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VF module create",
+        "description": "VF module create",
+        "operationId": "vf_module_create",
+        "consumes": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF creation query parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VfModuleCreateRequest"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "description": "The VF module has been created"
+          }
+        }
+      },
+      "put": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VF module update",
+        "description": "VF module update",
+        "operationId": "vf_module_update",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF creation query parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfUpdateRequest"
+            }
+          }
+        ],
+        "responses": {
+          "201": {
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfUpdateResponse"
+            }
+          }
+        }
+      },
+      "delete": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VF module delete",
+        "description": "VF module delete",
+        "operationId": "vf_module_delete",
+        "consumes": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF delete parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2VnfDeleteRequest"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "The VNF was successfully deleted."
+          }
+        }
+      }
+    },
+    "/so/v2/vfmodule/{vnfIdInAai}/{vfModuleId}/rollback": {
+      "put": {
+        "tags": [
+          "SO VNFM Adaptor V2"
+        ],
+        "summary": "VF module update rollback",
+        "description": "VF module update rollback",
+        "operationId": "vf_module_update rollback",
+        "consumes": [
+          "application/json"
+        ],
+        "produces": [
+          "application/json"
+        ],
+        "parameters": [
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of VNF in A&AI.",
+            "name": "vnfIdInAai",
+            "in": "path"
+          },
+          {
+            "required": true,
+            "type": "string",
+            "description": "The identifier of the VF module in A&AI",
+            "name": "vfModuleId",
+            "in": "path"
+          },
+          {
+            "in": "body",
+            "name": "body",
+            "description": "VNF update rollback parameter",
+            "required": true,
+            "schema": {
+              "$ref": "#/definitions/SoV2RollbackVnfUpdate"
+            }
+          }
+        ],
+        "responses": {
+          "204": {
+            "description": "Operation has been rolled back"
+          }
+        }
+      }
+    }
+  },
+  "definitions": {
+    "SoMsoRequest": {
+      "type": "object",
+      "properties": {
+        "requestId": {
+          "required": true,
+          "description": "The identifier of the request in SO. Used to track requests.",
+          "type": "string"
+        },
+        "serviceInstanceId": {
+          "required": true,
+          "description": "The identifier of the service instance in A&AI.",
+          "type": "string"
+        }
+      }
+    },
+    "SoV2VnfQueryRequest": {
+      "type": "object",
+      "properties": {
+        "msoRequest": {
+          "required": true,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoVnfStatus": {
+      "description": "The status of the VNF",
+      "type": "string",
+      "enum": [
+        "ACTIVE",
+        "FAILED",
+        "NOTFOUND",
+        "UNKNOWN"
+      ]
+    },
+    "SoOutput": {
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      }
+    },
+    "SoInput": {
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      }
+    },
+    "SoV2VnfQueryResponse": {
+      "type": "object",
+      "properties": {
+        "status": {
+          "required": true,
+          "description": "The status of the VNF",
+          "$ref": "#/definitions/SoVnfStatus"
+        }
+      }
+    },
+    "SoV2VnfCreateRequest": {
+      "type": "object",
+      "properties": {
+        "cloudOwner": {
+          "required": true,
+          "type": "string",
+          "description": "The owner of cloud in A&AI."
+        },
+        "regionName": {
+          "required": true,
+          "type": "string",
+          "description": "The regionName of cloud in A&AI."
+        },
+        "tenantId": {
+          "required": true,
+          "type": "string",
+          "description": "The identifier of the tenant."
+        },
+        "name": {
+          "required": true,
+          "type": "string",
+          "description": "The name of the VNF."
+        },
+        "inputs": {
+          "required": false,
+          "description": "The inputs of the VNF.",
+          "$ref": "#/definitions/SoInput"
+        },
+        "failIfExists": {
+          "required": false,
+          "description": "Should the VNF creation fail if the VNF already exists. (defaults to false)",
+          "type": "boolean"
+        },
+        "deleteUponFailure": {
+          "required": false,
+          "description": "Delete VNF in case of failure. (defaults to false)",
+          "type": "boolean"
+        },
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoMsoRollback": {
+      "type": "object",
+      "description": "Generic rollback parameters",
+      "properties": {
+        "deleteIfExists": {
+          "required": true,
+          "description": "Delete the VNF if exists",
+          "type": "boolean"
+        },
+        "vnfIdInAai": {
+          "required": true,
+          "description": "The identifier of the VNF in AAI",
+          "type": "string"
+        },
+        "msoRequest": {
+          "required": true,
+          "description": "The pointer to the original request that triggered the rollback",
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "OriginalVnfProperties": {
+      "type": "object",
+      "additionalProperties": {
+        "type": "string"
+      }
+    },
+    "SoV2RollbackVnfUpdate": {
+      "type": "object",
+      "properties": {
+        "originalVnfProperties": {
+          "required": false,
+          "description": "The original VNF properties before the operation",
+          "$ref": "#/definitions/OriginalVnfProperties"
+        }
+      }
+    },
+    "SoV2VnfUpdateRequest": {
+      "type": "object",
+      "properties": {
+        "inputs": {
+          "required": false,
+          "description": "The inputs of the VNF.",
+          "$ref": "#/definitions/SoInput"
+        },
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoV2VnfUpdateResponse": {
+      "allOf": [
+        {
+          "$ref": "#/definitions/SoV2RollbackVnfUpdate"
+        },
+        {
+          "type": "object",
+          "properties": {
+            "successful": {
+              "required": true,
+              "description": "Is the update successful. The operation can be rolled back regardless of this attribute",
+              "type": "boolean"
+            }
+          }
+        }
+      ]
+    },
+    "SoV2VnfDeleteRequest": {
+      "type": "object",
+      "properties": {
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    },
+    "SoV2VfModuleCreateRequest": {
+      "type": "object",
+      "properties": {
+        "scalingAspectId": {
+          "required": true,
+          "description": "The identifier of the scaling aspect",
+          "type": "string"
+        },
+        "inputs": {
+          "required": false,
+          "description": "The inputs of the VNF.",
+          "$ref": "#/definitions/SoInput"
+        },
+        "failIfExists": {
+          "required": false,
+          "description": "Should the VNF creation fail if the VNF already exists. (defaults to false)",
+          "type": "boolean"
+        },
+        "deleteUponFailure": {
+          "required": false,
+          "description": "Delete VF module in case of failure. (defaults to false)",
+          "type": "boolean"
+        },
+        "msoRequest": {
+          "required": false,
+          "$ref": "#/definitions/SoMsoRequest"
+        }
+      }
+    }
+  }
+}
index ad257e4..4407b88 100644 (file)
   <modelVersion>4.0.0</modelVersion>
   <groupId>org.onap.vfc.nfvo.driver.vnfm.svnfm.nokiav2</groupId>
   <artifactId>vfc-nfvo-driver-vnfm-svnfm-nokiav2</artifactId>
-  <version>1.1.0-SNAPSHOT</version>
+  <version>1.1.1-SNAPSHOT</version>
   <packaging>pom</packaging>
   <name>vfc-nfvo-driver-vnfm-svnfm-nokiav2</name>
   <properties>
     <jacoco.version>0.8.0</jacoco.version>
     <spring.boot.version>2.0.2.RELEASE</spring.boot.version>
+    <driver.version>1.1.1-SNAPSHOT</driver.version>
   </properties>
   <!-- used to test dependency convergence locally
   <build>